Мазмуну:
- 1 -кадам: Conectando O Sensor
- 2 -кадам: Montando a Lixeira
- 3 -кадам: Para a Nuvem жүктөө
- 4 -кадам: Recuperando Dados Do ThingSpeak
- 5 -кадам: Criando жана Aplicação Android
- 6 -кадам: Recuperando O Feed No Android
- 7 -кадам: Mostrando No Mapa
- 8 -кадам: Корутунду
Video: SmartBin: 8 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-31 10:22
Бул системанын интеллектуалдык деӊгээлинин эч кандай айырмасы жок, бирок алар эч кандай сапатка ээ эмес, алар өзүлөрүнүн жеке маалыматтарын сунушташат, ошондой эле маалымат алмашуу, маалымат алмашуу.
Төмөнкү жоболорду аткарыңыз:
- NodeMCU
- Сенсор Ultrassônico de Distancia
- Caixa de papelão
- Protoboard
- Cabos
- Android дисплейи
1 -кадам: Conectando O Sensor
Негизги маалымат, сенсордун жардамы менен сиз NODEMCU менен иштей аласыз. Para tango, vamos conectar portes trigger e echo do sensor sensas port D4 e D3 do NodeMCU:
// казыктардын сандарын аныктайт #pino_trigger 2ди аныктаңыз // D4
#define pino_echo 0 // D3
Сенсорлордун жардамы менен, сиз FilipeFlopтун үйрөткүчтөрү менен иштей аласыз, жана акысыз.
cmMsec, inMsec;
long microsec = ultrasonic.timing ();
cmMsec = ultrasonic.convert (microsec, Ultrasonic:: CM);
inMsec = ultrasonic.convert (microsec, Ultrasonic:: IN);
// Exibe informacoes сериялык монитор жок
Serial.print ("Distancia em cm:");
Serial.print (cmMsec);
Serial.print (" - Distancia em polegadas:");
Serial.println (inMsec);
String маалыматы = String (cmMsec);
Serial.println (маалыматтар);
2 -кадам: Montando a Lixeira
Agora, vamos montar a lixeira inteligente. Precisaremos conectar же сенсор ultrassônico no teto da lixeira. Мисалы, сиз бул маалыматты колдоно аласыз. Эмнеге десеңиз, анда расмий маалымат, ал эми баалуу кагаздар үчүн. Эч кандай мааниси жок, 26, 3см. Эң негизгиси, бул чоң мааниге ээ.
Туура эмес маалымат, сенсордун ультрафонмону, алгоритмдин ар кандай жолдор менен тандалып алынышы, ар кандай жолдор менен айырмаланат.
// Simulando 4 lixeiras
long lixeiraID;
void loop () {
lixeiraID = туш келди (1, 5);
}
3 -кадам: Para a Nuvem жүктөө
Агро, жаңыртылган нерселердин эң жакындары. ThingSpeak эсколи, же тааныш таанышуу үчүн. Баштапкы канал, бул жаңы каналдын 4 параметри, референдумдун көлөмү же көлөмү боюнча.
Бул ThingSpeak колдонмосу менен туташып турат, жана бул APIди каналдар аркылуу жабуу үчүн керек. Sass os passos descritos расмий сайт жок.
ThingSpeak, ESP8266WiFi.h үчүн библиотеканы колдонуу үчүн, ThingSpeak жана башка колдонмолорду колдонуңуз.
Баштапкы шарттар, бул функцияларды кайра иштетүү (аныктоо мурунку варианттар, дайындар өтүү , аныктоо жана аныктоо үчүн).
Void 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
connectWifi ();
}
ThingSpeak үчүн эң маанилүү нерсе, бул HTTPди колдонуудан баш тартышы керек, ошондой эле API жана параметро.
жараксыз sendDataTS (калкыма cmMsec, узун идентификатор) {
if (client.connect (server, 80)) {
Serial.println ("ThingSpeak үчүн акысыз");
StrS postStr = apiKey;
postStr += "& талаа";
postStr += id;
postStr += "=";
postStr += Сап (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 ("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 ();
}
Параметро менен жооп берүү, сенсорлорду жабуу үчүн, сенсорлорду жабуу керек. ID ID likseira que foi lida (que gerado randomicamente, um a número de 1 a 4).
O ID da lixeira тейлөөнүн өзгөчөлүгү үчүн сапаттык кампустун кызматын аткарыңыз же жүктөп бериңиз.
4 -кадам: Recuperando Dados Do 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
Бул жерде эч кандай шилтеме жок. Бул маанилүү болгон нерселер үчүн:
- CHANNEL_ID: каналды жаңыртуу
- FIELD_NUMBER: ал эмне үчүн
- API_KEY: API каналы
Бул URL'дин Android үчүн колдонмосу, ThingSpeak программасынын жардамы менен.
5 -кадам: Criando жана Aplicação Android
Android Studio жок, Androidди жаңыртыңыз. Тиешелүү функциялар орнотулганда, AndroidManifest жок болсо, конфигурациялоо керек.
Google Карталар менен Google'ду иштетүү керек. API шилтемеси жок.
Жөнөкөй сөз менен айтканда, конфигурациялоо жана орнотуу.
Google Карталарына негизделген API үчүн API ачкычы сап булагы катары аныкталат.
("Res/values/google_maps_api.xml" файлын караңыз).
API ачкычы APKге кол коюу үчүн колдонулган шифрлөө ачкычы менен байланыштырылганын эске алыңыз. Ар бир шифрлөө ачкычы үчүн башка API ачкычы керек, анын ичинде жарыялоо үчүн APKге кол коюу үчүн чыгарылган ачкыч. Сиз мүчүлүштүктөрдү оңдоонун жана ачуунун ачкычтарын src/debug/жана src/release/ичинде аныктай аласыз.
<мета-маалыматтар
андроид: аты = "com.google.android.geo. API_KEY"
android: value = "@string /google_maps_key" />
AndroidManifest проектиси боюнча Android конфигурациясын толугу менен конфигурациялоо.
п
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 даректери боюнча, биз сизди эч нерседен кем кылбайбыз:
JSONObject responseLixeiraA; JSONObject responseLixeiraB; JSONObject responseLixeiraC; JSONObject responseLixeiraD;
Кошумча комментарийлерди url катары кошуп койсоңуз болот, бул кошумча жардамчы, HttpJsonParser. Төмөнкү жооптор URL даректери менен жабдылган, бул JSON монтаждоосунун акыркы жооптору.
коомдук JSONObject makeHttpRequest (String url, String method, Map params) {
аракет {
Uri. 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". equals (method)) {url = url + "?" + encodedParams; 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 (). узундугу)); urlConnection.getOutputStream (). write (encodedParams.getBytes ()); } // urlConnection.connect серверине туташуу (); // Жоопту окуңуз = urlConnection.getInputStream (); BufferedReader окурманы = жаңы BufferedReader (жаңы InputStreamReader (is)); StringBuilder sb = жаңы StringBuilder (); String line;
// Жоопту талдаңыз
while ((line = reader.readLine ())! = null) {sb.append (line + "\ n"); } жакын(); json = sb.toString (); // Жоопту JSON Objectка айландыруу jObj = new JSONObject (json);
} кармоо (UnsupportedEncodingException e) {
e.printStackTrace (); } catch (ProtocolException e) {e.printStackTrace (); } catch (IOException e) {e.printStackTrace (); } catch (JSONException e) {Log.e ("JSON Parser", "Дайындарды талдоодо ката" + e.toString ()); } catch (Exception e) {Log.e ("Exception", "Data parsing error" + e.toString ()); }
// JSON объектин кайтаруу
return jObj;
}
}
Директордун жеке бөлүмү, бул веб -сайттар жана веб -сайттар, эскиргенде, эс алуу үчүн, doInBackground менен байланышыңыз.
@Override корголгон String doInBackground (String… params) {HttpJsonParser jsonParser = new HttpJsonParser ();
answerLixeiraA = jsonParser.makeHttpRequest (url_a, "Get", null);
answerLixeiraB = jsonParser.makeHttpRequest (url_b, "Get", null); answerLixeiraC = jsonParser.makeHttpRequest (url_c, "Get", null); answerLixeiraD = jsonParser.makeHttpRequest (url_d, "Get", null);
кайтаруу нөл;}
Колдонуу doInBackgroundé программасы, же Android контролдоо боюнча onPostExecute программасын аткарыңыз. Neste método, vixos criar os objetos Lixeira, жана ThingSpeak эң популярдуу коммутаттар:
onPostExecute корголгон боштук (String жыйынтыгы) {pDialog.dismiss (); runOnUiThread (new Runnable () {public void run () {
// ListView listView = (ListView) findViewById (R.id.feedList);
View mainView = (View) findViewById (R.id.activity_main); if (success == 1) {try {// Cria feedDetail para lixeira Lixeira feedDetails1 = new 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 (answerLixeiraB.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 (answerLixeiraC.getString (KEY_FIELD3)))));
feedDetails4.setId ('D');
feedDetails4.setPesoLixo (Double.parseDouble (answerLixeiraD.getString (KEY_FIELD4))))); feedDetails4.setVolumeLixo (Double.parseDouble (answerLixeiraD.getString (KEY_FIELD4)))));
feedList.add (feedDetails1);
feedList.add (feedDetails2); feedList.add (feedDetails3); feedList.add (feedDetails4);
// Эсептөө каражаттары
SmartBinService эсептегич = жаңы SmartBinService (); calculator.montaListaLixeiras (feedList);
// Recupera компоненттери
TextView createDate = (TextView) mainView.findViewById (R.id.date); ListView listaDeLixeiras = (ListView) findViewById (R.id.lista); adapter.addAll (feedList);
// Дайындар
DateTimeTime = Calendar.getInstance (). GetTime (); SimpleDateFormat simpleDate = жаңы SimpleDateFormat ("кк/АА/жжж"); 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
Негизги маалымат боюнча, сиз карта менен карта менен байланышыңыз, бирок бул расмий эмес.
/ ** Колдонуучу Mapa баскычын таптаганда чакырылат*/ public void openMaps (View view) {Intent aim = new Intent (this, LixeiraMapsActivity.class);
// Жашоо тизмеси
Bundle bundle = new Bundle (); bundle.putParcelableArrayList ("lixeiras", feedList); ниет.putExtras (таңгак);
startActivity (ниет);
}
Эч кандай карта жок, өлүм жазасына тартылбайт:
- marcar a posição atual do caminha de lixo
- marcar os pontos корреспонденттери cada lixeira картасы жок
- traçar a rota entre os pontos
Бул Google Google Багыттарын колдонуу менен, сизди колдонот. Rotas, foram seguidos os passos do үйрөткүч Google Map 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 () {// Колдонуучунун уруксат бергенин текшерүү эгерде: 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 (). Позиция (учурдагы). Титул ("Posiçã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);
}
Эмнеге десеңиз, анда окшоштуктар бар:
private void addBinALocation () {// Колдонуучунун уруксат бергенин текшерүү эгерде (ActivityCompat.checkSelfPermission (бул, android. Manifest.permission. ACCESS_FINE_LOCATION)! = PackageManager. PERMISSION_GRANTED && ActivityCompat.checkSelf. Permission (бул, 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).title ("Lixeira A");
markerOptions.icon (BitmapDescriptorFactory.defaultMarker (BitmapDescriptorFactory. HUE_RED)); mMap.addMarker (markerOptions); }
Географиялык кеңдиктин узундугу жана картасы Google Карталарында көрсөтүлгөндөй, eixadas эч кандай ката эмес. Idealmente, estes vales ficariam salvos em banco de dados (exebplo Firebase үчүн). Баштапкы планды иштеп чыгыңыз!
Туура эмес потос сыяктуу эле. Эң негизгиси, бул эң маанилүү, эң маанилүү долбоорлордун бири болуп саналат.
Кыймылсыз калуу үчүн бул жерде эмне кылуу керек:
купуя String getDirectionsUrl (LatLng келип чыгышы, LatLng dest, Тизменин жол чекиттеринин тизмеси) {
// Маршруттун келип чыгышы
Str_origin String = "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 point: waypointsList) {waypoints += "|" + чекит.латтык + "," + чекит. узундук; }
// Сенсор иштетилди
String sensor = "сенсор = жалган";
// Желе кызматына параметрлерди куруу
String параметрлери = str_origin+"&"+str_dest+"&"+сенсор+"&"+жол чекиттери;
// Чыгуу форматы
Сап чыгаруу = "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 main da classe, onMapReady:
@Omrride 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 (); упайлар.add (lixeiraB); упайлар.add (lixeiraC); пункттар.add (lixeiraD);
String url = getDirectionsUrl (учурдагы, lixeiraA, пункттар);
DownloadTask downloadTask = жаңы DownloadTask (); // Google Directions API downloadTask.execute (url) дан json маалыматтарын жүктөп баштаңыз; }
Aqui passamos apenas pelos pontos principais. Консультацияларды тапшыруу үчүн сиз аларды толуктап алсаңыз болот.
8 -кадам: Корутунду
Бул IoT долбоорунун трабалхандо концепциясы, атрибуттар жана конструкторлордун атрибуттары, ошондой эле интерфейстердин чечимдери боюнча чечимдерди кабыл алуу. Колдонмонун аягына чейин чыгарылышы керек, Android үчүн эч кандай жазуу жок.
Сунушталууда:
Кантип кадам эсептегич жасоо керек?: 3 кадам (сүрөттөр менен)
Step Counter кантип жасалат ?: Мен көптөгөн спортто жакшы аткарчумун: жөө басуу, чуркоо, велосипед тебүү, бадминтон ойноо ж.б. Мейли, менин ичимди карачы ……. Ооба, баары бир мен машыгуу үчүн кайра баштоону чечтим. Мен кандай жабдыктарды даярдашым керек?
IPodдо Doomду 5 жеңил кадам менен ойноңуз !: 5 кадам
Doom'ду IPodдо 5 жеңил кадам менен ойноңуз!: Doom жана башка ондогон оюндарды ойноо үчүн iPod'уңузда Rockboxту кантип кош жүктөө керектиги боюнча этап-этабы менен көрсөтмө. Бул чындыгында оңой нерсе, бирок менин iPodдо кыйроо ойноп жатканымды көргөндөрдүн көбү дагы эле таң калышат жана көрсөтмө менен чаташып кетишет
WordPressке плагиндерди 3 кадам менен кантип орнотсо болот: 3 кадам
WordPressке плагиндерди 3 этапта кантип орнотуу керек: Бул үйрөткүчтө мен сизге веб -сайтыңызга WordPress плагинин орнотуу үчүн эң маанилүү кадамдарды көрсөтөм. Негизи плагиндерди эки башка жол менен орнотсоңуз болот. Биринчи ыкма ftp же cpanel аркылуу болот. Бирок мен аны тизмектебейм, анткени бул чындыгында нааразы
Акустикалык левитация Arduino Uno менен кадам-кадам (8-кадам): 8 кадам
Акустикалык левитация менен Arduino Uno Step-by-Step (8-кадам): ультрадыбыштуу үн өткөргүчтөр L298N Dc аял адаптеринин электр энергиясы менен камсыздоосу эркек токту Arduino UNOBreadboard Бул кантип иштейт: Биринчиден, сиз Arduino Uno кодун жүктөп бересиз (бул санарип менен жабдылган микроконтроллер) жана аналогдук порттор кодду айландыруу үчүн (C ++)
SmartBin: 4 кадам
SmartBin: Бул долбоордун негизги максаты жок дегенде бир Raspberry Pi колдонгон электрондук түзүлүштү түзүү болуп саналат. Команда 5 болочок механик инженерден жана бир автоматика инженеринен турат. Биздин долбоор ачылуучу жана жабылуучу таштанды челегин жасоодон турат