Мазмұны:
- 1 -қадам: Conectando O сенсоры
- 2 -қадам: Монтандо мен Ликсейра
- 3 -қадам: Nuvem жүктеу
- 4 -қадам: Recuperando Dados Doing ThingSpeak
- 5 -қадам: Криандо және Android қосымшасы
- 6 -қадам: Recuperando O Feed жоқ Android
- 7 -қадам: Mostrando No Mapa
- 8 -қадам: Қорытынды
Бейне: SmartBin: 8 қадам
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-31 10:21
Ақпараттық жүйенің маңыздылығы жоқ, бұл сіздің тіліңізден бас тартпайды, сонымен қатар сіздің жеке ақпаратыңыздың маңыздылығын көрсетеді.
Пара монтар жобасы, және қажет:
- NodeMCU
- Ultrassônico de Distancia сенсоры
- Caixa de papelão
- Protoboard
- Кабо
- Android дисплейі
1 -қадам: Conectando O сенсоры
Бастапқыда, NODEMCU ультрадыбыстық датчигі мен сенсоры бар. Para toto, vamos conectar портативті триггер ретінде D4 e D3 Dode e NodeMCU жаңғырығы:
// түйреуіш сандарын анықтайды #pino_trigger 2 анықтаңыз // D4
#pino_echo 0 анықтаңыз // D3
Сенсорлар мен оқулықтар FilipeFlop оқулықтары мен сенсорлармен жұмыс істейді.
float cmMsec, inMsec;
ұзын микросек = ультрадыбыстық. timing ();
cmMsec = ultrasonic.convert (microsec, Ultrasonic:: CM);
inMsec = ultrasonic.convert (microsec, Ultrasonic:: IN);
// Exibe ақпаратында сериялық монитор жоқ
Serial.print («Distancia em cm:»);
Serial.print (cmMsec);
Serial.print (« - Distancia em polegadas:»);
Serial.println (inMsec);
Жолдық деректер = Жол (cmMsec);
Serial.println (деректер);
2 -қадам: Монтандо мен Ликсейра
Agora, vamos montar және lixeira inteligente. Precisaremos conectar немесе сенсор ультрадыбыстық емес, «тето» да. Мысалы, оқшауланған жағдайда. Түсініктеме бойынша, бұл жағдайда, әрине, үлкен мәнге ие болады. 26, 3см қашықтықта ешқандай айырмашылық жоқ. Ең бастысы, бұл маңызды мәселе.
Мысалы, сенсорлар ультрадыбыстық, сенсорлық диагностиканың әр түрлі кезеңдерінде кездейсоқ пайдаланылатын сенсорлар болып табылады.
// Симуландо 4 лексейра
ұзын lixeiraID;
void loop () {
lixeiraID = кездейсоқ (1, 5);
}
3 -қадам: Nuvem жүктеу
Агро, жаңашылдықтың ең маңызды ерекшелігі. ThingSpeak бағдарламасымен таныс болыңыз, бұл сіздің танысыңыз. Бастапқыда жаңа арналар, 4 параметролар, сілтемелер немесе көлемді сілтемелер бар.
ThingSpeak қосымшасының көмегімен сіз API -ді немесе басқа каналдарды таба аласыз. Ресми сайт жоқ.
ThingSpeak, ESP8266WiFi.h және eBitlioteca кітапханасы, ThingSpeak және басқа да қосымшалар арқылы қол жетімді.
Бастапқыда, сіз барлық функцияларды орындауға міндеттісіз (анықтаманың соңғы нұсқасы, рұқсат өтуі , сәйкестендіру және ұсыну).
жарамсыз connectWifi () {
Serial.print («Қосылу»+ *ssid);
WiFi.begin (ssid, pass);
while (WiFi.status ()! = WL_CONNECTED) {
кешіктіру (500);
Serial.print («.»);
}
Serial.println («»);
Serial.print («Conectado na rede»);
Serial.println (ssid);
Serial.print («IP:»);
Serial.println (WiFi.localIP ());
}
Орнату, орнату және жою қажет.
жарамсыз орнату () {
Serial.begin (9600);
Serial.println («Lendo dados do sensor …»);
// Wi-Fi немесе Conectando
connectWifi ();
}
ThingSpeak үшін ең маңызды ақпарат, бұл HTTP -ді жаңарту үшін қажет, сонымен қатар API -нің параметірлері.
жарамсыз sendDataTS (float cmMsec, ұзақ идентификатор) {
if (client.connect (сервер, 80)) {
Serial.println («ThingSpeak парақтары»);
ЖолStrStr = apiKey;
postStr += «& өріс»;
postStr += id;
postStr += «=»;
postStr += Жол (cmMsec);
postStr += «\ r / n / r / n»;
Serial.println (postStr);
client.print («POST /HTTP жаңарту /1.1 / n»);
client.print («Хост: api.thingspeak.com / n»);
client.print («Қосылым: жабу / n»);
client.print («X-THINGSPEAKAPIKEY:» + apiKey + «\ n»);
client.print («Content-Type: application/x-www-form-urlencoded / n»);
client.print («Content-Length:»);
client.print (postStr.length ());
client.print («\ n / n»);
client.print (postStr);
кешіктіру (1000);
}
client.stop ();
}
Параметро - бұл сенсорлық сигналдың ультрадыбыстық сенсоры. Бұл жеке куәлікке сәйкес келуі керек (кездейсоқ емес, 1 -ден 4 -ке дейін).
Ол идентификаторды анықтауға мүмкіндік береді және жүктеуді жүктейді.
4 -қадам: Recuperando Dados Doing ThingSpeak
O ThingSpeak рұқсат етіледі, бұл JSON желісінде, сонымен қатар қызмет көрсетуде. Арнаулы нұсқауларға сәйкес, арнаның сипаттамасы:
www.mathworks.com/help/thingspeak/get-a-ch…
Бұл ең жақсы нұсқа болып табылады. Cenário é URL мекен -жайы бойынша:
api.thingspeak.com/channels/CHANNEL_ID/fields/FIELD_NUMBER/last.json?api_key=API_KEY&status=true
Түсіндірме сілтеме жоқ. Бұл маңызды жобалар үшін:
- CHANNEL_ID: арнаны жаңарту
- FIELD_NUMBER
- API_KEY: API арнасы
URL мекенжайын Android және ThingSpeak арқылы орнатуға болады.
5 -қадам: Криандо және Android қосымшасы
Android Studio жоқ, Android -ті жаңартыңыз. AndroidManifest -те рұқсат етілгендей конфигурациялау қажет.
Google карталары мен Google -ді пайдалану қажет. API сілтемесі жоқ.
Бұл жағдайда сіз конфигурациялауды шеше аласыз.
Google Maps негізіндегі 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 жоқ 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 және Android JSONObject бағдарламалары үшін ең маңызды нұсқаулар мен бағдарламалар бар. Бұл URL мекен -жайы бойынша:
JSONObject responseLixeiraA; JSONObject responseLixeiraB; JSONObject responseLixeiraC; JSONObject responseLixeiraD;
Ұялы байланыстарға сілтеме жасайтын болсаңыз, HttpJsonParser -ді қолданыңыз. Жауаптар URL мекен -жайы бойынша, жауаптар JSON монтаждауының соңғы нұсқасы, сонымен қатар URL мекен -жайлары болып табылады.
жалпыға ортақ JSONObject makeHttpRequest (String url, String әдісі, Карта параметрлері) {
тырысу {
Uri. Builder құрастырушысы = жаңа Uri. Builder (); URL urlObj; 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». equals (method)) {url = url + «?» + кодталғанParams; urlObj = жаңа URL (url); urlConnection = (HttpURLConnection) urlObj.openConnection (); urlConnection.setRequestMethod (әдіс);
} басқа {
urlObj = жаңа URL (url); urlConnection = (HttpURLConnection) urlObj.openConnection (); urlConnection.setRequestMethod (әдіс); urlConnection.setRequestProperty («Content-Type», «application/x-www-form-urlencoded»); urlConnection.setRequestProperty («Content-Length», String.valueOf (encodedParams.getBytes (). length)); urlConnection.getOutputStream (). write (encodedParams.getBytes ()); } // urlConnection.connect () серверіне қосылыңыз; // Жауапты оқыңыз = urlConnection.getInputStream (); BufferedReader оқу құралы = жаңа BufferedReader (жаңа InputStreamReader (is)); StringBuilder sb = жаңа StringBuilder (); Жол сызығы;
// Жауапты талдаңыз
while ((line = reader.readLine ())! = null) {sb.append (жол + «\ n»); } is.close (); json = sb.toString (); // Жауапты JSON нысанына түрлендіру jObj = new JSONObject (json);
} catch (ҚолдамайтынEncodingException e) {
e.printStackTrace (); } catch (ProtocolException e) {e.printStackTrace (); } catch (IOException e) {e.printStackTrace (); } catch (JSONException e) {Log.e («JSON Parser», «Деректерді талдауда қате» + e.toString ()); } catch (Ерекше д) {Log.e («Ерекшелік», «Деректерді талдау қатесі» + e.toString ()); }
// JSON нысанын қайтару
jObj қайтару;
}
}
Директорлар кеңесінің бастығы, сіздің веб -сайттарыңызда байланыс орнатылған, сонымен қатар doInBackground -дағы мамандықтар бар.
@Override қорғалған String doInBackground (String… params) {HttpJsonParser jsonParser = жаңа HttpJsonParser ();
responseLixeiraA = jsonParser.makeHttpRequest (url_a, «GET», нөл);
answerLixeiraB = jsonParser.makeHttpRequest (url_b, «GET», нөл); responseLixeiraC = jsonParser.makeHttpRequest (url_c, «GET», нөл); responseLixeiraD = jsonParser.makeHttpRequest (url_d, «GET», нөл);
қайтару нөлі;}
DoInBackgroundé -ге кіру, Android -тің орындалуын бақылау арқылы OnPostExecute бағдарламасын іске қосыңыз. Neste método, vixos criar os objetos Lixeira, ThingSpeak -тің танымал коммерциялық бағдарламалары:
onPostExecute (String нәтижесі) қорғалған void {pDialog.dismiss (); runOnUiThread (new Runnable () {public void run () {
// ListView listView = (ListView) findViewById (R.id.feedList);
MainView қарау (View) findViewById (R.id.activity_main); if (сәттілік == 1) {try {// 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 (responseLixeiraA.getString (KEY_FIELD1)))));
feedDetails2.setId ('B');
feedDetails2.setPesoLixo (Double.parseDouble (answerLixeiraB.getString (KEY_FIELD2))))); feedDetails2.setVolumeLixo (Double.parseDouble (responseLixeiraB.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 (responseLixeiraD.getString (KEY_FIELD4))))); feedDetails4.setVolumeLixo (Double.parseDouble (answerLixeiraD.getString (KEY_FIELD4)))));
feedList.add (feedDetails1);
feedList.add (feedDetails2); feedList.add (feedDetails3); feedList.add (feedDetails4);
// Dados das lixeiras есебі
SmartBinService калькуляторы = жаңа SmartBinService (); calculator.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 («кк/а/жжж»); CurrentDate жолы = simpleDate.format (currentTime); createDate.setText (KEY_DATE + currentDate + «»); listaDeLixeiras.setAdapter (адаптер);
} catch (JSONException e) {
e.printStackTrace (); }
} басқа {
Toast.makeText (MainActivity.this, «Деректерді жүктеу кезінде қате пайда болды», Toast. LENGTH_LONG).show ();
}
} }); }
Ағылшын тілінің ресми нұсқалары, сонымен қатар сіздің жеке тізімдеріңіз де бар.
7 -қадам: Mostrando No Mapa
Директорлар кеңесінің басты хатшысы, егер сіз картаның ресми картасы болып табылмайтын болсаңыз.
/ ** Пайдаланушы Mapa түймесін түрткенде шақырылады*/ public void openMaps (View view) {Intent aim = new Intent (this, LixeiraMapsActivity.class);
// Лексейр тізімі
Bundle bundle = жаңа топтама (); bundle.putParcelableArrayList («lixeiras», feedList); aim.putExtras (жинақ);
startActivity (ниет);
}
Ешқандай картаны орындауға болмайды:
- caminha de lixo жасаңыз
- marcar os pontos корреспонденттері картаның картасы жоқ
- tracar a rota entre os pontos
Бұл Google Directions API -ді қолдану арқылы орындалады. Google картасы Android API V2 -де Google бағыттарын қолдана отырып, екі жердің арасында жүру маршрутының сызбасын сызу.
Primeiro, vamos criar localidades үшін ақшалай карталар:
// Орындар
жеке LatLng ағымы;
жеке LatLng lixeiraA; жеке LatLng lixeiraB; жеке LatLng lixeiraC; жеке LatLng lixeiraD;.
Қарта -қартаға сәйкес келмеуі керек:
private void checkLocationandAddToMap () {// Пайдаланушының рұқсат бергенін тексеру, егер: ACCESS_COARSE_LOCATION)! = PackageManager. PERMISSION_GRANTED) {// Орналасуға рұқсат сұрау ActivityCompat.requestPermissions (бұл жаңа жол {android. Manifest.permission. ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE); қайтару; }
// Fus көмегімен соңғы белгілі орынды алу
Орналасқан жері = LocationServices. FusedLocationApi.getLastLocation (googleApiClient);
// MarkerOptions жаңа Маркер жасау үшін пайдаланылады. 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);
}
Emigida, para cada lixeira, foram criados métodos similares ao abaixo:
private void addBinALocation () {// Пайдаланушының рұқсат бергенін тексеру: ACCESS_COARSE_LOCATION)! = PackageManager. PERMISSION_GRANTED) {// Орналасуға рұқсат сұрау ActivityCompat.requestPermissions (бұл жаңа жол {android. Manifest.permission. ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE); қайтару; }
// Прика да Эстачау
қос ендік = -19.9159578; қос бойлық = -43.9387856; this.lixeiraA = жаңа LatLng (ендік, бойлық);
MarkerOptions markerOptions = new MarkerOptions (). Position (lixeiraA).title («Lixeira A»);
markerOptions.icon (BitmapDescriptorFactory.defaultMarker (BitmapDescriptorFactory. HUE_RED)); mMap.addMarker (markerOptions); }
Ендік пен бойлықта Google карталары қолданылған кезде Google Maps -тің қолданылуы мүмкін болғандықтан, олар ешнәрсеге сәйкес келмейді. Ең дұрысы, Firebase -тің ең жақсы құндылықтары. Ең бастысы - жобалау!
Потос -приводты айналдыру керек. Қарап шығыңыз, бұл маңызды емес, сонымен қатар жол нүктелері!
Пікірлерді есте сақтаңыз:
жеке String getDirectionsUrl (LatLng шығу тегі, LatLng dest, Жол нүктелерінің тізімі тізімі) {
// Маршруттың шығу тегі
Жол str_origin = «Origin =»+Origin. Latitude+«,»+Origin.longitude;
// Маршруттың тағайындалуы
Жол str_dest = «destination =»+dest.latitude+«,»+dest.longitude;
// Маршрут бойындағы нүктелер
//waypoints=optimize:true|-19.9227365, -43.9473546 | -19.9168006, -43.9361124 Жолдық нүкте жолдары = «жол нүктелері = оңтайландыру: ақиқат»; for (LatLng нүктесі: waypointsList) {жол нүктелері += «|» + нүкте.аттық + «,» + нүкте. бойлық; }
// Сенсор қосылды
Жол сенсоры = «sensor = false»;
// Веб -қызметтің параметрлерін құру
Жол параметрлері = str_origin+«&»+str_dest+«&»+сенсор+«&»+жол нүктелері;
// Шығару форматы
Жолдың шығысы = «json»;
// Веб -қызметтің URL мекенжайын құру
Жол url = «https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters; System.out.println («++++++++++++++»+url);
қайтару url;
}
E, por fim, juntando tudo no método da da classe, onMapReady:
@Override public void 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);
Жол url = getDirectionsUrl (ағымдағы, lixeiraA, нүктелер);
DownloadTask downloadTask = жаңа DownloadTask (); // Google Directions API downloadTask.execute (url) -дан json деректерін жүктеуді бастаңыз; }
Aqua passamos apenas pelos pontos principais. Консультациялардың толық жоспарын орындаңыз.
8 -қадам: Қорытынды
Бұл IoT -ді жаңартуға мүмкіндік береді, сонымен қатар жаңа технологиялар, сонымен қатар, интерактивті байланыстардың шешімі болып табылады. Қосымшада Android -тің барлық нұсқалары бар, олар әр түрлі болуы мүмкін.
Ұсынылған:
Arduino басқарылатын робот - екі қадам: 13 қадам (суреттермен)
Arduino басқарылатын роботты екіжақты: Мен әрқашан роботтарға қызығатынмын, әсіресе адамның іс -әрекетіне еліктеуге тырысатын. Бұл қызығушылық мені жаяу жүруге және жүгіруге еліктей алатын екіжақты робот құрастыруға және дамытуға талпындырды. Бұл нұсқаулықта мен сізге көрсетемін
Arduino Uno көмегімен акустикалық левитация Қадамдық қадам (8 қадам): 8 қадам
Акустикалық левитация Arduino Uno Қадамдық қадаммен (8-қадам): ультрадыбыстық дыбыс түрлендіргіштері L298N Dc әйелдер адаптерінің ток көзі еркек тоқ сымымен Arduino UNOBreadboard Бұл қалай жұмыс істейді: Біріншіден, сіз кодты Arduino Uno-ға жүктейсіз (бұл сандық жүйемен жабдықталған микроконтроллер) және кодты түрлендіру үшін аналогтық порттар (C ++)
Түймені іске қосатын қадам реттегіші: 4 қадам
Түймені іске қосатын қадам реттегіші:
Тікелей 4G/5G HD бейне ағыны DJI Drone -ден төмен кідірісте [3 қадам]: 3 қадам
Тікелей 4G/5G HD бейне ағыны DJI Drone-ден төмен кідірісте [3 қадам]: Келесі нұсқаулық кез-келген DJI дронынан HD сапалы бейне ағындарын алуға көмектеседі. FlytOS мобильді қосымшасы мен FlytNow веб -қосымшасының көмегімен сіз дроннан бейне ағынды бастай аласыз
SmartBin: 4 қадам
SmartBin: Бұл жобаның негізгі мақсаты - кем дегенде бір Raspberry Pi қолданатын электронды құрылғыны құру. Команда 5 болашақ инженер -механиктен және бір автоматика инженерінен тұрады. Біздің жоба ашылатын және жабылатын қоқыс жәшігін жасаудан тұрады