Obsah:

SmartBin: 8 krokov
SmartBin: 8 krokov

Video: SmartBin: 8 krokov

Video: SmartBin: 8 krokov
Video: ТРЕШ маникюр из салона красоты за 700Р множественные порезы. 2024, November
Anonim
SmartBin
SmartBin

Všetko, čo sa týka projektu, je inteligentný systém zberu, nie je k dispozícii žiadny rad príjemcov, identifikuje a kvantifikuje množstvo údajov, ktoré môžu byť k dispozícii, môžu obsahovať všetky základné informácie o zdrojoch rekuperácie.

Je dôležité zvážiť, čo treba urobiť:

  • NodeMCU
  • Ultrassônico de Distancia
  • Caixa de papelão
  • Protoboard
  • Cabos
  • Dostupný pre Android

Krok 1: Senzor Conectando O

Hlavné prvky, doplnkové a pripojené snímače ultrassônico a NODEMCU. Para tanto, conectar as portas trigger echo do sensor nas portas D4 e D3 do NodeMCU:

// definuje čísla pinov #define pino_trigger 2 // D4

#define pino_echo 0 // D3

Niektoré efekty môžu mať vplyv na snímač, napríklad sprievodca alebo podrobné návody na FilipeFlop, ktoré sú k dispozícii.

float cmMsec, inMsec;

dlhý mikrosek = ultrazvukový.časovanie ();

cmMsec = ultrasonic.convert (mikrosec, Ultrazvuk:: CM);

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

// Exibe informacoes no serial monitor

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

Serial.print (cmMsec);

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

Serial.println (inMsec);

Reťazcové údaje = Reťazec (cmMsec);

Serial.println (údaje);

Krok 2: Montando a Lixeira

Agora, montáže a lixeira inteligentné. Pripojte snímač k ultrassônico bez „teto“da lixeira. Príkladom je použitie cabo e fita izolante. Em seguida, temos que medir a distância inicial, para saber o valor para a lixeira vazia. Žiadne meu caso, foi de 26, 3 cm. Esse é o valor que considerarmos para uma lixeira vazia.

Para simulação, visto que não possuo mais de um sensor ultrassônico, foi feito um algoritmo para salvar randomicament and distancia lida em 4 lixeiras differententes.

// Simulando 4 lixeiras

dlhý lixeiraID;

prázdna slučka () {

lixeiraID = náhodný (1, 5);

}

Krok 3: Nahrajte časť Para a Nuvem

Agora, precisamos enviar estes dados para a nuvem. Eu escolhi o ThingSpeak, or familiaridade com o mesmo. Primeiramente, é needário criar um novo canal, recebendo 4 parâmetros, referentes ao volume de cada lixeira.

Niektoré konektory a aplikácie ThingSpeak, ako aj všetky možnosti API do kanála môžu byť použité. Siga os passos descritos žiadna oficiálna stránka.

Používajú sa rôzne aplikácie a sú dostupné v zozname biblioteca ESP8266WiFi.h pre efektívne prepojenie s programom ThingSpeak a prenos dát.

Hlavné funkcie, ako sú uvedené nižšie, (ako definovať predchádzajúce variáveis, ssid e pass , contendo o identificador e a senha de sua rede).

void connectWifi () {

Serial.print ("Pripojenie k"+ *ssid);

WiFi.begin (ssid, pass);

while (WiFi.status ()! = WL_CONNECTED) {

oneskorenie (500);

Serial.print (".");

}

Serial.println ("");

Serial.print ("Conectado na rede");

Serial.println (ssid);

Serial.print ("IP:");

Serial.println (WiFi.localIP ());

}

Vykonajte nastavenie, vykonajte nasledujúce kroky a pripojte sa.

neplatné nastavenie () {

Serial.begin (9600);

Serial.println („Lendo dados do sensor …“);

// Pripojenie k sieti Wi-Fi

connectWifi ();

}

E, para enviar os dados para o ThingSpeak, basta abrir uma conexão HTTP padrão, passando o número da API e os parâmetros.

neplatné sendDataTS (float cmMsec, dlhé ID) {

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

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

Reťazec postStr = apiKey;

postStr += "& pole";

postStr += id;

postStr += "=";

postStr += reťazec (cmMsec);

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

Serial.println (postStr);

client.print ("POST /aktualizácia HTTP /1.1 / n");

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

client.print ("Pripojenie: zavrieť / n");

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

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

client.print („Dĺžka obsahu:“);

client.print (postStr.length ());

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

client.print (postStr);

oneskorenie (1000);

}

client.stop ();

}

Najvyššia možná úroveň zodpovedajúcej vzdialenosti medzi snímačmi a ultrassônico. O sagundo parâmetro é o ID da lixeira que foi lida (que foi gerado randomicamente, um número de 1 a 4).

O ID da lixeira serve também para identificar para qual campo será feito o upload do valor lido.

Krok 4: Recuperando Dados Do ThingSpeak

O ThingSpeak bude trvať dlho, kým sa do kanála nedostanete, ale môžete to urobiť znova JSON. Odlišné od toho, čo sa týka krmiva, sú nasledujúce kanály:

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

Najbližšie by ste to mohli urobiť, aby ste to urobili. Informácie o adrese URL nájdete v cenníku:

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

Cada campo está descrito no link informado previamente. Najdôležitejšie aspekty týkajúce sa projektu:

  • CHANNEL_ID: kanál número do seu
  • FIELD_NUMBER: o número do campo
  • API_KEY: kanál API do seu

Viac a viac adries URL môžete používať v systéme Android, alebo si môžete stiahnuť súbory z ThingSpeak.

Krok 5: Criando a Aplicação Android

Žiadne Android Studio, kliknite na nové riešenie pre Android. Väčšina funkcií aplikácie a konfigurácia je povolená iba pre AndroidManifest.

Používajú sa hlavne služby Mapy Google a mnoho ďalších nájdete na stránkach Google. Siga os passcritos no link Obter chave de API.

Uma vez com a chave, você deve também configurá-la na aplicação.

Kľúč API pre rozhrania API založené na Mapách Google je definovaný ako reťazcový zdroj.

(Pozrite si súbor „res/values/google_maps_api.xml“).

Kľúč API je prepojený so šifrovacím kľúčom použitým na podpísanie súboru APK. Pre každý šifrovací kľúč potrebujete iný kľúč API vrátane uvoľňovacieho kľúča, ktorý sa používa na podpísanie súboru APK na publikovanie. Kľúče pre ciele ladenia a uvoľnenia môžete definovať v src/debug/a src/release/.

<metaúdaje

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

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

Konfigurácia je kompatibilná s ďalšími verziami systému AndroidManifest, ako aj ďalšími projektmi.

n

Krok 6: Recuperando O Feed Žiadny Android

Na hlavnom princípe nie je Android, MainActivity, crie 4 rôzne identifikačné údaje, ktoré robia veci, hovorte o seriáloch:

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

Niektoré z najlepších a najpopulárnejších aplikácií pre Android, konkrétny JSONObject. Väčšinu z nich môžete vybrať z adresy URL adresy:

Odpoveď JSONObjectLixeiraA; Odpoveď JSONObjectLixeiraB; Odpoveď JSONObjectLixeiraC; JSONObject responseLixeiraD;

Vyberte jednu z nasledujúcich adries URL, kliknite na položku Classe auxiliar, chamada HttpJsonParser. Štandardné triedy odpovedí na viac adries URL, ako aj adresy URL, ako aj veľkosť súboru JSON montado.

public JSONObject makeHttpRequest (URL reťazca, metóda reťazca, parametre mapy) {

skúsiť {

Uri. Builder builder = nový Uri. Builder (); URL urlObj; Reťazec encodedParams = ""; if (params! = null) {for (Map. Entry entry: params.entrySet ()) {builder.appendQueryParameter (entry.getKey (), entry.getValue ()); }} if (builder.build (). getEncodedQuery ()! = null) {encodedParams = builder.build (). getEncodedQuery ();

}

if ("GET".equals (metóda)) {url = url + "?" + kódované Params; urlObj = nová URL (url); urlConnection = (HttpURLConnection) urlObj.openConnection (); urlConnection.setRequestMethod (metóda);

} else {

urlObj = nová URL (url); urlConnection = (HttpURLConnection) urlObj.openConnection (); urlConnection.setRequestMethod (metóda); urlConnection.setRequestProperty ("Content-Type", "application/x-www-form-urlencoded"); urlConnection.setRequestProperty ("Content-Length", String.valueOf (encodedParams.getBytes (). length)); urlConnection.getOutputStream (). write (encodedParams.getBytes ()); } // Pripojenie k serveru urlConnection.connect (); // Prečítajte si odpoveď = urlConnection.getInputStream (); Čítačka BufferedReader = nový BufferedReader (nový InputStreamReader (je)); StringBuilder sb = nový StringBuilder (); Reťazec;

// Analyzujte odpoveď

while ((line = reader.readLine ())! = null) {sb.append (riadok + "\ n"); } je blízko(); json = sb.toString (); // Previesť odpoveď na JSON Object jObj = new JSONObject (json);

} catch (UnsupportedEncodingException e) {

e.printStackTrace (); } catch (ProtocolException e) {e.printStackTrace (); } catch (IOException e) {e.printStackTrace (); } catch (JSONException e) {Log.e ("JSON Parser", "Chyba pri analýze údajov" + e.toString ()); } catch (Exception e) {Log.e („Exception“, „Error parsing data“+ e.toString ()); }

// návrat objektu JSON

vrátiť jObj;

}

}

Zásady ochrany osobných údajov, ako je to možné, môžu mať vplyv na vašu bezpečnosť, najmä na to, aby ste čo najviac využili svoju základňu.

@Override chránený reťazec doInBackground (reťazec… parametre) {HttpJsonParser jsonParser = nový HttpJsonParser ();

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

responseLixeiraB = jsonParser.makeHttpRequest (url_b, "GET", null); responseLixeiraC = jsonParser.makeHttpRequest (url_c, "GET", null); responseLixeiraD = jsonParser.makeHttpRequest (url_d, "GET", null);

vrátiť null;}

Quando o método doInBackgroundé encerrado, or controle de execução to Android passa para o método onPostExecute. Teraz si môžete vybrať jednu z nasledujúcich hier:

protected void onPostExecute (Výsledok reťazca) {pDialog.dismiss (); runOnUiThread (new Runnable () {public void run () {

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

Zobraziť mainView = (Zobraziť) findViewById (R.id.activity_main); if (success == 1) {try {// Cria feedDetail para cada lixeira Lixeira feedDetails1 = new Lixeira (); Feed LixeiraDetails2 = new Lixeira (); Feed LixeiraDetails3 = new Lixeira (); Feed LixeiraDetails4 = new Lixeira ();

feedDetails1.setId ('A');

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

feedDetails2.setId ('B');

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

feedDetails3.setId ('C');

feedDetails3.setPesoLixo (Double.parseDouble (responseLixeiraC.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 (responseLixeiraD.getString (KEY_FIELD4)));

feedList.add (feedDetails1);

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

// Calcula dados das lixeiras

Kalkulačka SmartBinService = nová SmartBinService (); kalkulačka.montaListaLixeiras (feedList);

// Recupera komponenty

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

// Dáta sú aktuálne

Dátum currentTime = Calendar.getInstance (). GetTime (); SimpleDateFormat simpleDate = nové SimpleDateFormat ("dd/MM/rrrr"); Reťazec currentDate = simpleDate.format (currentTime); createDate.setText (KEY_DATE + currentDate + ""); listaDeLixeiras.setAdapter (adaptér);

} catch (JSONException e) {

e.printStackTrace (); }

} else {

Toast.makeText (MainActivity.this, „Pri načítaní údajov sa vyskytla chyba“, Toast. LENGTH_LONG).show ();

}

} }); }

Agora, na telo inicial do aplicativo, serão listados os dados de cada lixeira.

Krok 7: Mostrando bez mapy

Mostrando Žiadna Mapa
Mostrando Žiadna Mapa

Ainda with atividade principal, acaoscac adicionar uma ação and ser relacionada ao Botão Map, at tela inicial.

/ ** Volá sa, keď používateľ klepne na tlačidlo Mapa*/ public void openMaps (Zobraziť zobrazenie) {Intent Intent = new Intent (this, LixeiraMapsActivity.class);

// Passa a lista de lixeiras

Balík balíka = nový balík (); bundle.putParcelableArrayList ("lixeiras", feedList); intent.putExtras (balík);

startActivity (zámer);

}

Žiadna mapa, tems três atividades a executar:

  1. marcar a posição atual do caminha de lixo
  2. marcar os pontos korespondenti a cada lixeira žiadna mapa
  3. traçar a rota entre os pontos

Vykonajú sa buď spoločne, alebo používajú rozhranie API spoločnosti Google. Nasledujú pokyny, ako si vytvoriť príručku a nakresliť smer trasy trasy medzi dvoma miestami pomocou služby Google Directions v aplikácii Google Map Android API V2

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

// Miesta

súkromný LatLng prúd;

súkromná LatLng lixeiraA; súkromné LatLng lixeiraB; súkromné LatLng lixeiraC; súkromné LatLng lixeiraD;.

Viac informácií a žiadna mapa, napríklad:

private void checkLocationandAddToMap () {// Kontrola, či používateľ udelil povolenie if (ActivityCompat.checkSelfPermission (this, android. Manifest.permission. ACCESS_FINE_LOCATION)! = PackageManager. PERMISSION_GRANTED && ActivityCompat.checkSelfPermission ACCESS_COARSE_LOCATION)! = PackageManager. PERMISSION_GRANTED) {// Žiadosť o povolenie polohy ActivityCompat.requestPermissions (this, new String {android. Manifest.permission. ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE); návrat; }

// Načítavanie posledného známeho miesta pomocou Fus

Location location = LocationServices. FusedLocationApi.getLastLocation (googleApiClient);

// MarkerOptions sa používajú na vytvorenie nového Marker. Pomocou MarkerOptions môžete určiť umiestnenie, názov atď

this.current = new LatLng (location.getLatitude (), location.getLongitude ()); MarkerOptions markerOptions = new MarkerOptions (). Position (current).title ("Posição atual");

// Pridanie vytvorenej značky na mapu, presunutie kamery na miesto

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

// Fotoaparát okamžite presuňte na miesto so priblížením 15.

mMap.moveCamera (CameraUpdateFactory.newLatLngZoom (aktuálna, 15));

// Priblíženie, animácia fotoaparátu.

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

}

Em seguida, para cada lixeira, foram criados métodosilila aoo abaixo:

private void addBinALocation () {// Kontrola, či používateľ udelil povolenie, ak (ActivityCompat.checkSelfPermission (this, android. Manifest.permission. ACCESS_FINE_LOCATION)! = PackageManager. PERMISSION_GRANTED && ActivityCompat.checkSelfPermission (this, android. Man. ACCESS_COARSE_LOCATION)! = PackageManager. PERMISSION_GRANTED) {// Žiadosť o povolenie polohy ActivityCompat.requestPermissions (this, new String {android. Manifest.permission. ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE); návrat; }

// Praça da Estação

dvojitá zemepisná šírka = -19,9159578; dvojnásobná dĺžka = -43,9387856; this.lixeiraA = new LatLng (latitude, longitude);

MarkerOptions markerOptions = new MarkerOptions (). Position (lixeiraA).title ("Lixeira A");

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

Vzhľadom na to, že geografické šírky a dĺžky sú k dispozícii, môžete si stiahnuť Mapy Google, a preto nie sú k dispozícii žiadne mapy. Idealmente, estes valores ficariam salvos em um banco de dados (por exampleplo Firebase). Skončite s vývojom hlavného projektu!

O último passo agora é traçar as rotas entre os pontos. Niektoré z najdôležitejších vecí, ktoré môžete využiť, ako jeden z vašich obľúbených bodov, ako aj body na trase!

Naše hlavné ciele sú:

private String getDirectionsUrl (LatLng origin, LatLng dest, List waypointsList) {

// Pôvod trasy

Reťazec str_origin = "origin ="+origin.latitude+","+origin.longitude;

// Cieľ trasy

Reťazec str_dest = "destinácia ="+destin.latitude+","+dest.longitude;

// Trasové body na trase

//waypoints=optimize:true|-19.9227365, -43.9473546 | -19.9168006, -43.9361124 String waypoints = "waypoints = optimize: true"; pre (LatLng point: waypointsList) {waypoints += "|" + point.latitude + "," + point.longitude; }

// Senzor zapnutý

String sensor = "senzor = false";

// Vytváranie parametrov pre webovú službu

Parametre reťazca = str_origin+"&"+str_dest+"&"+senzor+"&"+body na trase;

// Výstupný formát

Výstup reťazca = "json";

// Vytvorenie adresy URL webovej služby

Adresa URL reťazca = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters; System.out.println ("+++++++++++++++++"+URL);

návratová adresa URL;

}

E, por fim, juntando tudo no método principál da classe, onMapReady:

@Override public neplatné 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 (); }

// Nakreslite trasy

// Získanie adresy URL do rozhrania Google Directions API

Zoznam bodov = nový ArrayList (); points.add (lixeiraB); points.add (lixeiraC); points.add (lixeiraD);

Adresa URL reťazca = getDirectionsUrl (aktuálna, lixeiraA, body);

DownloadTask downloadTask = nový DownloadTask (); // Začnite sťahovať údaje json z rozhrania Google Directions API downloadTask.execute (url); }

Aqui passamos apenas pelos pontos principais. O všetkom, čo môžete urobiť, máte k dispozícii konzultácie.

Krok 8: Conclusão

Väčšina projektov spojených s IoT, väčšina z toho, čo má k dispozícii, má jednu z najdôležitejších možností, ako aj zasahovať do rôznych oblastí. Medzi ďalšie možnosti patrí prehrávanie videa, ilustrácie a písma rôznych typov, ktoré nie sú k dispozícii pre Android.

Odporúča: