Sommario:

Pool Pi Guy - Sistema di allarme guidato dall'intelligenza artificiale e monitoraggio della piscina utilizzando Raspberry Pi: 12 passaggi (con immagini)
Pool Pi Guy - Sistema di allarme guidato dall'intelligenza artificiale e monitoraggio della piscina utilizzando Raspberry Pi: 12 passaggi (con immagini)

Video: Pool Pi Guy - Sistema di allarme guidato dall'intelligenza artificiale e monitoraggio della piscina utilizzando Raspberry Pi: 12 passaggi (con immagini)

Video: Pool Pi Guy - Sistema di allarme guidato dall'intelligenza artificiale e monitoraggio della piscina utilizzando Raspberry Pi: 12 passaggi (con immagini)
Video: Estudiosos de Alienígenas As Evidências #extraterrestrial #aliens #uap 2024, Luglio
Anonim
Pool Pi Guy - Sistema di allarme guidato dall'intelligenza artificiale e monitoraggio della piscina utilizzando Raspberry Pi
Pool Pi Guy - Sistema di allarme guidato dall'intelligenza artificiale e monitoraggio della piscina utilizzando Raspberry Pi

Avere una piscina in casa è divertente, ma comporta una grande responsabilità. La mia più grande preoccupazione è monitorare se qualcuno è vicino alla piscina incustodito (soprattutto i bambini più piccoli). Il mio più grande fastidio è assicurarmi che la linea dell'acqua della piscina non scenda mai al di sotto dell'ingresso della pompa, il che farebbe funzionare la pompa a secco e la distruggerebbe costando $$$ in riparazioni.

Di recente ho capito come utilizzare un Raspberry Pi con OpenCV e TensorFlow, insieme a un sensore del livello dell'acqua e un'elettrovalvola per risolvere entrambi i problemi e divertirmi a farlo!

Si rivela anche un ottimo sistema di allarme: attivato dal movimento, controllato dall'intelligenza artificiale, infinitamente personalizzabile.

Immergiamoci.

Passaggio 1: grande piano

In questo tutorial mostreremo come:

  1. Configura un Raspberry Pi con OpenCV e TensorFlow
  2. Collega una webcam tramite un lungo cavo USB
  3. Scrivi un algoritmo OpenCV per rilevare il movimento
  4. Usa TensorFlow per il rilevamento di oggetti
  5. Configura un server web sul Raspberry Pi per mostrare le immagini interessanti
  6. Integrazione con IFTTT per attivare avvisi mobili nel caso in cui venga rilevata una persona
  7. Collegare un HAT relè al Raspberry Pi e collegarlo a un'elettrovalvola che aggiungerebbe acqua alla piscina
  8. Collegare un sensore del livello dell'acqua al Raspberry Pi e interfacciarsi con esso utilizzando il GPIO del Pi
  9. Scrivi del codice per incollare tutto insieme

Passaggio 2: lista della spesa

Lista della spesa
Lista della spesa

Tutti i componenti sono facilmente disponibili su Amazon. Sentiti libero di sperimentare e scambiare componenti: è metà del divertimento!

  1. Lampone Pi
  2. Alimentatore Raspberry Pi (non lesinare qui)
  3. Scheda di memoria (più grande è meglio)
  4. Case (questo è abbastanza grande da ospitare sia il Pi che l'HAT)
  5. Webcam USB (qualsiasi webcam va bene, ma ne vuoi una che ottenga buone immagini e bilancia bene l'illuminazione)
  6. Cavo di prolunga USB (se necessario, misura la distanza tra il Pi e il punto in cui collocheresti la fotocamera)
  7. Scheda relè HAT (questa ha 3 relè e ne abbiamo bisogno solo uno, ma presto troverai un uso per gli altri!)
  8. Solenoide
  9. Solenoide raccordo 1 e raccordo 2 (dipende davvero da cosa si adatta al solenoide, ma questi hanno funzionato per me)
  10. Alimentazione solenoide (qualsiasi 24 V CA andrebbe bene)
  11. Cavo (di nuovo, quasi tutti i cavi a 2 fili andrebbero bene - la corrente è minima)
  12. Interruttore a galleggiante del livello dell'acqua (questo è solo un esempio, controlla cosa può essere facilmente collegato alla tua piscina)
  13. Alcuni cavi jumper e connettori a filo

Passaggio 3: configura il tuo Raspberry Pi

Configura il tuo Raspberry Pi
Configura il tuo Raspberry Pi

Raspberry Pi è un piccolo computer fantastico. Costa solo $ 35, funziona in modo coerente e ha molti software e hardware compatibili. Configurarlo è abbastanza semplice:

  1. Formatta la tua scheda SD. Ciò richiede una cura speciale: Raspberry Pi può essere avviato solo da una scheda SD formattata FAT. Segui queste istruzioni.
  2. Collega il Raspberry Pi a una tastiera e un mouse USB, oltre a un display HDMI e segui le istruzioni nel tutorial Raspberry Pi NOOBS. Assicurati di configurare il WiFi e abilitare l'accesso SSH. Non dimenticare di impostare una password per l'account pi predefinito.
  3. Sulla tua rete domestica imposta un IP statico per Raspberry Pi: renderebbe molto più semplice l'SSH.
  4. Assicurati di avere un client ssh installato sul tuo desktop/laptop. Per un PC consiglierei Putty, che puoi installare da qui.
  5. Scollega l'USB e l'HDMI dal Raspberry Pi, riavvialo e ssh su di esso - se tutto ha funzionato dovresti vedere qualcosa del genere:

Linux raspberrypi 4.14.98-v7+ #1200 SMP mar 12 feb 20:27:48 GMT 2019 armv7l

I programmi inclusi con il sistema Debian GNU/Linux sono software libero; i termini esatti di distribuzione per ogni programma sono descritti nei singoli file in /usr/share/doc/*/copyright. Debian GNU/Linux viene fornito con ASSOLUTAMENTE NESSUNA GARANZIA, nella misura consentita dalla legge applicabile. Ultimo accesso: lun maggio 13 10:41:40 2019 da 104.36.248.13 pi@raspberrypi:~ $

Passaggio 4: imposta OpenCV

Configura OpenCV
Configura OpenCV

OpenCV è una straordinaria raccolta di funzioni di manipolazione delle immagini per la visione artificiale. Ci permetterà di leggere le immagini dalla webcam, manipolarle per trovare aree di movimento, salvarle e altro ancora. L'installazione sul Raspberry Pi non è difficile ma richiede un po' di attenzione.

Inizia installando virtaulenvwrapper: useremo python per eseguire tutta la nostra programmazione e virtualenv ci aiuterebbe a mantenere separate le dipendenze per OpenCV e TensorFlow vs. Flask o GPIO:

pi@raspberrypi:~ $ sudo pip install virtualenvwrapper

Ora puoi eseguire "mkvirtualenv" per creare un nuovo ambiente, "workon" per lavorarci e altro ancora.

Quindi, creiamo un ambiente per la nostra manipolazione delle immagini, con python 3 come interprete predefinito (è il 2019, non c'è motivo di restare con il vecchio python 2):

pi@raspberrypi:~ $ mkvirtualenv cv -p python3

… (cv) pi@raspberrypi:~

Ora siamo pronti per installare OpenCV. Seguiremo principalmente l'eccellente tutorial in Learn OpenCV. Segui in particolare i loro passaggi 1 e 2:

sudo apt -y updateudo apt -y upgrade ## Installa le dipendenze sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm sudo apt-get -y install git gfortran sudo apt-get -y install libjpeg8-dev libjasper- dev libpng12-dev sudo apt-get -y install libtiff5-dev sudo apt-get -y install libtiff-dev sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev sudo apt-get - installa libxine2-dev libv4l-dev cd /usr/include/linux sudo ln -s -f../libv4l1-videodev.h videodev.h sudo apt-get -y installa libgstreamer0.10-dev libgstreamer-plugins-base0. 10-dev sudo apt-get -y install libgtk2.0-dev libtbb-dev qt5-default sudo apt-get -y install libatlas-base-dev sudo apt-get -y install libmp3lame-dev libtheora-dev sudo apt-get -y install libvorbis-dev libxvidcore-dev libx264-dev sudo apt-get -y install libopencore-amrnb-dev libopencore-amrwb-dev sudo apt-get -y install libvresample-dev sudo apt-get -y install x264 v4l-utils sudo apt-get -y install libprotobuf -dev protobuf-compiler sudo apt-get -y install libgoogle-glog-dev libgflags-dev sudo apt-get -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen sudo apt-get install libqtgui4 sudo apt-get install libqt4-get test

Ora possiamo semplicemente installare OpenCV con collegamenti Python all'interno del cv virtualenv (ci sei ancora dentro, giusto?) usando

pip install opencv-contrib-python

E questo è tutto! Abbiamo OpenCV installato sul nostro Raspberry Pi, pronto per catturare foto e video, manipolarli ed essere cool.

Verifica che aprendo un interprete python e importando opencv e verifica che non ci siano errori:

(cv) pi@raspberrypi:~ $ python

Python 3.5.3 (predefinito, 27 settembre 2018, 17:25:39) [GCC 6.3.0 20170516] su linux Digita "help", "copyright", "credits" o "license" per ulteriori informazioni. >>> importa cv2 >>>

Passaggio 5: impostare TensorFlow

Imposta TensorFlow
Imposta TensorFlow

TensorFlow è un framework di machine learning/AI sviluppato e gestito da Google. Ha un ampio supporto per i modelli di deep learning per una varietà di attività, incluso il rilevamento di oggetti nelle immagini, ed è ora abbastanza semplice da installare su Raspberry Pi. Le prestazioni dei suoi modelli leggeri sul piccolo Pi sono di circa 1 fotogramma al secondo, il che è perfettamente adeguato per un'applicazione come la nostra.

In pratica seguiremo l'ottimo tutorial di Edje Electronics, con modifiche rese possibili dalle più recenti distribuzioni TensorFlow:

pi@raspberrypi:~ $ workon cv

(cv) pi@raspberrypi:~ $ pip install tensorflow (cv) pi@raspberrypi:~ $ sudo apt-get install libxml2-dev libxslt-dev (cv) pi@raspberrypi:~ $ pip install pillow lxml jupyter matplotlib cython (cv) pi@raspberrypi:~ $ sudo apt-get install python-tk

Ora dobbiamo compilare il protobuf di Google. Basta seguire le istruzioni nel passaggio 4 dello stesso eccellente tutorial

Infine, clona e imposta le definizioni del modello di TensorFlow: segui il passaggio 5 nel tutorial di Edje Electronics

Sentiti libero di seguire il loro esempio anche nel passaggio 6, è un'ottima introduzione al rilevamento di oggetti sul Raspberry Pi.

Passaggio 6: rilevamento del movimento tramite OpenCV

Iniziamo testando che OpenCV può interfacciarsi con la nostra webcam: ssh nel Raspberry Pi, passa al cv virtualenv (workon cv), apri un interprete python (digita semplicemente python) e inserisci i seguenti comandi python:

importa cv2

cap = cv2. VideoCapture(0) cap.set(cv2. CAP_PROP_FRAME_WIDTH, 1920) cap.set(cv2. CAP_PROP_FRAME_HEIGHT, 1080) ret, frame = cap.read() print('Leggi dimensione fotogramma: {}x{}'.format(frame.shape[1], frame.shape[0])

Con un po' di fortuna vedrai che OpenCV è stato in grado di leggere un frame HD dalla fotocamera.

Puoi usare cv2.imwrite(path, frame) per scrivere quel frame su disco e sftp indietro per dare un'occhiata reale.

La strategia per rilevare il movimento è abbastanza semplice:

  1. Lavora su fotogrammi a risoluzione più bassa: non è necessario operare su Full HD qui
  2. Inoltre, sfoca le immagini per garantire il minor rumore possibile.
  3. Mantieni una media corrente degli ultimi N fotogrammi. Per questa applicazione, dove il frame rate è di circa 1 FPS (solo perché TensorFlow impiega un po' di tempo per frame), ho scoperto che N=60 restituisce buoni risultati. E poiché un'implementazione attenta non richiede più CPU con più frame, va bene (richiede più memoria, ma è trascurabile quando lavoriamo con frame a risoluzione inferiore)
  4. Sottrai l'immagine corrente dalla media corrente (fai attenzione con la digitazione: devi consentire valori positivi e negativi [-255.. 255], quindi il frame deve essere convertito in int)
  5. Puoi eseguire la sottrazione su una conversione in scala di grigi del fotogramma (e della media), oppure farlo separatamente per ciascuno dei canali RGB e quindi combinare i risultati (che è la strategia che ho scelto, rendendolo sensibile ai cambiamenti di colore)
  6. Utilizzare una soglia sul delta e rimuovere il rumore mediante erosione e dilatazione
  7. Infine, cerca i contorni delle aree con un delta: queste aree sono dove è avvenuto il movimento e l'immagine corrente è diversa dalla media delle immagini precedenti. Se necessario, possiamo trovare ulteriori riquadri di delimitazione per questi contorni.

Ho incapsulato il codice per farlo nella classe Python DeltaFinder che puoi trovare nel mio github qui

Passaggio 7: rilevamento di oggetti utilizzando TensorFlow

Se hai seguito la procedura di installazione di TensorFlow, hai già verificato che TensorFlow è installato e funzionante.

Allo scopo di rilevare le persone in una scena generale all'aperto, i modelli pre-addestrati sul set di dati COCO funzionano abbastanza bene, che è esattamente il modello che abbiamo scaricato alla fine dell'installazione di TensorFlow. Abbiamo solo bisogno di usarlo per l'inferenza!

Ancora una volta, ho incapsulato il caricamento e l'inferenza del modello nella classe python TFClassify per semplificare le cose, che puoi trovare qui.

Passaggio 8: configurare un server Web sul Raspberry Pi

Configura un server Web sul Raspberry Pi
Configura un server Web sul Raspberry Pi

Il modo più semplice per accedere ai risultati del rilevamento degli oggetti è un browser web, quindi impostiamo un server web sul Raspberry Pi. Possiamo quindi configurarlo per fornire immagini da una determinata directory.

Ci sono più opzioni per un framework di server web. Ho scelto Flask. È estremamente configurabile e facile da estendere con Python. Poiché la "scala" di cui abbiamo bisogno è banale, era più che sufficiente.

Suggerisco di installarlo in un nuovo virtualenv, quindi:

pi@raspberrypi:~ $ mkvirtualenv webserv

(webserv)pi@raspberrypi: ~ $ pip install Flask

Nota che con una normale configurazione di rete sarà raggiungibile solo quando il tuo browser si trova sulla stessa LAN wireless del tuo Raspberry Pi. Potresti creare una mappatura delle porte / configurazione NAT sul tuo router Internet per consentire l'accesso esterno, ma ti consiglio di non farlo. Il codice che ho scritto non tenta di fornire la sicurezza di cui avresti bisogno quando consenti l'accesso generale a Internet al tuo Raspberry Pi.

Testa la tua installazione seguendo la guida rapida di Flask

Passaggio 9: notifiche mobili da Raspberry Pi utilizzando IFTTT

Notifiche mobili da Raspberry Pi utilizzando IFTTT
Notifiche mobili da Raspberry Pi utilizzando IFTTT

Voglio davvero ricevere notifiche mobili quando si verificano eventi. In questo caso, quando viene rilevata una persona e quando il livello dell'acqua si abbassa. Il modo più semplice che ho trovato per farlo, senza dover scrivere un'app mobile personalizzata, è usare IFTTT. IFTTT sta per "If This Then That" e consente a molti tipi di eventi di attivare molti tipi di azioni. Nel nostro caso, siamo interessati al trigger IFTTT Maker Webhook. Questo ci consente di attivare un'azione IFTTT effettuando una richiesta HTTP POST al server IFTTT con una chiave speciale assegnata al nostro account, insieme ai dati che specificano cosa è successo. L'azione che intraprendiamo può essere semplice come creare una notifica sul nostro dispositivo mobile utilizzando l'app mobile IFTTT o qualcosa di più complesso.

Ecco come farlo:

  1. Crea un account IFTTT su ifttt.com
  2. Dopo aver effettuato l'accesso, vai alla pagina delle impostazioni del servizio Webhook e inserisci l'URL nel tuo browser (qualcosa come https://maker.ifttt.com/use/. Quella pagina web ti mostrerà la tua chiave e l'URL da utilizzare per attivare le azioni.
  3. Crea un'applet IFTTT che genererà una notifica mobile quando il Webhook viene attivato con i dettagli dell'evento:

    1. Fare clic su "Le mie applet" e quindi su "Nuova applet".
    2. Fai clic su "+questo" e scegli "webhook". Fai clic su "Ricevi una richiesta web" per andare ai dettagli
    3. Dai un nome al tuo evento, ad es. "PoolEvent" e fai clic su "Crea trigger"
    4. Fai clic su "+quello" e scegli "notifiche". Quindi scegli "Invia una notifica ricca dall'app IFTTT"
    5. Per "titolo" scegli qualcosa come "PoolPi"
    6. Per "messaggio" scrivi "Pool Pi rilevato: " e fai clic su "aggiungi ingrediente".."Valore1".
    7. Torna all'URL che hai copiato nel passaggio 2. Mostrerà l'URL da utilizzare per richiamare l'applet appena creata. Copia quell'URL, sostituendo il segnaposto {event} con il nome dell'evento (nell'esempio PoolEvent)
  4. Scarica, installa e accedi all'app IFTTT per il tuo dispositivo mobile
  5. Esegui questo script Python sul tuo Raspberry Pi per vederlo funzionare (nota che potrebbero volerci alcuni secondi o minuti per attivarsi sul tuo dispositivo mobile):

richieste di importazione

request.post('https://maker.ifttt.com/trigger/PoolEvent/with/key/', json={"value1":"Hello Notifications"})

Passaggio 10: aggiungere un cappello relè al Raspberry Pi e collegarlo a un'elettrovalvola

Aggiungi un cappello relè al Raspberry Pi e collegalo a un'elettrovalvola
Aggiungi un cappello relè al Raspberry Pi e collegalo a un'elettrovalvola
Aggiungi un cappello relè al Raspberry Pi e collegalo a un'elettrovalvola
Aggiungi un cappello relè al Raspberry Pi e collegalo a un'elettrovalvola
Aggiungi un cappello relè al Raspberry Pi e collegalo a un'elettrovalvola
Aggiungi un cappello relè al Raspberry Pi e collegalo a un'elettrovalvola

Prima di procedere con questo passaggio SPEGNERE il Raspberry Pi: ssh su di esso e digitare "sudo shutdown now", quindi scollegarlo dall'alimentazione

Il nostro obiettivo è accendere e spegnere l'alimentazione a un'elettrovalvola, una valvola che può aprire o chiudere l'alimentazione dell'acqua in base all'alimentazione a 24 V CA che riceve da un alimentatore. I relè sono i componenti elettrici che possono aprire o chiudere un circuito in base a un segnale digitale che il nostro Raspberry Pi può fornire. Quello che facciamo qui è collegare un relè a questi pin del segnale digitale del Raspberry Pi e far chiudere il circuito tra l'alimentatore da 24 V CA e l'elettrovalvola.

I pin sul Raspberry Pi che possono fungere da input o output digitale sono chiamati GPIO - General Purpose Input/Output e sono la fila di 40 pin sul lato del Pi. Con il Pi spento e inserire saldamente il relè HAT in esso. Il HAT che ho scelto ha 3 relè e ne useremo solo uno. Immagina tutto quello che puoi fare con gli altri due:)

Ora riaccendi il Raspberry Pi. Il LED rosso "power" sul relè HAT dovrebbe accendersi, indicando che sta ricevendo alimentazione dal Pi attraverso il GPIO. Proviamo che possiamo controllarlo: ssh di nuovo nel Pi, inserisci python e digita:

import gpiozero

dev = gpiozero. DigitalOutputDevice(26, valore_iniziale = True) dev.off()

Dovresti sentire un "clic" udibile che indica che il relè è impegnato e vedere un LED accendersi che mostra che il primo relè è nella posizione collegata. Ora puoi digitare

dev.on()

Che trasformerebbe il relè in posizione "off" (strano, lo so…) e exit() da python.

Ora utilizzando i cavi jumper e il cavo più lungo collegare il relè tra l'alimentazione 24V e l'elettrovalvola. Vedi il diagramma. Infine, collega l'elettrovalvola a un rubinetto usando gli adattatori e preparati a testare tutto ripetendo i comandi sopra: dovrebbero aprire e chiudere l'acqua.

Collegare un tubo all'elettrovalvola e inserire l'altra estremità in profondità nella piscina. Ora hai un sistema di ricarica della piscina controllato da un computer ed è ora di collegare un sensore per dirgli quando deve funzionare.

Passaggio 11: collegare un sensore di livello dell'acqua

Collegare un sensore di livello dell'acqua
Collegare un sensore di livello dell'acqua
Collegare un sensore di livello dell'acqua
Collegare un sensore di livello dell'acqua
Collegare un sensore di livello dell'acqua
Collegare un sensore di livello dell'acqua
Collegare un sensore di livello dell'acqua
Collegare un sensore di livello dell'acqua

Un sensore di livello dell'acqua è semplicemente un galleggiante che collega un circuito elettrico quando il galleggiante è abbassato e lo rompe quando galleggia. Se lo inserisci nella piscina all'altezza giusta il galleggiante si alza quando il livello dell'acqua è adeguato ma cade quando non c'è abbastanza acqua.

Affinché il Raspberry Pi conosca lo stato del sensore del livello dell'acqua, è necessario che il Pi rilevi un circuito aperto o chiuso. Fortunatamente è molto semplice: gli stessi connettori GPIO che usiamo come uscita digitale per controllare i relè possono fungere da ingressi (da cui la I in GPIO). Nello specifico, se colleghiamo un filo del sensore a +3,3V sul connettore GPIO e l'altro filo del sensore a un pin che configuriamo come ingresso pull-down (nel senso che sarà normalmente a livello di tensione GND), quel pin misurerà una tensione digitale "alta" o "accesa" solo quando il sensore del livello dell'acqua chiude il circuito - quando il livello dell'acqua è basso. Ho usato il pin 16 GPIO come input, che ho contrassegnato nell'immagine sopra.

Il codice Python per configurare il pin come input e testare il suo stato corrente è:

import gpiozero

level_input = gpiozero. Button(16) water_low = level_input.is_pressed

Una potenziale sfida è che quando il sensore cambia semplicemente stato oscillerebbe velocemente tra gli stati on e off. La soluzione a ciò è nota come "antirimbalzo" e cerca un cambiamento di stato coerente prima di agire. La libreria GPIOZERO ha il codice per farlo, ma per qualche motivo quel codice non ha funzionato bene per me. Ho scritto un semplice ciclo per attivare gli avvisi IFTTT quando viene rilevato un cambiamento di stato coerente, che puoi trovare nel mio repository qui.

Passaggio 12: scrivi il codice per legare tutto insieme

Scrivi il codice per legare tutto insieme
Scrivi il codice per legare tutto insieme

Questo è tutto. La nostra configurazione è completa. Puoi scrivere il tuo codice per legare le cose insieme in un sistema completo o utilizzare il codice che fornisco. Per farlo basta creare la struttura della directory e clonare il repository, in questo modo:

mkdir poolpi

cd poolpi git clone

Successivamente, modifica i file denominati ifttt_url.txt nelle directory motion_alert e water_level per avere l'URL per il tuo hook web IFTTT con la tua chiave segreta. Potresti usare due diversi web hook per diverse azioni.

Infine, vogliamo che questo codice venga eseguito automaticamente. Il modo più semplice per farlo è tramite il servizio crontab di Linux. Possiamo aggiungere alcune righe crontab per due attività principali:

  1. Esegui i nostri tre programmi: il rilevatore di oggetti, il sensore del livello dell'acqua e il server web ad ogni riavvio
  2. Pulisci la directory di output, eliminando vecchie immagini e vecchi file video (ho scelto di eliminare i file più vecchi di 1 giorno e le immagini più vecchie di 7 giorni - sentiti libero di sperimentare)

Per farlo, digita crontab -e che aprirà il tuo editor di testo nano. Aggiungi le seguenti righe in fondo al file:

0 1 * * * trova /home/pi/poolpi/output -type f -name "*.avi" -mtime +1 -delete

0 2 * * * find /home/pi/poolpi/output -type f -name "*.jpg" -mtime +7 -delete @reboot python3 /home/pi/poolpi/motion_alert/webserv/webserv.py @reboot python3 /home/pi/poolpi/motion_alert/motion_obj_alert.py @reboot python3 /home/pi/poolpi/water_level/test_water_level.py

Infine, riavvia il tuo Raspberry Pi. Ora è pronto per mantenere la tua piscina piena e sicura.

Armeggia con l'installazione, il codice e non dimenticare di avviare il mio repository github e commentare l'istruzione se lo trovi utile. Cerco sempre di saperne di più.

Felice realizzazione!

Sfida IoT
Sfida IoT
Sfida IoT
Sfida IoT

Secondo classificato nella sfida IoT

Consigliato: