Mündəricat:

SmartBin: 8 addım
SmartBin: 8 addım

Video: SmartBin: 8 addım

Video: SmartBin: 8 addım
Video: Amsa brochure on separate waste collection Opuscolo Amsa sulla raccolta differenziata! amsa #8 2024, Noyabr
Anonim
SmartBin
SmartBin

Layihələr sistematik şəkildə qurulacaqsa, heç bir keyfiyyətə malik deyilsiniz, heç kimə lazım deyil, həm də bir neçə dəfə təqdim olunur, həm də bütün məlumatları əldə edə bilərsiniz.

Məşhur layihə, lazım olan:

  • NodeMCU
  • Ultrassônico de Distancia sensoru
  • Caixa de papelão
  • Protoboard
  • Cabos
  • İstifadəçi Android üçün

Addım 1: Conectando O Sensoru

Başlanğıcda, NODEMCU və ya ultrasəs sensoru ilə əlaqə qurun. NodeMCU üçün D4 və D3 port portlarının tetikleyicisi və yankı sensoru olaraq, vamos conectar:

// pin nömrələrini təyin edir #pino_trigger 2 təyin edin // D4

#define pino_echo 0 // D3

Sensorlar, təlimatlar və ya FilipeFlop ilə əlaqəli təlimatlar və ya təlimatlardan istifadə edə bilərsiniz.

float cmMsec, inMsec;

uzun mikrosaniya = ultrasəsli. zamanlama ();

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

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

// Exibe informacoes serial monitoru yoxdur

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

Serial. çap (cmMsec);

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

Serial.println (inMsec);

String məlumatları = String (cmMsec);

Serial.println (məlumatlar);

Addım 2: Montando a Lixeira

Agora, vamos montar və lixeira inteligente. Ultrasonik sensorlar heç bir "teto" da yoxdur. Məsələn, istifadə oluna bilər. Müvafiq olaraq, rəsmi məlumatların təhlili, qiymətli və ya dəyərli ola bilər. Ölçüsü 26, 3 sm. Əlbəttə ki, hər şeydən əvvəl hər şeyi nəzərə almaq lazımdır.

Simulyasiya, ultrasəs sensoru və ya fərqli sensorlar, bir -birindən fərqli olaraq, hər hansı bir məsafəni ölçmək üçün istifadə edilə bilər.

// Simulando 4 lixeyra

uzun lixeiraID;

boşluq döngəsi () {

lixeiraID = təsadüfi (1, 5);

}

Addım 3: Nuvem yükləyin

Əlavə olaraq, nuvemləri ən yaxşı şəkildə başa düşmək olar. ThingSpeak və ya tanış olmaq üçün tanış olun. Başlanğıc, yeni kanallar, 4 parametrlər və ya həcmdən asılı olmayaraq bütün kanalları açmaq lazımdır.

ThingSpeak və ya API -dən istifadə etməklə kanalları bağlaya bilərsiniz. Heç bir rəsmi sayt yoxdur.

Bu proqramlar ThingsSpeak və ESP8266WiFi.h biblioteca -dan istifadə edərək, ThingSpeak və ya digər proqramlar vasitəsilə istifadə edilə bilər.

Başlanğıc funksiyasını yerinə yetirmək üçün istifadə edin (əvvəlcədən yazılmış məlumatların dəyişdirilməsi, ötürülməsi , təyin edilməsi və ya təsdiqlənməsi).

etibarsız connectWifi () {

Serial.print ("Qoşulma"+ *ssid);

WiFi.begin (ssid, pass);

isə (WiFi.status ()! = WL_CONNECTED) {

gecikmə (500);

Serial.print (".");

}

Serial.println ("");

Serial.print ("Conectado na rede");

Serial.println (ssid);

Serial.print ("IP:");

Serial.println (WiFi.localIP ());

}

Quraşdırma, yoxlama və yoxlama əməliyyatlarını davam etdirin.

boş quraşdırma () {

Serial.begin (9600);

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

// Conectando və ya Wi-Fi

əlaqəWifi ();

}

ThingSpeak və ya HTTP ilə əlaqəli məlumatların qorunması, API və ya digər parametrlərin istifadəsi.

void sendDataTS (float cmMsec, uzun id) {

if (client.connect (server, 80)) {

Serial.println ("ThingSpeak üçün" Enviando dados ");

String postStr = apiKey;

postStr += "və sahə";

postStr += id;

postStr += "=";

postStr += String (cmMsec);

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

Serial.println (postStr);

client.print ("POST /yeniləmə HTTP /1.1 / n");

client.print ("Host: api.thingspeak.com / n");

client.print ("Bağlantı: yaxın / n");

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

client.print ("Content-Type: application/x-www-form-urlencoded / n");

client.print ("Məzmun-Uzunluq:");

client.print (postStr.length ());

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

client.print (postStr);

gecikmə (1000);

}

client.stop ();

}

Başlanğıc parametrləri, ultrasonik sensorlar üçün ən yüksək standartlara cavab verir. Şəxsiyyət vəsiqəsi kimə aiddirsə (təsadüfən, 1 ilə 4 arasında).

Şəxsiyyət vəsiqəsi, şəxsiyyət vəsiqəsi ilə yükləyə və ya yükləyə bilərsiniz.

Addım 4: Recuperando Dados ThingSpeak edin

O ThingSpeak proqramı, JSON -un bütün xidmətlərindən istifadə etməklə ən yaxşı nəticəni verir. Fərqli olaraq, kanalın necə qurulacağını müəyyən etmək üçün:

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

Neste, bu proqramlar üçün ən yaxşı seçimdir. E -poçt üçün URL ünvanını seçin:

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

Məlumat üçün heç bir əlaqə yoxdur. Layihə üçün vacib olan şeylər:

  • CHANNEL_ID: kanalın açılması
  • FIELD_NUMBER: kampusa nə qədər vaxt lazımdır
  • API_KEY: API kanalını dəyişdirin

Android -dən istifadə etmək üçün bir URL və ThingSpeak -dən istifadə edin.

Addım 5: Criando və Android tətbiqləri

Android Studio yoxdur, Android üçün yeni bir layihə var. Bu funksiyanı yerinə yetirmək üçün AndroidManifest -dən istifadə etmək üçün konfiqurasiya edin.

Google Xəritə və ya Google Xəritələr üçün lazım olan bütün məlumatları əldə edin. Heç bir əlaqəsi yoxdur.

Bir şey etmək lazım deyilsə, konfiqurasiya edin.

Google Xəritə əsaslı API-lər üçün API açarı bir simli qaynaq olaraq təyin olunur.

("Res/values/google_maps_api.xml" faylına baxın).

API açarının APK imzalamaq üçün istifadə olunan şifrələmə açarı ilə əlaqəli olduğunu unutmayın. Çap etmək üçün APK -ı imzalamaq üçün istifadə olunan buraxılış açarı da daxil olmaqla hər bir şifrələmə açarı üçün fərqli bir API açarına ehtiyacınız var. Src/debug/və src/release/-də ayıklama və buraxma hədəflərinin açarlarını təyin edə bilərsiniz.

<meta məlumat

android: adı = "com.google.android.geo. API_KEY"

android: dəyər = "@string /google_maps_key" />

AndroidManifest və ya Android üçün bir konfiqurasiya tamamlandı.

n

Addım 6: Recuperando O Feed No Android

Heç bir Android, MainActivity, ThingSpeak proqramları ilə bağlı 4 fərqli məlumat yoxdur:

xüsusi String url_a = "https://api.thingspeak.com/channels/429823/fields/1/last.json?api_key="+API_THINGSPEAK_KEY+"&status=true"; xüsusi String url_b = "https://api.thingspeak.com/channels/429823/fields/2/last.json?api_key="+API_THINGSPEAK_KEY+"&status=true"; xüsusi String url_c = "https://api.thingspeak.com/channels/429823/fields/3/last.json?api_key="+API_THINGSPEAK_KEY+"&status=true"; xüsusi String url_d = "https://api.thingspeak.com/channels/429823/fields/4/last.json?api_key="+API_THINGSPEAK_KEY+"&status=true";

Bu proqramlar, Android əməliyyat sistemlərində və JSONObject -də istifadə edilə bilər. Məlumat üçün, URL -lərin siyahısı:

JSONObject cavabLixeiraA; JSONObject cavabLixeiraB; JSONObject cavabLixeiraC; JSONObject cavabLixeiraD;

URL -lərlə əlaqə qurduqdan sonra, köməkçi proqramlar HttpJsonParser -dən istifadə edə bilərsiniz. Əlaqə URL -lər, cavablar və cavablar, JSON -un quraşdırılması ilə əlaqədardır.

ictimai JSONObject makeHttpRequest (String url, String metodu, Map params) {

sınayın {

Uri. Builder qurucusu = yeni Uri. Builder (); URL urlObj; String encodedParams = ""; if (params! = null) {for (Map. Entry girişi: params.entrySet ()) {builder.appendQueryParameter (entry.getKey (), entry.getValue ()); }} if (builder.build (). getEncodedQuery ()! = null) {encodedParams = builder.build (). getEncodedQuery ();

}

if ("GET". bərabərdir (metod)) {url = url + "?" + kodlaşdırılmış Paramramlar; urlObj = yeni URL (url); urlConnection = (HttpURLConnection) urlObj.openConnection (); urlConnection.setRequestMethod (metod);

} başqa {

urlObj = yeni URL (url); urlConnection = (HttpURLConnection) urlObj.openConnection (); urlConnection.setRequestMethod (metod); urlConnection.setRequestProperty ("Content-Type", "application/x-www-form-urlencoded"); urlConnection.setRequestProperty ("Məzmun-Uzunluq", String.valueOf (encodedParams.getBytes (). uzunluq)); urlConnection.getOutputStream (). yazmaq (encodedParams.getBytes ()); } // urlConnection.connect () serverinə qoşulun; // Cavabı oxuyun = urlConnection.getInputStream (); BufferedReader oxucu = yeni BufferedReader (yeni InputStreamReader (is)); StringBuilder sb = yeni StringBuilder (); String xətti;

// Cavabı təhlil edin

while ((line = reader.readLine ())! = null) {sb.append (line + "\ n"); } is.close (); json = sb.toString (); // Cavabı JSON Obyektinə çevirin jObj = yeni JSONObject (json);

} tutmaq (Dəstəklənməyən EncodingException e) {

e.printStackTrace (); } tutmaq (ProtocolException e) {e.printStackTrace (); } tutmaq (IOException e) {e.printStackTrace (); } catch (JSONException e) {Log.e ("JSON Parser", "Veriləri təhlil edərkən xəta" + e.toString ()); } tutmaq (İstisna e) {Log.e ("İstisna", "Veriləri təhlil edərkən xəta" + e.toString ()); }

// JSON Obyektini qaytarın

qayıt jObj;

}

}

Müəssisə müdiri, bütün sahələr və əlaqələr, həm də bir yerdə, həm də bir yerdə İnBackground -da məlumat əldə etmək imkanı verir.

@Orride qorunan String doInBackground (String… params) {HttpJsonParser jsonParser = yeni HttpJsonParser ();

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

cavabLixeiraB = jsonParser.makeHttpRequest (url_b, "GET", null); cavabLixeiraC = jsonParser.makeHttpRequest (url_c, "GET", null); cavabLixeiraD = jsonParser.makeHttpRequest (url_d, "GET", null);

qaytar sıfır;}

Daxili məlumatların arxa plana daxil edilməsi, Android -in aparılması və ya göndərilməsinin OnPostExecute -də yoxlanılması. Neste método, vixos criar os objetos Lixeira, ThingSpeak -in populyar tətbiqləri:

onPostExecute (String nəticəsində) qorunan boşluq {pDialog.dismiss (); runOnUiThread (yeni Runnable () {public void run () {

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

Bax mainView = (Bax) findViewById (R.id.activity_main); if (müvəffəqiyyət == 1) {cəhd edin {// Cria feedDetail para lixeira Lixeira feedDetails1 = yeni Lixeira (); Lixeira feedDetails2 = yeni Lixeira (); Lixeira feedDetails3 = yeni Lixeira (); Lixeira feedDetails4 = yeni Lixeira ();

feedDetails1.setId ('A');

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

feedDetails2.setId ('B');

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

feedDetails3.setId ('C');

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

feedDetails4.setId ('D');

feedDetails4.setPesoLixo (Double.parseDouble (answerLixeiraD.getString (KEY_FIELD4)))); feedDetails4.setVolumeLixo (Double.parseDouble (responseLixeiraD.getString (KEY_FIELD4))));

feedList.add (feedDetails1);

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

// Hesablamalar dados das lixeiras

SmartBinService kalkulyatoru = yeni SmartBinService (); calculator.montaListaLixeiras (feedList);

// Recupera komponentləri

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

// Məlumat

Tarix currentTime = Calendar.getInstance (). GetTime (); SimpleDateFormat simpleDate = yeni SimpleDateFormat ("gg/aa/yyyy"); String currentDate = simpleDate.format (currentTime); createDate.setText (KEY_DATE + currentDate + ""); listaDeLixeiras.setAdapter (adapter);

} tutmaq (JSONException e) {

e.printStackTrace (); }

} başqa {

Toast.makeText (MainActivity.this, "Məlumat yüklənərkən bəzi səhvlər baş verdi", Toast. LENGTH_LONG).show ();

}

} }); }

Müvafiq olaraq, heç bir rəsmi məlumat yoxdur, bu siyahıdan ən çox istifadə edilə bilər.

Addım 7: Mostrando No Mapa

Mostrando No Mapa
Mostrando No Mapa

Müvafiq olaraq, hər hansı bir məlumat əldə etmək mümkün olmadıqda, hər hansı bir məlumat əldə edə bilərsiniz.

/ ** İstifadəçi Mapa düyməsinə toxunduqda çağırılır*/ public void openMaps (View view) {Niyyət niyyəti = yeni niyyət (bu, LixeiraMapsActivity.class);

// Keçmiş siyahı

Paket paketi = yeni Paket (); bundle.putParcelableArrayList ("lixeiras", feedList); aim.putExtras (paket);

startActivity (niyyət);

}

Xəritədə heç bir şey yoxdur:

  1. marin və ya lixo edin
  2. marc os pontos heç bir xəritədə müxbir yoxdur
  3. tracar a rota entre os pontos

Bu proqram Google API -dən istifadə etməklə icra olunur. Rotas, foram seguidos os passos do tutorial kimi Google Map Android API V2 -də Google İstiqamətlərindən istifadə edərək iki yer arasında sürücülük marşrutu çəkmək.

Başlanğıcda, hər hansı bir yerdən istifadə etmək mümkün deyil:

// Yerlər

özəl LatLng cərəyanı;

şəxsi LatLng lixeiraA; şəxsi LatLng lixeiraB; özəl LatLng lixeiraC; özəl LatLng lixeiraD;.

Xəritədə heç bir xəritəyə ehtiyac yoxdursa:

private void checkLocationandAddToMap () {// İstifadəçinin icazə verib -vermədiyini yoxlamaq (ActivityCompat.checkSelfPermission (bu, android. Manifest.permission. ACCESS_FINE_LOCATION)! = PackageManager. PERMISSION_GRANTED && ActivityCompat.checkSelfPerm. ACCESS_COARSE_LOCATION)! = PackageManager. PERMISSION_GRANTED) {// Məkan icazəsi ActivityCompat.requestPermissions tələb olunur (bu, yeni String {android. Manifest.permission. ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE); qayıtmaq; }

// Fus istifadə edərək bilinən son yeri əldə etmək

Məkan yeri = LocationServices. FusedLocationApi.getLastLocation (googleApiClient);

// MarkerOptions yeni Marker yaratmaq üçün istifadə olunur. MarkerOptions ilə yeri, adı və s. Təyin edə bilərsiniz.

this.current = yeni LatLng (location.getLatitude (), location.getLongitude ()); MarkerOptions markerOptions = yeni MarkerOptions (). Mövqe (cari). Başlıq ("Posição atual");

// Yaradılmış işarəni xəritəyə əlavə etmək, kameranı mövqeyinə keçirmək

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

// 15 yaxınlaşdırma ilə kameranı dərhal yerə köçürün.

mMap.moveCamera (CameraUpdateFactory.newLatLngZoom (cari, 15));

// Yaxınlaşdırın, kameranı canlandırın.

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

}

Emuida, para cada lixeira, foram criados métodos oxşar və ya abaixo:

private void addBinALocation () {// İstifadəçinin icazə verdiyini yoxlamaq (ActivityCompat.checkSelfPermission (bu, android. Manifest.permission. ACCESS_FINE_LOCATION)! = PackageManager. PERMISSION_GRANTED && ActivityCompat.checkSelfPermission (bu, ACCESS_COARSE_LOCATION)! = PackageManager. PERMISSION_GRANTED) {// Məkan icazəsi ActivityCompat.requestPermissions tələb olunur (bu, yeni String {android. Manifest.permission. ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE); qayıtmaq; }

// Praça da Estação

ikiqat enlik = -19.9159578; ikiqat uzunluq = -43.9387856; this.lixeiraA = yeni LatLng (Enlem, Boylam);

MarkerOptions markerOptions = yeni MarkerOptions (). Mövqe (lixeiraA).title ("Lixeira A");

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

Enlem və uzunluqlar Google Xəritələr vasitəsilə Google Xəritələr tərəfindən təqdim edildikdə, eixadas heç bir şəkildə düzəldilmir. Əlavə olaraq, Firebase -dən (məsələn, Firesase -dən) istifadə etmək olar. Başlanğıc proqramını hazırlayın!

Bu proqramlar bir -birindən daha çox məlumat əldə etmək üçün istifadə edilə bilər. Əlavə olaraq, bütün vacib və ən vacib şeylər, yol nöqtələrində!

Bu mövzuda bir çox məlumat əldə edə bilərsiniz:

xüsusi String getDirectionsUrl (LatLng mənşəli, LatLng dest, Yol nöqtələrinin siyahısı Siyahısı) {

// Marşrutun mənşəyi

String str_origin = "mənşə ="+mənşə.dövr+","+mənşə. Uzunluq;

// Marşrutun təyinatı

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

// Marşrut boyunca yol nöqtələri

//waypoints=optimize:true|-19.9227365, -43.9473546 | -19.9168006, -43.9361124 String yol nöqtələri = "yol nöqtələri = optimize: doğru"; for (LatLng point: waypointsList) {sened noktaları += "|" + nöqtə.yenilik + "," + nöqtə.uzunluq; }

// Sensor aktivdir

String sensoru = "sensor = yanlış";

// Veb xidmətinin parametrlərini qurmaq

String parametrləri = str_origin+"&"+str_dest+"&"+sensor+"&"+sened noktaları;

// Çıxış formatı

String çıxışı = "json";

// Veb xidmətinə url qurmaq

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

qaytar URL;

}

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

@OnMapReady (GoogleMap googleMap) ictimai boşluğu ləğv edin {mMap = googleMap;

checkLocationandAddToMap ();

əgər (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 (); }

// Marşrutlar çəkin

// Google İstiqamətlər API -sinə URL alınır

Siyahı nöqtələri = yeni ArrayList (); ballar əlavə edin (lixeiraB); ballar əlavə edin (lixeiraC); ballar əlavə edin (lixeiraD);

String url = getDirectionsUrl (cari, lixeiraA, bal);

DownloadTask downloadTask = yeni DownloadTask (); // Google Directions API downloadTask.execute (url) -dən json məlumatlarını yükləməyə başlayın; }

Su keçirməyin əsas prinsipləri. Məsləhətləşmələr apardıqdan sonra bu işi tamamlayın.

Addım 8: Nəticə

IoT və ya İnternetdən istifadə etməklə, məlumatların ötürülməsi ilə əlaqəli məlumatları əldə etmək çox vacibdir. Əlavə etmək üçün, Android -də heç bir iş görmədiyiniz halda, hər hansı bir işin öhdəsindən gələ bilərsiniz.

Tövsiyə: