Агуулгын хүснэгт:

SmartBin: 8 алхам
SmartBin: 8 алхам

Видео: SmartBin: 8 алхам

Видео: SmartBin: 8 алхам
Видео: Зачем нужен Mi Band 7 - реальный тест 2024, Арваннэгдүгээр
Anonim
SmartBin
SmartBin

Төсөөлөл нь ямар ч шаардлага хангаагүй, ямар ч шаардлага хангаагүй, хэн ч биш, хэн ч гэсэн тодорхой мэдээлэл өгч чадна.

Пара монтар прожекто, зайлшгүй шаардлагатай:

  • NodeMCU
  • Ultrassônico de Distancia мэдрэгч
  • Caixa de papelão
  • Protoboard
  • Кабос
  • Андройд хувилбар

Алхам 1: Conectando O Sensor

Хамгийн гол нь NODEMCU -ийн хэт мэдрэмтгий мэдрэгчийг ашиглах боломжтой. Тохиромжтой, vamos conectar нь порт үүсгэгч, цуурай, мэдрэгч, D4 ба D3 -ийн NodeMCU портууд юм.

// зүү тоог тодорхойлдог #pino_trigger 2 -ийг тодорхойлно // D4

#тодорхойлох pino_echo 0 // D3

Мэдрэгч, мэдрэгч, сургалтын заавар, FilipeFlop -ийг ашиглах боломжтой.

float cmMsec, inMsec;

урт microsec = хэт авианы. timing ();

cmMsec = ultrasonic.convert (microsec, Ultrasonic:: CM);

inMsec = ultrasonic.convert (microsec, Ultrasonic:: IN);

// Exibe informacoes цуваа дэлгэцгүй

Serial.print ("Distancia em cm:");

Цуваа.хэвлэх (cmMsec);

Serial.print (" - Distancia em polegadas:");

Serial.println (inMsec);

String өгөгдөл = String (cmMsec);

Serial.println (өгөгдөл);

Алхам 2: Монтандо ба Ликсейра

Agora, vamos montar a lixeira inteligente. Precisaremos conectar эсвэл мэдрэгч хэт ягаан туяаны хэт ягаан туяаны мэдрэгч. Жишээлбэл, үүнийг ашиглах боломжтой болно. Энэ тохиолдолд, албан ёсны мэдээлэл, үнэт зүйлсийн талаар мэдээлэл өгөх хэрэгтэй. 26, 3 см -ийн зайтай. Энэ нь маш чухал юм.

Энэ нь хэт мэдрэгчийн хувьд хэт мэдрэгчийн хувьд маш чухал юм.

// Simulando 4 lixeiras

урт lixeiraID;

void loop () {

lixeiraID = санамсаргүй (1, 5);

}

Алхам 3: Para a Nuvem -ийг байршуулна уу

Агра, хамгийн сайн ойлголттой болно. ThingSpeak, танил талууд хоорондоо танилцана уу. Нэвтрүүлгийн суваг, суваг, 4 параметро, дахин лавлах, эсвэл том хэмжээний суваг.

Энэ нь ThingSpeak програмыг ашиглах боломжтой бөгөөд API -ийн сувгийг ашиглах боломжтой болно. Siga os passos descritos ямар ч албан ёсны сайт байхгүй.

Тайлбарыг буцааж англи (Америкийн Нэгдсэн Улс) руу орчуулах Орчуулах Deep volta à aplicação, vamos utilizar a biblioteca ESP8266WiFi.h is a part of conectão com o ThingSpeak, and transferir os os.

Эхний ээлжинд, энэ асуудлыг шийдэхийн тулд (тодорхойлолт хийх, тохируулах нэвтрүүлэх , тодорхойлолт эсвэл тодорхой мэдээлэл авах).

хүчингүй холболтWifi () {

Serial.print ("Холбогдох"+ *ssid);

WiFi.begin (ssid, pass);

байхад (WiFi.status ()! = WL_CONNECTED) {

саатал (500);

Serial.print (".");

}

Serial.println ("");

Serial.print ("Conectado na rede");

Serial.println (ssid);

Serial.print ("IP:");

Serial.println (WiFi.localIP ());

}

Тохиргоо хийх, тохируулах, тохируулах боломжтой.

хүчингүй тохиргоо () {

Цуваа эхлэх (9600);

Serial.println ("Lendo dados do sensor …");

// Wi-Fi эсвэл Conectando

connectWifi ();

}

ThingSpeak, HTTP програмыг ашиглахын тулд та API -ийг ашиглах боломжтой болно.

хүчингүй sendDataTS (float cmMsec, урт id) {

if (client.connect (сервер, 80)) {

Serial.println ("Enviando dados para o ThingSpeak");

String postStr = apiKey;

postStr += "& талбар";

postStr += id;

postStr += "=";

postStr += String (cmMsec);

postStr += "\ r / n / r / n";

Serial.println (postStr);

client.print ("POST /update HTTP /1.1 / n");

client.print ("Хост: api.thingspeak.com / n");

client.print ("Холболт: хаах / n");

client.print ("X-THINGSPEAKAPIKEY:" + apiKey + "\ n");

client.print ("Агуулгын төрөл: application/x-www-form-urlencoded / n");

client.print ("Агуулга-Урт:");

client.print (postStr.length ());

client.print ("\ n / n");

client.print (postStr);

саатал (1000);

}

client.stop ();

}

Параметро нь хэт мэдрэгчтэй ultrasônico харгалзана. Охидын параметро é o ID da lixeira que foi lida (que foi gerado randomicamente, um número de 1 a 4).

O ID da lixeira нь танигдахын тулд чанарын шаардлага хангахуйц үүрэг гүйцэтгэдэг.

Алхам 4: Recuperando Dados ThingSpeak хий

O ThingSpeak -ийн зөвшөөрөгдөх хугацаа нь JSON суваг, сүлжээний үйлчилгээ юм. Хоол тэжээлийн сувгийн суваг өөр өөр байдлаар тайлбарлахад:

www.mathworks.com/help/thingspeak/get-a-ch…

Төгсгөлд нь, хамгийн сайн тохиргоог хийх болно. Дараах URL хаягийг оруулна уу:

api.thingspeak.com/channels/CHANNEL_ID/fields/FIELD_NUMBER/last.json?api_key=API_KEY&status=true

Тайлбарыг буцааж англи (Америкийн Нэгдсэн Улс) руу орчуулах Орчуулах Cada campo está descrito no link information previoamente. Энэ нь чухал ач холбогдолтой:

  • CHANNEL_ID: сувгийн суваг
  • FIELD_NUMBER: Кампу хийх үү
  • API_KEY: API сувгийн суваг

Андройд болон ThingSpeak -ийг ашиглахын тулд та URL хаягийг ашиглах боломжтой болно.

Алхам 5: Криандо ба Андройд аппликейшн

Андройд студи байхгүй, Андройд дээр шинэ хувилбарыг үзээрэй. Та AndroidManifest -ийг ашиглахын тулд тохиргоог хийх хэрэгтэй болно.

Google газрын зураг ашиглах, Google -ийг ашиглах шаардлагатай болно. Ямар ч холбоос байхгүй байна.

Тэмдэглэл, тохиргоог тохируулаарай.

Google Газрын зураг дээр суурилсан API-ийн API түлхүүрийг мөрийн эх сурвалж гэж тодорхойлдог.

("Res/values/google_maps_api.xml" файлыг үзнэ үү).

API түлхүүр нь APK -д гарын үсэг зурахад ашигладаг шифрлэлтийн түлхүүртэй холбогдсон болохыг анхаарна уу. Шифрлэх түлхүүр бүрийн хувьд танд өөр API түлхүүр хэрэгтэй бөгөөд үүнд APK -ийг нийтлэхэд гарын үсэг зурахад ашигладаг түлхүүрийг оруулна уу. Та дибаг хийх болон гаргах зорилтуудын түлхүүрүүдийг src/debug/ба src/release/дээр тодорхойлж болно.

<мета өгөгдөл

android: name = "com.google.android.geo. API_KEY"

android: value = "@string /google_maps_key" />

AndroidManifest програмыг өөрөө тохируулах боломжтой.

n

Алхам 6: Recuperando O Feed No Android

Ямар ч Android, MainActivity -ийн үндсэн хуулбарыг ашиглан ThingSpeak -ийг ашиглахын тулд 4 хувилбарыг сонгоно уу:

хувийн String url_a = "https://api.thingspeak.com/channels/429823/fields/1/last.json?api_key="+API_THINGSPEAK_KEY+"&status=true"; хувийн String url_b = "https://api.thingspeak.com/channels/429823/fields/2/last.json?api_key="+API_THINGSPEAK_KEY+"&status=true"; хувийн String url_c = "https://api.thingspeak.com/channels/429823/fields/3/last.json?api_key="+API_THINGSPEAK_KEY+"&status=true"; хувийн String url_d = "https://api.thingspeak.com/channels/429823/fields/4/last.json?api_key="+API_THINGSPEAK_KEY+"&status=true";

Энэ нь Android програм хангамж, JSONObject -ийг ашиглахад маш чухал үүрэг гүйцэтгэдэг. Хязгаарлагдмал URL, URL -ууд:

JSONObject хариуLixeiraA; JSONObject хариуLixeiraB; JSONObject хариуLixeiraC; JSONObject хариуLixeiraD;

Хяналтын комментийг url гэж нэрлэвэл, туслалцаа авах боломжтой, HttpJsonParser. Хариулт нь URL -тай холбоотой бөгөөд энэ нь JSON -ийг ашиглах боломжтой болно.

нийтийн JSONObject makeHttpRequest (String url, String арга, Газрын зургийн параметрүүд) {

оролдох {

Uri. Builder builder = шинэ Uri. Builder (); URL urlObj; String encodedParams = ""; if (params! = null) {for (Map. Entry оруулга: params.entrySet ()) {builder.appendQueryParameter (entry.getKey (), entry.getValue ()); }} if (builder.build (). getEncodedQuery ()! = null) {encodedParams = builder.build (). getEncodedQuery ();

}

if ("GET". тэнцүү (арга)) {url = url + "?" + кодлогдсон Парам; urlObj = шинэ URL (url); urlConnection = (HttpURLConnection) urlObj.openConnection (); urlConnection.setRequestMethod (арга);

} өөр {

urlObj = шинэ URL (url); urlConnection = (HttpURLConnection) urlObj.openConnection (); urlConnection.setRequestMethod (арга); urlConnection.setRequestProperty ("Агуулгын төрөл", "application/x-www-form-urlencoded"); urlConnection.setRequestProperty ("Агуулга-Урт", String.valueOf (encodedParams.getBytes (). урт)); urlConnection.getOutputStream (). бичих (encodedParams.getBytes ()); } // Серверт холбогдох urlConnection.connect (); // Хариултыг уншина уу = urlConnection.getInputStream (); BufferedReader уншигч = шинэ BufferedReader (шинэ InputStreamReader (is)); StringBuilder sb = шинэ StringBuilder (); Мөрний шугам;

// Хариултыг задлан шинжлэх

while ((мөр = уншигч.readLine ())! = null) {sb.append (мөр + "\ n"); } is.close (); json = sb.toString (); // Хариултыг JSON Object jObj = new JSONObject (json) болгон хөрвүүлэх;

} барих (Дэмжигдээгүй EncodingException e) {

e.printStackTrace (); } барих (ProtocolException e) {e.printStackTrace (); } барих (IOException e) {e.printStackTrace (); } catch (JSONException e) {Log.e ("JSON Parser", "Өгөгдлийг задлахад алдаа гарсан" + e.toString ()); } catch (Exception e) {Log.e ("Exception", "Өгөгдлийг задлахад алдаа гарсан" + e.toString ()); }

// JSON объектыг буцаана

буцах jObj;

}

}

Сургалтын удирдагч, удирдагч, вэбсайт, холбоо барих хаягууд.

@Orride хамгаалагдсан String doInBackground (String… params) {HttpJsonParser jsonParser = шинэ HttpJsonParser ();

answerLixeiraA = jsonParser.makeHttpRequest (url_a, "GET", null);

answerLixeiraB = jsonParser.makeHttpRequest (url_b, "GET", null); answerLixeiraC = jsonParser.makeHttpRequest (url_c, "GET", null); responseLixeiraD = jsonParser.makeHttpRequest (url_d, "GET", null);

буцах null;}

InPackExecrando эсвэл Android -ийн дамжуулалтыг тохируулахын тулд onPostExecute програмыг ажиллуулна уу. Neste método, vamos criar os objetos Lixeira, ThingSpeak -ийн алдартай com os dados recuperados:

onPostExecute (String үр дүн) {pDialog.dismiss (); runOnUiThread (шинэ Runnable () {public void run () {

// ListView listView = (ListView) findViewById (R.id.feedList);

MainView харах (View) findViewById (R.id.activity_main); if (амжилт == 1) {оролдох {// Cria feedDetail para cada lixeira Lixeira feedDetails1 = шинэ Lixeira (); Lixeira feedDetails2 = шинэ Lixeira (); Lixeira feedDetails3 = шинэ Lixeira (); Lixeira feedDetails4 = шинэ Lixeira ();

feedDetails1.setId ('A');

feedDetails1.setPesoLixo (Double.parseDouble (answerLixeiraA.getString (KEY_FIELD1))))); feedDetails1.setVolumeLixo (Double.parseDouble (answerLixeiraA.getString (KEY_FIELD1)))));

feedDetails2.setId ('B');

feedDetails2.setPesoLixo (Double.parseDouble (responseLixeiraB.getString (KEY_FIELD2))))); feedDetails2.setVolumeLixo (Double.parseDouble (answerLixeiraB.getString (KEY_FIELD2))));

feedDetails3.setId ('C');

feedDetails3.setPesoLixo (Double.parseDouble (answerLixeiraC.getString (KEY_FIELD3))))); feedDetails3.setVolumeLixo (Double.parseDouble (responseLixeiraC.getString (KEY_FIELD3)))));

feedDetails4.setId ('D');

feedDetails4.setPesoLixo (Double.parseDouble (хариуLixeiraD.getString (KEY_FIELD4)))); feedDetails4.setVolumeLixo (Double.parseDouble (answerLixeiraD.getString (KEY_FIELD4))));

feedList.add (feedDetails1);

feedList.add (feedDetails2); feedList.add (feedDetails3); feedList.add (feedDetails4);

// Calcos dados das lixeiras

SmartBinService тооцоолуур = шинэ SmartBinService (); тооцоолуур.montaListaLixeiras (feedList);

// Recupera бүрэлдэхүүн хэсгүүд

TextView createDate = (TextView) mainView.findViewById (R.id.date); ListView listaDeLixeiras = (ListView) findViewById (R.id.lista); adapter.addAll (feedList);

// Мэдээлэл

CurrentTime огноо = Calendar.getInstance (). GetTime (); SimpleDateFormat simpleDate = шинэ SimpleDateFormat ("dd/MM/yyyy"); String currentDate = simpleDate.format (currentTime); createDate.setText (KEY_DATE + currentDate + ""); listaDeLixeiras.setAdapter (адаптер);

} барих (JSONException e) {

e.printStackTrace (); }

} өөр {

Toast.makeText (MainActivity.this, "Өгөгдлийг ачаалах явцад зарим алдаа гарлаа", Toast. LENGTH_LONG).show ();

}

} }); }

Агра, албан ёсны мэдээлэл, албан ёсны жагсаалтууд дээр үндэслэсэн болно.

Алхам 7: Mostrando No Mapa

Mostrando No Mapa
Mostrando No Mapa

Хариуцлага тооцохгүй бол үндсэн мэдээлэл, албан ёсны мэдээлэл байхгүй байна.

/ ** Хэрэглэгч Mapa товчлуурыг дарахад дууддаг*/ public void openMaps (View view) {Зорилго = шинэ зорилго (энэ, LixeiraMapsActivity.class);

// Passa a lista de lixeiras

Багцалсан багц = шинэ багц (); bundle.putParcelableArrayList ("lixeiras", feedList); aim.putExtras (багц);

startActivity (зорилго);

}

Гүйцэтгэх үүрэг гүйцэтгэдэг хүн байхгүй:

  1. marcar a posição atual do caminha de lixo
  2. marcar os pontos газрын зураг дээр сурвалжлага хийдэг
  3. traçar a rota entre os pontos

Google -ийн удирдамжийг ашиглахын тулд та API -г ашиглах боломжтой болно. Google газрын зургийн Android API V2 дээрх Google -ийн чиглэлийг ашиглан хоёр байршлын хоорондох маршрутын чиглэлийг зурах.

Primeiro, vamos criar localidades para cada um dos pontos que desejamos marcar:

// Байршил

хувийн LatLng гүйдэл;

хувийн LatLng lixeiraA; хувийн LatLng lixeiraB; хувийн LatLng lixeiraC; хувийн LatLng lixeiraD;.

Хариуд нь ямар ч газрын зураг, газрын зураг дээр:

private void checkLocationandAddToMap () {// Хэрэглэгч зөвшөөрсөн эсэхийг шалгах (ActivityCompat.checkSelfPermission (энэ, android. Manifest.permission. ACCESS_FINE_LOCATION)! = PackageManager. PERMISSION_GRANTED && ActivityCompat.checkSelfPerm ACCESS_COARSE_LOCATION)! = PackageManager. PERMISSION_GRANTED) {// Байршлын зөвшөөрлийг хүсч байна ActivityCompat.requestPermissions (энэ, шинэ String {android. Manifest.permission. ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE); буцах; }

// Fus ашиглан сүүлийн мэдэгдэж буй байршлыг татаж байна

Байршлын байршил = LocationServices. FusedLocationApi.getLastLocation (googleApiClient);

// MarkerOptions нь шинэ Marker үүсгэхэд ашиглагддаг. MarkerOptions -ийн тусламжтайгаар та байршил, гарчиг зэргийг зааж өгч болно.

this.current = шинэ LatLng (location.getLatitude (), location.getLongitude ()); MarkerOptions markerOptions = шинэ MarkerOptions (). Байрлал (одоогийн). Гарчиг ("Posicaão atual");

// Үүсгэсэн тэмдэглэгээг газрын зураг дээр нэмж, камерыг байрлалд шилжүүлнэ

markerOptions.icon (BitmapDescriptorFactory.defaultMarker (BitmapDescriptorFactory. HUE_GREEN)); System.out.println ("+++++++++++++++++++++++++++"); mMap.addMarker (markerOptions);

// Камерыг 15 томруулалтаар шууд байрлал руу зөөнө үү.

mMap.moveCamera (CameraUpdateFactory.newLatLngZoom (одоогийн, 15));

// Томруулж, камерыг хөдөлгөөнд оруулна уу.

mMap.animateCamera (CameraUpdateFactory.zoomTo (14), 2000, null);

}

Em seguida, para cada lixeira, foram criados métodos similares ao abaixo:

private void addBinALocation () {// Хэрэглэгч зөвшөөрөл өгсөн эсэхийг шалгах (ActivityCompat.checkSelfPermission (энэ, android. Manifest.permission. ACCESS_FINE_LOCATION)! = PackageManager. PERMISSION_GRANTED && ActivityCompat.checkSperPermission (энэ, ACCESS_COARSE_LOCATION)! = PackageManager. PERMISSION_GRANTED) {// Байршлын зөвшөөрлийг хүсч байна ActivityCompat.requestPermissions (энэ, шинэ String {android. Manifest.permission. ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE); буцах; }

// Praça da Estação

давхар өргөрөг = -19.9159578; давхар уртраг = -43.9387856; this.lixeiraA = шинэ LatLng (өргөрөг, уртраг);

MarkerOptions markerOptions = шинэ MarkerOptions (). Байрлал (lixeiraA). Гарчиг ("Lixeira A");

markerOptions.icon (BitmapDescriptorFactory.defaultMarker (BitmapDescriptorFactory. HUE_RED)); mMap.addMarker (markerOptions); }

Өргөрөг ба уртрагийн хувьд cada lixeira foram recuperadas através do próprio Google газрын зураг, e deixadas fixas no código. Idealmente, estes vales ficariam salvos em um banco de dados (жишээ нь Firebase гэх мэт). Төсөөлж болно!

Тайлбарыг буцааж англи (Америкийн Нэгдсэн Улс) руу орчуулах Орчуулах O último passo agora é traçar as rotas entre os pontos. Төсөөлөл, чухал ач холбогдолтой, хамгийн чухал зүйл бол замын цэгүүд юм!

Фэйсбүүк хийх нь маш чухал юм:

хувийн String getDirectionsUrl (LatLng гарал үүсэл, LatLng dest, Замын цэгүүдийн жагсаалт) {

// Маршрутын гарал үүсэл

String str_origin = "үүсэл ="+гарал үүсэл. "+", "+Гарал үүсэл.

// Маршрутын чиглэл

String str_dest = "destination ="+dest.latitude+","+dest.longitude;

// Маршрутын дагуух цэгүүд

//waypoints=optimize:true|-19.9227365, -43.9473546 | -19.9168006, -43.9361124 String waypoints = "waypoints = optimize: true"; for (LatLng point: waypointsList) {замын цэг += "|" + цэг.хөндлөн + "," + цэгийн.урам; }

// Мэдрэгчийг идэвхжүүлсэн

String sensor = "мэдрэгч = худал";

// Вэб үйлчилгээний параметрүүдийг бий болгох

String параметрүүд = str_origin+"&"+str_dest+"&"+мэдрэгч+"&"+замын цэгүүд;

// Гаралтын формат

String гаралт = "json";

// Вэб үйлчилгээний URL хаягийг бий болгох

String url = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters; System.out.println ("++++++++++++++"+url);

буцах url;

}

E, por fim, juntando tudo no método asosiy da classe, onMapReady:

OnMapReady (GoogleMap googleMap) {mMap = googleMap;

checkLocationandAddToMap ();

if (lixeirasList.get (0).getVolumeLixo ()> Lixeira. MIN_VOLUME_GARBAGE

|| lixeirasList.get (0).getPesoLixo ()-10> Lixeira. MIN_SIZE_GARBAGE) {addBinALocation (); } if (lixeirasList.get (1).getVolumeLixo ()> Lixeira. MIN_VOLUME_GARBAGE || lixeirasList.get (1).getPesoLixo ()> Lixeira. MIN_SIZE_GARBAGE) {addBinBLocation (); } if (lixeirasList.get (2).getVolumeLixo ()> Lixeira. MIN_VOLUME_GARBAGE || lixeirasList.get (2).getPesoLixo ()> Lixeira. MIN_SIZE_GARBAGE) {addBinCLocation (); } if (lixeirasList.get (3).getVolumeLixo ()> Lixeira. MIN_VOLUME_GARBAGE || lixeirasList.get (3).getPesoLixo ()> Lixeira. MIN_SIZE_GARBAGE) {addBinDLocation (); }

// Маршрут зур

// Google Directions API руу URL авах

Жагсаалтын цэгүүд = шинэ ArrayList (); оноо нэмнэ (lixeiraB); оноо нэмнэ (lixeiraC); оноо нэмнэ (lixeiraD);

String url = getDirectionsUrl (одоогийн, lixeiraA, оноо);

DownloadTask downloadTask = шинэ DownloadTask (); // Google Directions API downloadTask.execute (url) -аас json өгөгдлийг татаж эхлэх; }

Aqua passamos apenas pelos pontos principais. Зөвлөмжийг боловсруулж дуусгах болно.

Алхам 8: Дүгнэлт

IoT, mostrando uma das várias opções de conectar dispositivos através da nuvem, efetuar tomada de decisões sem interferência humana direta. Нэмэлт тайлбарлахдаа, Android -ийг ашиглах боломжтой.

Зөвлөмж болгож буй: