Përmbajtje:
- Hapi 1: Sensori Conectando O
- Hapi 2: Montando a Lixeira
- Hapi 3: Ngarko për një Nuvem
- Hapi 4: Recuperando Dados Do ThingSpeak
- Hapi 5: Krijoni një Aplikim Android
- Hapi 6: Rikuperoni O Feed No Android
- Hapi 7: Mostrando No Mapa
- Hapi 8: Përfundim
Video: SmartBin: 8 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-31 10:25
Kjo është një nga sistemet e inteligjencës së kolektivit, nuk ka aftësi të caktuara për të marrë të dhëna nga një person, duke identifikuar një sasi të caktuar të parashtrimit të të dhënave tona, si dhe rota e coleta traçada, si bazë e informacionit të rikuperimit.
Para montar este projeto, është e nevojshme:
- NodeMCU
- Sensori Ultrassônico de Distancia
- Caixa de papelão
- Protoboard
- Cabos
- Dispozitiv për Android
Hapi 1: Sensori Conectando O
Kryeministri, siguron një mundësi për të hyrë në një sensor ultratinguj të NODEMCU. Për më tepër, vamos conectar si porta shkaktojnë echo do sensor n porta D4 e D3 do NodeMCU:
// përcakton numrat e kunjave #përcakto pino_trigger 2 // D4
#përcakto pino_echo 0 // D3
Për të siguruar një leitura dos dados do sensor, për të mësuar ose mësuar më shumë për FilipeFlop, disponível aqui.
noton cmMsec, inMsec;
mikrosek i gjatë = tejzanor. kohëzgjatja ();
cmMsec = tejzanor.convert (mikrosek, Ultrasonic:: CM);
inMsec = tejzanor.convert (mikrosek, Ultrasonic:: IN);
// Informacionet Exibe nuk kanë monitor serik
Serial.print ("Distancia em cm:");
Serial.print (cmMsec);
Serial.print (" - Distancia em polegadas:");
Serial.println (inMsec);
Të dhënat e vargut = String (cmMsec);
Serial.println (të dhëna);
Hapi 2: Montando a Lixeira
Agora, vamos montar a lixeira inteligente. Precisaremos conectar o sensor ultrassônico no "teto" da lixeira. Për shembull, përdorni kabo dhe fita izoluese. Për më tepër, temos que medir a distância inicial, para saber o valor para a lixeira vazia. Jo meu rast, foi de 26, 3cm. Esse é o valor que konsiderrarmos para uma lixeira vazia.
Për shembull, ju mund të shihni se si mund të përdorni një sensor ultratinguj, nëse keni një mundësi për të zgjedhur një distancë nga 4 distanca të ndryshme.
// Simulando 4 liksera
lixeiraID i gjatë;
lak void () {
lixeiraID = e rastësishme (1, 5);
}
Hapi 3: Ngarko për një Nuvem
Agora, precisamos enviar estes dados para a nuvem. Eu escolhi o ThingSpeak, nga familidade com o mesmo. Kryeministri, është e nevojshme criar um novo kanal, të marrë 4 parâmetros, referentes ao volume de cada lixeira.
Ndajeni me një aplikim në ThingSpeak, është e nevojshme të ruani një numër API nga kriza e kanalit. Siga os passos descritos nuk ka faqe zyrtare.
Aplikimi, përdorimi i një biblioteca ESP8266WiFi.h para se të arrihet në lidhje me ThingSpeak, dhe transferimin e të dhënave.
Primeiramente, uma função para efetuar conexão com a rede (përcakto previamente duas variáveis, ssid e kalojë , pretendon o identifikues e a senha de sua rede).
void connectWifi () {
Serial.print ("Lidhu me"+ *ssid);
WiFi.filloni (ssid, kaloni);
ndërsa (WiFi.status ()! = WL_CONNECTED) {
vonesë (500);
Serial.print (".");
}
Serial.println ("");
Serial.print ("Conectado na rede");
Serial.println (ssid);
Serial.print ("IP:");
Serial.println (WiFi.localIP ());
}
Sigurohuni që të konfiguroni, përpiquni të arrini një përshtatje në një mënyrë.
void setup () {
Serial.filloj (9600);
Serial.println ("Lendo dados do sensor …");
// Lidhu me Wi-Fi
connectWifi ();
}
E, para se të sigurohemi për o ThingSpeak, mund të përdorni një lidhje HTTP, të kaloni dhe të përdorni API dhe sistemin tuaj.
void sendDataTS (noto cmMsec, id e gjatë) {
if (client.connect (server, 80)) {
Serial.println ("Enviando dados para o ThingSpeak");
String postStr = apiKey;
postStr += "& fushë";
postStr += id;
postStr += "=";
postStr += String (cmMsec);
postStr += "\ r / n / r / n";
Serial.println (postStr);
client.print ("POST /përditëso HTTP /1.1 / n");
client.print ("Pritësi: api.thingspeak.com / n");
client.print ("Lidhja: mbyll / n");
client.print ("X-THINGSPEAKAPIKEY:" + apiKey + "\ n");
client.print ("Lloji i Përmbajtjes: aplikacioni/x-www-form-urlencoded / n");
client.print ("Përmbajtja-Gjatësia:");
klient.print (postStr.length ());
client.print ("\ n / n");
klient.print (postStr);
vonesa (1000);
}
client.stop ();
}
O Primeiro parâmetro korrespondon à distância em centímetros encontrada pelo sensor ultrassônico. O segundo parâmetro é o ID për lixeira que foi lida (que foi gerado randomicamente, um número de 1 a 4).
O ID -ja juaj do të shërbejë vetëm për identifikimin paraprak të cilësisë së shërbimit ose ngarkimit të një forme të fortë.
Hapi 4: Recuperando Dados Do ThingSpeak
O ThingSpeak permite efetuar leitura dos dados do seu canal, através de um serviço retornando um JSON. Si diferentes opções para leitura do feed do seu canal estão descritas aqui:
www.mathworks.com/help/thingspeak/get-a-ch…
Neste projeto, optou-se por ler diretamente os dados de cada campo. Opsioni i URL -së për këtë vlerësim është:
api.thingspeak.com/channels/CHANNEL_ID/fields/FIELD_NUMBER/last.json?api_key=API_KEY&status=true
Cada campo está descrito nuk ka lidhje informacioni paraprak. Os mais importantes para ose projeto são:
- CHANNEL_ID: número do seu kanal
- FIELD_NUMBR: o número do campo
- API_KEY: një chave de API do seu canal
Ashtë një URL që lidhet me aplikacionin Android, për të rimarrë sistemin tuaj për të bërë ThingSpeak.
Hapi 5: Krijoni një Aplikim Android
Nuk ka Android Studio, mund të përdorni një version të ri Android. Për shembull, për funksionimin e aplikacionit, është e nevojshme konfigurimi si i lejuar të funksionojë pa AndroidManifest.
Përdorimi i Google Maps, është e nevojshme të përdorni një kërkesë në Google. Siga os passos descritos nuk ka lidhje Obter chave de API.
Uma vez com a chave, você deve também configurá-la na aplicação.
Çelësi API për API-të e bazuara në Google Maps përcaktohet si një burim vargu.
(Shih skedarin "res/values/google_maps_api.xml").
Vini re se çelësi API është i lidhur me çelësin e kriptimit të përdorur për të nënshkruar APK. Keni nevojë për një çelës të ndryshëm API për secilin çelës kriptimi, përfshirë çelësin e lëshimit që përdoret për të nënshkruar APK për publikim. Ju mund të përcaktoni çelësat për objektivat e korrigjimit dhe lëshimit në src/debug/dhe src/release/.
<meta-të dhëna
android: name = "com.google.android.geo. API_KEY"
android: value = "@string /google_maps_key" />
Një konfigurim i përfunduar është duke filluar nga sistemi AndroidManifest, i cili mund të krijohet.
n
Hapi 6: Rikuperoni O Feed No Android
Përcaktoni parimin pa Android, MainActivity, crie 4 variacione për identitetin tuaj, nëse ju mund të bëni ThingSpeak a liders:
vargu privat url_a = "https://api.thingspeak.com/channels/429823/fields/1/last.json?api_key="+API_THINGSPEAK_KEY+"&status=vërtetë"; vargu privat url_b = "https://api.thingspeak.com/channels/429823/fields/2/last.json?api_key="+API_THINGSPEAK_KEY+"&status=tvërtetë"; vargu privat url_c = "https://api.thingspeak.com/channels/429823/fields/3/last.json?api_key="+API_THINGSPEAK_KEY+"&status=tvërtetë"; vargu privat url_d = "https://api.thingspeak.com/channels/429823/fields/4/last.json?api_key="+API_THINGSPEAK_KEY+"&status=tvërtetë";
Për të siguruar një leitura dos dados, përdorni përdorimin e tij ose të sistemit operativ Android, chamada JSONObject. Për më tepër, klikoni këtu për adresën e URL -së:
JSONObject përgjigjeLixeiraA; JSONObject replyLixeiraB; JSONObject replyLixeiraC; JSONObject replyLixeiraD;
Për abrir a conexão com si urls, vamos usar criar uma classe auxiliar, chamada HttpJsonParser. Për më tepër, ju mund të përgjigjeni për një lidhje të shkurtër me URL -në tuaj, duke përdorur një dosje të mirë të të dhënave, duke bërë një retornar ose një objekt JSON montado.
publike JSONObject makeHttpRequest (Url -ja e vargut, metoda e vargut, kornizat e hartave) {
provo {
Uri. Builder builder = ri Uri. Builder (); URL urlObj; String encodedParams = ""; if (params! = null) {për (Harta. Hyrja hyrëse: params.entrySet ()) {builder.appendQueryParameter (entry.getKey (), entry.getValue ()); }} if (builder.build (). getEncodedQuery ()! = null) {encodedParams = builder.build (). getEncodedQuery ();
}
if ("GET". barazon (metoda)) {url = url + "?" + Parame të koduara; urlObj = URL e re (url); urlConnection = (HttpURLConnection) urlObj.openConnection (); urlConnection.setRequestMetoda (metoda);
} tjetër {
urlObj = URL e re (url); urlConnection = (HttpURLConnection) urlObj.openConnection (); urlConnection.setRequestMetoda (metoda); urlConnection.setRequestProperty ("Lloji i Përmbajtjes", "aplikacioni/x-www-forma-urlencoded"); urlConnection.setRequestProperty ("Përmbajtja-Gjatësia", String.valueOf (koduarParams.getBytes (). gjatësia)); urlConnection.getOutputStream (). shkruaj (encodedParams.getBytes ()); } // Lidhu me serverin urlConnection.connect (); // Lexoni përgjigjen është = urlConnection.getInputStream (); Lexuesi BufferedReader = BufferedReader i ri (InputStreamReader i ri (është)); StringBuilder sb = new StringBuilder (); Linja e vargut;
// Analizoni përgjigjen
ndërsa ((line = reader.readLine ())! = null) {sb.append (rreshti + "\ n"); } eshte afer(); json = sb.toString (); // Shndërroni përgjigjen në JSON Object jObj = JSONObject i ri (json);
} kap (UnsupportedEncodingException e) {
e.printStackTrace (); } catch (ProtocolException e) {e.printStackTrace (); } kap (IOException e) {e.printStackTrace (); } catch (JSONException e) {Log.e ("JSON Parser", "Gabim në analizimin e të dhënave" + e.toString ()); } catch (Përjashtim e) {Log.e ("Përjashtim", "Gabim në analizimin e të dhënave" + e.toString ()); }
// ktheje Objektin JSON
kthehu jObj;
}
}
Në bazë të një drejtori të veçantë, shikoni të dhënat e url -ve të chamada -s nga forma e formës së informacionit, mbani mend për një dentro të bërë me metoda të bëra në sfond.
@Override mbrojtur String doInBackground (String … params) {HttpJsonParser jsonParser = i ri HttpJsonParser ();
respondLixeiraA = jsonParser.makeHttpRequest (url_a, "GET", null);
respondLixeiraB = jsonParser.makeHttpRequest (url_b, "GET", null); respondLixeiraC = jsonParser.makeHttpRequest (url_c, "GET", null); respondLixeiraD = jsonParser.makeHttpRequest (url_d, "GET", null);
kthehu null;}
Quando o método doInBackgroundé encerrado, ose kontrolloni ekzekutimin e Android passa për metoda nëPostExecute. Neste método, vamos criar os objetos Lixeira, e popullarizuar com os dados recuperados do ThingSpeak:
zbrazëti e mbrojtur onPostExecute (Rezultati i vargut) {pDialog.dismiss (); runOnUiThread (Runnable i ri () {drejtimi publik i pavlefshëm () {
// ListView listView = (ListView) findViewById (R.id.feedList);
Shiko mainView = (Shiko) findViewById (R.id.activity_main); nëse (suksesi == 1) {provo {// Cria feedDetail para cada lixeira Lixeira feedDetails1 = Lixeira e re (); Lixeira feedDetails2 = Lixeira e re (); Lixeira feedDetails3 = Lixeira e re (); Lixeira feedDetails4 = Lixeira e re ();
feedDetails1.setId ('A');
feedDetails1.setPesoLixo (Double.parseDouble (respondLixeiraA.getString (KEY_FIELD1)))); feedDetails1.setVolumeLixo (Double.parseDouble (respondLixeiraA.getString (KEY_FIELD1))));
feedDetails2.setId ('B');
feedDetails2.setPesoLixo (Double.parseDouble (respondLixeiraB.getString (KEY_FIELD2)))); feedDetails2.setVolumeLixo (Double.parseDouble (respondLixeiraB.getString (KEY_FIELD2))));
feedDetails3.setId ('C');
feedDetails3.setPesoLixo (Double.parseDouble (respondLixeiraC.getString (KEY_FIELD3)))); feedDetails3.setVolumeLixo (Double.parseDouble (respondLixeiraC.getString (KEY_FIELD3))));
feedDetails4.setId ('D');
feedDetails4.setPesoLixo (Double.parseDouble (respondLixeiraD.getString (KEY_FIELD4)))); feedDetails4.setVolumeLixo (Double.parseDouble (respondLixeiraD.getString (KEY_FIELD4))));
feedList.add (feedDetails1);
feedList.add (feedDetails2); feedList.add (feedDetails3); feedList.add (feedDetails4);
// Llogaritja dados das lixeiras
Llogaritësi i SmartBinService = SmartBinService i ri (); calculator.montaListaLixeiras (feedList);
// Përbërësit Recupera
TextView createDate = (TextView) mainView.findViewById (R.id.date); ListView listaDeLixeiras = (ListView) findViewById (R.id.lista); përshtatës.addAll (feedList);
// Të dhënat atuale
Data aktualeTime = Calendar.getInstance (). GetTime (); SimpleDateFormat simpleDate = ri SimpleDateFormat ("dd/MM/vvvv"); String currentDate = simpleDate.format (currentTime); createDate.setText (KEY_DATE + currentDate + ""); listaDeLixeiras.setAdapter (përshtatës);
} kap (JSONException e) {
e.printStackTrace (); }
} tjetër {
Toast.makeText (MainActivity.this, "Ndodhi një gabim gjatë ngarkimit të të dhënave", Toast. LENGTH_LONG).shfaq ();
}
} }); }
Agora, në mënyrë zyrtare do të aplikohet, duke përdorur listën e të drejtave të cada lixeira.
Hapi 7: Mostrando No Mapa
Ainda na atividade principal, vamos adicionar uma ação a ser relacionada ao botão Mapa, në tela zyrtare.
/ ** Thirret kur përdoruesi prek butonin Mapa*/ public void openMaps (Shiko pamjen) {Qëllimi i synimit = Synimi i ri (kjo, LixeiraMapsActivity.class);
// Passa a lista de lixeiras
Pako pako = pako e re (); pako.putParcelableArrayList ("lixeiras", feedList); qëllim.putExtras (pako);
startActivity (synim);
}
Asnjë hartë, tema nuk i takon një ekzekutuesi:
- marcar a posição atual do caminha de lixo
- korrespondentët e marcar os pontos a cada lixeira no mapa
- traçar a rota entre os pontos
Për ekzekutuesin e sistemit operativ, përdorni një API Google Directions. Për më tepër, mësoni si të mësoni Vizatimi i drejtimeve të rrugës së vozitjes midis dy vendndodhjeve duke përdorur Drejtimet e Google në Google Map Android API V2
Primeiro, vamos criar localidades para cada um dos pontos que desejamos marcar:
// Vendndodhjet
private LatLng aktuale;
private LatLng lixeiraA; private LatLng lixeiraB; private LatLng lixeiraC; private LatLng lixeiraD;.
Për më tepër informacion për një hartë të njëjtë, për një krizë ose metodë:
privat void checkLocationandAddToMap () {// Kontrollimi nëse përdoruesi e ka dhënë lejen nëse (ActivityCompat.checkSelfPermission (kjo, android. Manifest.permission. ACCESS_FINE_LOCATION)! = PackageManager. PERMISSION_GRANTED && ActivityComerm.pack. ACCESS_COARSE_LOCATION)! = PackageManager. PERMISSION_GRANTED) {// Kërkimi i lejes së vendndodhjes ActivityCompat.questPermission (this, new String {android. Manifest.permission. ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE); kthim; }
// Marrja e vendndodhjes së fundit të njohur duke përdorur Fus
Vendndodhja e vendndodhjes = LocationServices. FusedLocationApi.getLastLocation (googleApiClient);
// MarkerOptions janë përdorur për të krijuar një Marker të ri. Ju mund të specifikoni vendndodhjen, titullin etj me MarkerOptions
this.current = i ri LatLng (location.getLatitude (), location.getLongitude ()); MarkerOptions markerOptions = MarkerOptions të reja (). Pozicioni (aktual).titull ("Posição atual");
// Shtimi i shënuesit të krijuar në hartë, zhvendosja e kamerës në pozicion
markerOptions.icon (BitmapDescriptorFactory.defaultMarker (BitmapDescriptorFactory. HUE_GREEN)); System.out.println ("+++++++++++++++ Passei aqui! +++++++++++++++"); mMap.addMarker (shënuesitOpsionet);
// Zhvendoseni kamerën menjëherë në vendndodhje me një zmadhim prej 15.
mMap.moveCamera (CameraUpdateFactory.newLatLngZoom (aktuale, 15));
// Zmadhoni, animoni kamerën.
mMap.animateCamera (CameraUpdateFactory.zoomTo (14), 2000, null);
}
Em seguida, para cada lixeira, foram criados métodos similares ao abaixo:
private void addBinALocation () {// Kontrollimi nëse përdoruesi ka dhënë lejen nëse (ActivityCompat.checkSelfPermission (kjo, android. Manifest.permission. ACCESS_FINE_LOCATION)! = PackageManager. PERMISSION_GRANTED && ActivityCompat.checkSelfpermission (kjo, ACCESS_COARSE_LOCATION)! = PackageManager. PERMISSION_GRANTED) {// Kërkimi i lejes së vendndodhjes ActivityCompat.questPermission (this, new String {android. Manifest.permission. ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE); kthim; }
// Praça da Estação
gjerësi gjeografike të dyfishtë = -19.9159578; gjatësi e dyfishtë = -43.9387856; this.lixeiraA = LatLng e re (gjerësi, gjatësi gjeografike);
MarkerOptions markerOptions = MarkerOptions të reja (). Pozicioni (lixeiraA).titull ("Lixeira A");
markerOptions.icon (BitmapDescriptorFactory.defaultMarker (BitmapDescriptorFactory. HUE_RED)); mMap.addMarker (shënuesitOpsionet); }
Si pozicione në gjerësinë gjeografike dhe gjatësinë gjeografike për të gjetur riparimet e përdorura në Google Maps, ju mund të rregulloni asnjë kod. Idealmente, vlerëson vlerat e shpëtimit të em um banco de dados (për shembull, Firebase). Será a primeira evolução deste projeto!
O último passo agora é traçar as rotas entre os pontos. Për më tepër, um conceito muito importante, dhe që mund të përdorni nga fjala në rrugën e parë, në sao Waypoints!
Foi criado um metodo para traçar a rota entre dois dados pontos:
private String getDirectionsUrl (origjina LatLng, dest LatNng, Lista e pikave të listës) {
// Origjina e itinerarit
String str_origin = "origjina ="+origjina. Gjerësia+","+origjina.gjatësia;
// Destinacioni i itinerarit
String str_dest = "destinacioni ="+dest.latitude+","+dest.litude;
// Pikat e rrugës përgjatë itinerarit
//waypoints=optimize:vërteta-19-19,9227365, -43.9473546 | -19.9168006, -43.9361124 Pika rrugësh vargëzuese = "pika udhërrëfyese = zgjedh: e vërtetë"; për (Pika LatLng: waypointsList) {pikat e rrugës += "|" + pikë. gjerësi + "," + pikë. gjatësi; }
// Sensori i aktivizuar
Sensori i vargut = "sensor = i rremë";
// Ndërtimi i parametrave për shërbimin në internet
Parametrat e vargut = str_origin+"&"+str_dest+"&"+sensor+"&"+pikat e rrugës;
// Formati i daljes
String output = "json";
// Ndërtimi i url në shërbimin në internet
Url string = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parametra; System.out.println ("++++++++++++++++"+url);
url e kthimit;
}
E, por fim, juntando tudo no método principal da classe, onMapReady:
@Përfundo zbrazëtirën publike 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 (); }
// Vizatoni rrugë
// Marrja e URL -së në API -në e Google Directions
Lista e pikave = ArrayList e re (); pikë.shto (lixeiraB); pikë.shtoj (lixeiraC); pikë.shtoj (lixeiraD);
Url string = getDirectionsUrl (aktuale, lixeiraA, pikë);
DownloadTask downloadTask = e re DownloadTask (); // Filloni shkarkimin e të dhënave json nga API të Drejtimeve të Google downloadTask.execute (url); }
Aqui passamos apenas pelos pontos principais. Ju mund të përfundoni me ndihmën e shpërndarjes së konsulencës.
Hapi 8: Përfundim
Este foi um projeto trabalhando conceitos de IoT, më së shumti ju mund të përdorni të dhëna të lidhura me disponueshmërinë e atraveve të reja, duke përdorur një vendim për ndërhyrjen e një humane direta. Për më tepër, shikoni se çfarë të bëjmë për të përfunduar, për ilustrim, për shkronjat e dhëna të të dhënave në kriadat pa Android.
Recommended:
Si të bëni 4G LTE Antenë të BiQuade të Dyfishtë Hapa të Lehtë: 3 Hapa
Si të bëni 4G LTE Antenë BiQuade të Dyfishtë Hapa të Lehtë: Shumicën e kohës me të cilën jam përballur, nuk kam forcë të mirë të sinjalit në punët e mia të përditshme. Kështu që. Kërkoj dhe provoj lloje të ndryshme antenash por nuk funksionoj. Pas humbjes së kohës gjeta një antenë që shpresoj ta bëj dhe ta provoj, sepse është parimi i ndërtimit jo
Dizajni i lojës në lëvizje në 5 hapa: 5 hapa
Dizajni i lojës në Flick në 5 hapa: Flick është një mënyrë vërtet e thjeshtë për të bërë një lojë, veçanërisht diçka si një enigmë, roman vizual ose lojë aventure
Zbulimi i fytyrës në Raspberry Pi 4B në 3 hapa: 3 hapa
Zbulimi i fytyrës në Raspberry Pi 4B në 3 hapa: Në këtë Instructable ne do të bëjmë zbulimin e fytyrës në Raspberry Pi 4 me Shunya O/S duke përdorur Bibliotekën Shunyaface. Shunyaface është një bibliotekë për njohjen/zbulimin e fytyrës. Projekti synon të arrijë shpejtësinë më të shpejtë të zbulimit dhe njohjes me
SmartBin: 4 hapa
SmartBin: Qëllimi kryesor i këtij projekti është të krijojë një pajisje elektronike e cila përdor të paktën një Raspberry Pi. Ekipi është i përbërë nga 5 inxhinierë të ardhshëm mekanikë dhe një inxhinier automatizimi. Projekti ynë konsiston në bërjen e një kazani plehrash që hapet dhe mbyllet
Qëndrim për laptopë me 3 hapa dhe 3 hapa (me syze leximi dhe tabaka me stilolaps): 5 hapa
Qëndrim për laptopë me hapa 3 & 3 hapa (me syze leximi dhe tabaka për stilolapsa): Kjo $ 3 & Qëndrimi i laptopit me 3 hapa mund të bëhet brenda 5 minutave. It'sshtë shumë e fortë, me peshë të lehtë dhe mund të paloset për ta marrë kudo që të shkoni