Costruisci un sensore di umidità Raspberry Pi per monitorare le tue piante

In questo tutorial, ho intenzione di sfruttare la suggestione di Raspberry Pi per costruire un sensore di umidità per un vaso. Sarai in grado di monitorare il sensore localmente sullo schermo LCD o da remoto, tramite ControlMyPi.com, e ricevere e-mail quotidiane se l'umidità scende al di sotto di un livello specificato.

Lungo la strada farò:

  • cablare e leggere un valore da un sensore analogico su SPI utilizzando una breadboard
  • formattare il sensore leggendolo bene nella console
  • visualizzare la lettura del sensore su un display LCD RGB
  • chiedi a Raspberry Pi di inviare un'e-mail con la lettura del sensore
  • monitorare facilmente il sensore e alcune letture storiche sul web

Questo è ciò che stiamo creando in questo tutorial.

Forniture hardware

Per ottenere il massimo da questo tutorial, è consigliabile acquisire quanto segue:

  • Raspberry Pi model B ($ 40)
  • Connessione Internet cablata o wireless
  • Breadboard half-size ($ 5)
  • Sei cavi ponticello femmina-maschio
  • Cavi ponticello maschio-maschio (varie lunghezze)
  • MCP3008 ($ 3,75) - Convertitore A / D a 8 canali a 8 bit con interfaccia seriale SPI
  • Mattone sensore di umidità del suolo di polpo ($ 4,50)
  • Adafruit RGB Negativo 16x2 LCD + Kit tastiera per Raspberry Pi ($ 25) assemblato con l'intestazione Stacking per Raspberry Pi - 2x13 Extra alto ($ 2)

I componenti

Alcuni componenti alternativi

  • Invece del sensore di umidità del terreno, è possibile utilizzare qualsiasi tipo di sensore analogico a tensione variabile o anche solo un resistore variabile per il test.
  • È possibile utilizzare un MCP3004 (SPI ADC a 4 canali più piccolo) se lo si desidera, ma il cablaggio sarà diverso.
  • È possibile saltare il display LCD RGB o sostituirlo con uno schermo alternativo. Dovrai rimuovere o modificare alcune righe nello script finale, se lo fai.

Il costo

Dopo aver aggiunto alcuni dollari per i cavi dei ponticelli, il costo totale del progetto si risolve all'incirca a $ 55 senza il display LCD e $ 82 con. Ricorda, però, che stai rifornendo il tuo kit di elettronica: tutte queste parti possono essere riutilizzate per altri progetti.


1. Cablaggio

Se si utilizza il display LCD con l'intestazione di impilamento, collegarlo ora al Raspberry Pi. Le prime due fasi del software non usano il display LCD, ma in questo modo ti risparmieranno un po 'di tempo dopo se lo colleghi adesso.

Avvertenza: un cablaggio errato potrebbe danneggiare il tuo Raspberry Pi. Assicurati di ricontrollare attentamente tutte le connessioni prima di accenderlo.

Passaggio 1: alimentazione e binari di terra


Power e Ground Rails

A sinistra nella foto è possibile vedere i ponticelli rosso e nero che vanno ai binari + e - sulla breadboard. Per aiutare a descrivere le connessioni dall'intestazione, fare riferimento a questa tabella dei colori dei fili. Ogni cella nella tabella fa riferimento a un pin nell'intestazione Raspberry Pi. Il colore della cella corrisponde al colore del cavo jumper come mostrato nella foto:


Grafico di cablaggio

Collegare il pin 1 alla guida positiva e il pin 6 alla barra di messa a terra.

Passaggio 2: MCP3008

Importante: il chip deve essere posizionato sopra la valle nella breadboard con l'indicatore pin 1, la rientranza, in alto a destra come nella foto.


MCP3008

Fare riferimento a questa tabella dei colori dei fili e alla scheda tecnica quando si collega questo chip:


Tavola dei colori del filo

Tutte le connessioni dalle rotaie e dalla testata al chip MCP3008 vanno ordinatamente lungo la fila inferiore del chip in questo orientamento. Innanzitutto collegare l'alimentazione e il terreno come mostrato nella foto sopra:

  • Ferrovia di terra a DGND
  • Binario di terra per AGND
  • Rotaia di potenza a VREF
  • Binario di alimentazione per VDD

Quindi, collegare i pin dell'header Raspberry Pi SPI al chip:

  • Intestazione da 26 a CS
  • Testata da 19 a DIN
  • Intestazione 21 a DOUT
  • Intestazione 23 a CLK

MCP3008 Collegato

Passaggio 3: sensore


Cablaggio del sensore di umidità

Il cablaggio del sensore è semplice; ci sono tre connessioni da fare:

  • Sensore giallo a CH5
  • Sensore rosso per alimentare la guida
  • Sensore da nero a terra
Mancia: Se nella casella degli strumenti sono presenti alcuni pin di riserva, è possibile inserirli nella presa femmina sul sensore Octopus per formare una spina a tre pin. Ciò semplifica l'inserimento nella breadboard. In alternativa, il ponticello può essere utilizzato direttamente nella spina.
Cablaggio del sensore

Infine, se hai il tuo vaso di piante a portata di mano, puoi inserire la sonda nel terreno ora. Assicurati di non spingerlo troppo in profondità, basta coprire i poli:


Il sensore di umidità

2. Preparazione dell'ambiente software

Passaggio 1: Sistema operativo

Questo progetto è stato realizzato utilizzando Occidentalis v0.2 da Adafruit, fornito con il driver hardware SPI pronto per l'uso. Segui le istruzioni sul sito di Adafruit per installarlo sul tuo Raspberry Pi.

Mancia: Se si utilizza il download Wheezy dal sito Raspberry Pi, sarà necessario trovare e seguire alcuni passaggi per abilitare il driver SPI da soli ...

Passaggio 2: Utilità richieste

git - Dovresti già averlo (prova a digitare idiota) in caso contrario, installarlo con: sudo apt-get install git
pip - installalo con: sudo apt-get install python-pip

Passaggio 3: SPI Python Wrapper

Tutto il codice per questo progetto è scritto in Python. Abbiamo bisogno di un wrapper Python per il driver SPI in modo che possiamo leggere i valori dal sensore su SPI:

 cd ~ git clone git: //github.com/doceme/py-spidev cd py-spidev / sudo python setup.py installa

Passaggio 4: Adafruit Python Library

Avrai già installato la libreria Adafruit durante l'assemblaggio e il test del tuo LCD. Assicurati di conoscere la posizione della libreria in quanto ciò sarà necessario dal codice del progetto.

Passaggio 5: Libreria ControlMyPi

ControlMyPi è un servizio per creare rapidamente e facilmente pannelli di controllo su Internet dagli script Python Raspberry Pi. Usa pip per installarlo:

 sudo pip installa controlmypi

Passaggio 6: codice progetto

Tutto il codice di questo tutorial può essere scaricato in questo modo:

 cd ~ mkdir py cd py git clone git: //github.com/jerbly/tutorials

Dovrai modificare alcuni di questi file per fornire nomi utente, password e percorsi di file. Questo è spiegato mentre andiamo.


3. Lettura di un valore dal sensore

L'MCP3008 converte la tensione di ingresso in un numero compreso tra 0 e 1023 (10 bit). È quindi possibile leggere questo valore su SPI (le connessioni verdi e bianche per l'intestazione sul Pi). Il pacchetto py-spidev ci consente di farlo da Python.

C'è una certa complicanza con la lettura di un numero a 10 bit in un sistema a 8 bit. Il driver SPI restituirà due parole a 8 bit e siamo interessati agli ultimi 2 bit della prima parola seguiti da tutti gli 8 bit della parola successiva. Per trasformarlo in un numero con cui possiamo lavorare dobbiamo mascherare e poi spostare a sinistra di 8 i 2 bit della prima parola prima di aggiungere la seconda parola.

Non ti devi preoccupare di scrivere questo codice, perché nel download ho incluso il modulo mcp3008.py per occuparmene. Puoi usare una shell Python interattiva per testare la tua configurazione SPI e il tuo cablaggio in questo modo:

 pi @ raspberrypi ~ / py / tutorial / umidità $ sudo python Python 2.7.3 (predefinito, 13 gennaio 2013, 11:20:46) [GCC 4.6.3] su linux2 Digitare "help", "copyright", "credits" o "licenza" per ulteriori informazioni. >>> import mcp3008 >>> mcp3008.readadc (5) 444

Importante: Devi eseguire Python con sudo in modo da poter accedere al driver del dispositivo SPI.

Se hai problemi, prima controlla il tuo cablaggio. Quindi ricontrollare i passaggi di installazione del software sopra. Se si utilizza il sensore di umidità Octopus, tenere i poli per fare un collegamento con la mano. Altrimenti, probabilmente leggerà solo zero.

Qui è possibile rimuovere il sensore dall'equazione collegando un ponticello dalla barra di alimentazione a, ad esempio, CH1 e quindi utilizzando readadc (1). Questo dovrebbe restituire 1023 (o vicino ad esso). Allo stesso modo, una connessione dal ground rail dovrebbe restituire 0.


programmi

Programma 1: monitoraggio nella console

Il primo programma estende semplicemente ciò che abbiamo praticato nella console interattiva per includere un ciclo in modo che il valore del sensore sia stampato continuamente:

 dal momento dell'importazione importazione del sonno mcp3008 mentre True: m = mcp3008.readadc (5) stampa "Livello di umidità: :> 5" .format (m) sleep (.5)

Si noti che c'è un sonno di mezzo secondo nel ciclo. Questo è così il rendimento del programma; lascia il posto ad altri processi. Altrimenti consumerebbe un sacco di tempo della CPU e altri processi che si stanno eseguendo non si comporterebbero così bene. Una lettura due volte al secondo è probabilmente decisamente troppo, sicuramente per un sensore di umidità.

L'output dovrebbe essere così:

 pi @ raspberrypi ~ / py / tutorial / umidità $ sudo python umido_cmd.py Livello di umidità: 452 Livello di umidità: 486 Livello di umidità: 485 Livello di umidità: 483 Livello di umidità: 489 Livello di umidità: 491 Livello di umidità: 490 ^ CTraceback (chiamata più recente ultimo): file "umid_cmd.py", riga 7, in  sleep (.5) KeyboardInterrupt pi @ raspberrypi ~ / py / tutorial / umidità $

Basta premere Control-C quando hai finito e il programma uscirà come sopra.

Programma 2: migliore monitoraggio della console

Questo programma migliora la visualizzazione sulla console. Invece di stampare il valore sullo schermo in una finestra a scorrimento, questo script creerà un effetto dashboard. Ogni lettura del sensore è scritta sopra l'ultima, quindi la finestra non scorre.

Anche gli sfondi rossi, gialli e verdi sono usati come luci del semaforo. Quando il terreno è ben irrigato, lo sfondo sarà verde. Quando è troppo secco mostrerà il rosso.

Per ottenere questa colorazione, vengono usati speciali codici di escape ANSI per inviare comandi alla console. Ogni sequenza di codice di escape inizia con \ x1b [seguito dai codici di comando per produrre un effetto.

 dal momento dell'importazione importazione del sonno mcp3008 # codici di escape ANSI PREVIOUS_LINE = "\ x1b [1F" RED_BACK = "\ x1b [41; 37m" GREEN_BACK = "\ x1b [42; 30m" YELLOW_BACK = "\ x1b [43; 30m" RESET = "\ x1b [0m" # Cancella lo schermo e posiziona il cursore nella parte superiore della stampa '\ x1b [2J \ x1b [H' print 'Sensore di umidità' stampa '=============== \ n 'while True: m = mcp3008.readadc (5) se m < 150: background = RED_BACK elif m < 500: background = YELLOW_BACK else: background = GREEN_BACK print PREVIOUS_LINE + background + "Moisture level: :>5 ".format (m) + RESET sleep (.5)

Il programma cancella lo schermo e visualizza un titolo. Passa quindi di nuovo nel ciclo perpetuo, ma questa volta utilizza le soglie per determinare il colore di sfondo. Infine, vengono stampate le sequenze di escape e il testo seguiti da a RESET sequenza per spegnere il colore. Il PREVIOUS_LINE il codice di escape viene utilizzato per spostare il cursore su una riga in modo da scrivere ogni volta il valore precedente.

Esegui questo esempio in questo modo:

 pi @ raspberrypi ~ / py / tutorial / umidità $ sudo python moist_ansi.py

L'output dovrebbe essere qualcosa del genere:


Produzione

Programma 3: Monitoraggio LCD

Ora ci sposteremo dalla console e visualizzeremo invece i dati del sensore sul display LCD. Prima di continuare con questo tutorial, assicurati di aver creato il tuo Adafruit LCD con l'intestazione di impilamento e lo hai testato seguendo il tutorial di Adafruit.

Il nostro programma utilizzerà la libreria Adafruit, quindi è necessario conoscere il percorso completo di Adafruit_CharLCDPlate directory. Creo semplicemente una directory py sotto la home dell'utente pi per mantenere tutto il codice Python in un posto, quindi sul mio Raspberry Pi il percorso è:

 / Home / PI / py / Adafruit-Raspberry-Pi-Python-Code / Adafruit_CharLCDPlate

Potrebbe essere necessario regolare il seguente script se il percorso è diverso.

 import sys.path.append ('/ home / pi / py / Adafruit-Raspberry-Pi-Python-Code / Adafruit_CharLCDPlate') dall'importazione dell'immigrazione da Adafruit_CharLCDPlate import Adafruit_CharLCDPlate import mcp3008 lcd = Adafruit_CharLCDPlate () mentre True: m = mcp3008 .readadc (5) provate: lcd.home () lcd.message ("Livello di umidità: \ n% d"% m) se m < 150: lcd.backlight(lcd.RED) elif m < 500: lcd.backlight(lcd.YELLOW) else: lcd.backlight(lcd.GREEN) except IOError as e: print e sleep(.5)

Esegui il programma in questo modo:

 pi @ raspberrypi ~ / py / tutorial / umidità $ sudo python umido_lcd.py

Dovresti vedere la versione LCD del programma della console dei colori. Questa volta gli indicatori di soglia rossi, gialli e verdi utilizzano la retroilluminazione RGB.


Display a cristalli liquidi (LCD)

Programma 4: monitoraggio remoto con ControlMyPi

In questa sezione useremo ControlMyPi per produrre un dashboard su Internet. Ecco come viene descritto il servizio dalle domande frequenti:

ControlMyPi fornisce un servizio basato sul web per consentire il controllo di semplici script Python da un pannello su Internet. Lo script Python definisce un layout di widget di etichette, pulsanti, indicatori di stato e altro per ControlMyPi da visualizzare. Quando si fa clic su un pulsante, lo script riceverà un messaggio. Se si dispone di uno stato da segnalare, lo script può inviarlo a ControlMyPi in qualsiasi momento e verrà inviato al browser Web.

Se non hai già installato il pacchetto Python, fallo ora. Avrai anche bisogno di un account XMPP. Consiglierei un account Gmail di Google poiché funziona correttamente e verrà utilizzato anche in futuro, quando desideriamo che il nostro script invii un'email. Seguire le istruzioni sul sito Web ControlMyPi per iniziare e testare la connessione.

La prima iterazione della dashboard mostrerà semplicemente un singolo indicatore con la lettura del sensore. Spingeremo una nuova lettura su ControlMyPi ogni 30 secondi per produrre questo:


Monitor dell'umidità

Lo script per produrre questo è ancora relativamente semplice:

 dal momento dell'importazione importazione del sonno mcp3008 da controlmypi import ControlMyPi importazione logging def on_msg (conn, key, value): pass logging.basicConfig (level = logging.INFO) p = [['G', 'umido', 'livello', 0,0,1023]],] conn = ControlMyPi ('[email protected] ',' password ',' umidità ',' Moisture monitor ', p, on_msg) se conn.start_control (): try: while True: m = mcp3008.readadc (5) conn.update_status ('umid': m) sleep (30) infine: conn.stop_control ()

Nella parte superiore, stiamo ora importando la classe ControlMyPi e il modulo di registrazione. Se è necessario eseguire il debug di qualsiasi problema di connessione XMPP, modificare il livello di registro in DEBUG.

Il funzione on_msg è ciò che verrebbe chiamato se abbiamo definito pulsanti o altri input nel layout del nostro widget. Dato che abbiamo solo un indicatore non c'è input e quindi questa funzione non fa nulla.

L'elenco, p, è dove è definito il layout del widget. Ogni voce nell'elenco definisce una riga di widget da visualizzare sul dashboard. Abbiamo una singola riga con un singolo widget, l'indicatore. Umido è il nome del widget, il livello è l'etichetta da visualizzare sul misuratore, 0 è il livello iniziale, 0 è il livello minimo e 1023 è il massimo.

Lo script crea quindi un oggetto ControlMyPi e si avvia. Qui dovrai fornire il tuo indirizzo Gmail e la tua password.

Mancia: Questa è una connessione sicura ai server di Google; la password non è condivisa con nessun altro servizio. Se sei preoccupato, imposta semplicemente un altro account. In effetti, un account separato è molto utile, soprattutto quando si desidera avere e-mail automatizzate inviate dal proprio Raspberry Pi.

Infine, il loop principale prende il sensore come al solito, ma invece di stamparlo sulla console o sullo schermo LCD, spinge il nuovo valore su ControlMyPi. Gli aggiornamenti sono inviati in una mappa di nome / valore del widget.

Esegui lo script usando sudo come al solito:

 pi @ raspberrypi ~ / py / tutorial / umidità $ sudo python umido_cmp.pia

Alcune informazioni di connessione verranno stampate sulla console, seguito da "Registered with controlmypi". Ora vai su ControlMyPi.com e inserisci il tuo indirizzo Gmail nel modulo:


Controlla il mio Pi

Clic Trova pannelli per mostrare un elenco di pannelli di controllo associati al tuo indirizzo Gmail. Ce ne dovrebbe essere uno nella lista, Monitor dell'umidità. Fai clic qui per avviare il pannello e vedere i dati in tempo reale inviati dal tuo Raspberry Pi.

Ogni 30 secondi, quando viene eseguita una nuova lettura del sensore, questo valore viene trasferito attraverso la connessione XMPP a ControlMyPi. Spinge quindi questi dati a tutti gli spettatori del tuo pannello (solo tu al momento). Vedrai il calibro muoversi davanti ai tuoi occhi! Se lo desideri, puoi copiare / incollare l'url lungo e inviarlo a un amico per mostrare il tuo monitor dell'umidità. Ora gli aggiornamenti verranno inviati a te e ai tuoi amici.

Programma 5: aggiunta di un grafico a linee

ControlMyPi ha un numero di widget disponibili per l'uso sulla dashboard. Uno dei più utili per visualizzare i dati è il grafico a linee. Il programma in questa sezione aggiunge un semplice grafico a linee per tracciare le variazioni nel livello di umidità nel tempo. Per iniziare, tracciamo un nuovo punto sul grafico ogni trenta secondi quando prendiamo una lettura.

 dal momento dell'importazione importazione del sonno importazione mcp3008 da controlmypi importazione ControlMyPi importazione registrazione importazione datetime def on_msg (conn, chiave, valore): pass def append_chart_point (grafico, punto): se len (grafico)> = 10: del grafico [0] chart.append (point) return chart logging.basicConfig (level = logging.INFO) p = [[[G ',' umido ','% livello ', 0,0,100], [' LC ',' grafico1 ',' Tempo ' , 'Valore', 0,100]],] c1 = [] conn = ControlMyPi ('[email protected] ',' password ',' moistcmp2 ',' Moisture monitor 2 ', p, on_msg) se conn.start_control () : prova: while True: dt = datetime.datetime.now (). strftime ('% H:% M:% S') m = mcp3008.read_pct (5) c1 = append_chart_point (c1, [dt, m]) conn .update_status ('umid': m, 'chart1': c1) sleep (30) infine: conn.stop_control ()

Nel layout del widget, p, puoi vedere la definizione del widget del grafico a linee dopo il calibro. Il nome del widget è chart1, il asse x è il tempo, il asse y è valore e il max e min i valori sono impostati su 0 e 100.

Mancia: Ho modificato la scala dall'intervallo del sensore grezzo (da 0 a 1023) a un valore percentuale più significativo. Il modulo mcp3008 fornisce una funzione read_pct () per restituire un intero punto percentuale invece del valore grezzo.

Per aggiornare il grafico sul dashboard, è sufficiente inviare un elenco di punti dati a ControlMyPi. I punti dati sono contenuti nell'elenco c1 del programma e ogni punto è costituito da un tempo e un valore. La funzione append_chart_point () è usato per mantenere una lista a rotazione degli ultimi dieci punti, così come ogni nuovo valore arriva il più vecchio viene cancellato. Senza questo il grafico sarebbe cresciuto per sempre.

Esegui lo script usando sudo come al solito:

 pi @ raspberrypi ~ / py / tutorial / umidità $ sudo python umido_cmp2.py

Monitor dell'umidità con widget

Programma 6: Migliorare il grafico a linee

Questo script migliora la versione precedente di:

  • Reintrodurre l'LCD in modo da avere sia il monitoraggio locale che online.
  • Registrazione di punti dati sul grafico a linee su 24 ore.
  • Attenuare le fluttuazioni sul grafico prendendo una media.
  • Salvare i dati del grafico in un file in modo da non perderlo se abbiamo bisogno di riavviare il programma.
 import sys.path.append ('/ home / pi / py / Adafruit-Raspberry-Pi-Python-Code / Adafruit_CharLCDPlate') dall'importazione dell'immigrazione da Adafruit_CharLCDPlate import Adafruit_CharLCDPlate import mcp3008 da controlmypi import ControlMyPi import logging import dall'origine datetime import pickle da genericpath import exists lcd = Adafruit_CharLCDPlate () PICKLE_FILE = '/home/pi/py/moisture/moist.pkl' def on_msg (conn, chiave, valore): passa def append_chart_point (grafico, punto): se len (grafico)> = 48: del chart [0] chart.append (point) return chart def save (dati): output = open (PICKLE_FILE, 'wb') pickle.dump (dati, output) output.close () def carico (predefinito): se non esiste (PICKLE_FILE): return default pkl_file = open (PICKLE_FILE, 'rb') data = pickle.load (pkl_file) pkl_file.close () restituisce dati def update_lcd (m): try: lcd.home () lcd.message ("Livello di umidità: \ n% d %%"% m) se m < 15: lcd.backlight(lcd.RED) elif m < 50: lcd.backlight(lcd.YELLOW) else: lcd.backlight(lcd.GREEN) except IOError as e: print e logging.basicConfig(level=logging.INFO) p = [ [ ['G','moist','% level',0,0,100], ['LC','chart1','Time','Value',0,100] ], ] c1 = load([]) readings = [] conn = ControlMyPi('[email protected]', 'password', 'moisture3', 'Moisture monitor 3', p, on_msg) delta = datetime.timedelta(minutes=30) next_time = datetime.datetime.now() if conn.start_control(): try: while True: dt = datetime.datetime.now() m = mcp3008.read_pct(5) readings.append(m) update_lcd(m) to_update = 'moist':m if dt > next_time: # Prendi la media dall'elenco delle letture per arrotondare leggermente il grafico avg = int (round (letture) / len (letture))) readings = [] c1 = append_chart_point (c1, [dt.strftime ('% H:% M '), avg]) save (c1) next_time = dt + delta to_update [' chart1 '] = c1 conn.update_status (to_update) sleep (30) finally: conn.stop_control ()

Dovresti riconoscere il contenuto del update_lcd () funzione dal programma precedente. Questa funzione è ora chiamata dal loop principale per aggiornare il display LCD su ogni iterazione.

Mancia: Se non hai il display LCD, elimina semplicemente questa funzione e la linea che la chiama. Rimuovi anche il percorso e importa dalla cima e dalla linea lcd = Adafruit_CharLCDPlate ().

Registrazione dei dati

Per registrare 24 ore di dati sul grafico a linee, faremo una lettura ogni 30 minuti e mostreremo 48 punti sul grafico. Il append_chart_point () la funzione è stata aggiornata per mantenere 48 punti dati. Nel ciclo principale ora ci sono 30 minuti in futuro nella variabile la prossima volta.

Ogni ciclo controlliamo il tempo corrente contro il la prossima volta. Se siamo passati la prossima volta un punto dati è aggiunto al grafico e la prossima volta viene spostato in avanti di 30 minuti nuovamente. L'uso dell'orologio è un ottimo modo per eseguire azioni in diverse granularità temporali senza dover contare più contatori che contano i loop e così via. Useremo di nuovo questa tecnica nel programma finale per inviare un'e-mail giornaliera.

Come avrai notato, la lettura dal sensore oscilla un po '. Altri tipi di sensori non lo faranno necessariamente, ma questo lo fa. Quindi, invece di prendere una singola lettura e tracciare quella sul grafico ogni mezz'ora, tracciamo la media di tutte le letture effettuate nell'ultima mezz'ora. L'elenco delle letture è utilizzato per contenere tutte le letture, int (round (sum (letture) / len (letture))) calcola la media sul numero intero più vicino. Questo viene quindi tracciato sul grafico.

Il modulo pickle di Python viene utilizzato per salvare e caricare i dati del grafico in un file. Questo semplicemente memorizza la lista c1 nel caso in cui dobbiamo fermare il programma e avviarlo di nuovo. Ad esempio, un riavvio per una sostituzione della batteria. Il salvare() la funzione viene chiamata ogni volta che aggiorniamo il grafico e il caricare() la funzione viene chiamata ogni volta che si avvia il programma.

Esegui lo script usando sudo come al solito:

 pi @ raspberrypi ~ / py / tutorial / umidità $ sudo python umido_cmp3_lcd.py

Lo screenshot mostra ora un grafico molto più fluido:


Tabella di monitoraggio dell'umidità

Il programma finale

Per concludere questo progetto, aggiungeremo un ultimo passaggio: email. Possiamo monitorare il sensore dall'LCD e guardare la lettura e la cronologia attuali sul web, ma potremmo dimenticarci di controllarlo dopo un po '. Per coprire questo, avremo il programma per inviare una e-mail una volta al giorno ogni volta che la lettura del sensore è inferiore a un valore specificato.

 import sys.path.append ('/ home / pi / py / Adafruit-Raspberry-Pi-Python-Code / Adafruit_CharLCDPlate') dall'importazione dell'immigrazione da Adafruit_CharLCDPlate import Adafruit_CharLCDPlate import mcp3008 da controlmypi import ControlMyPi import logging import dall'origine datetime import pickle da genericpath import esiste import smtplib lcd = Adafruit_CharLCDPlate () PICKLE_FILE = '/home/pi/py/moisture/moist.pkl' def on_msg (conn, chiave, valore): passa def append_chart_point (grafico, punto): se len (grafico) > = 48: del chart [0] chart.append (point) restituisce chart def save (dati): output = open (PICKLE_FILE, 'wb') pickle.dump (dati, output) output.close () def carico (default ): se non esiste (PICKLE_FILE): return default pkl_file = open (PICKLE_FILE, 'rb') data = pickle.load (pkl_file) pkl_file.close () restituisce dati def update_lcd (m): prova: lcd.home () lcd .message ("Livello di umidità: \ n% d %%"% m) se m < 15: lcd.backlight(lcd.RED) elif m < 50: lcd.backlight(lcd.YELLOW) else: lcd.backlight(lcd.GREEN) except IOError as e: print e def send_gmail(from_name, sender, password, recipient, subject, body):"Send an email using a GMail account."senddate=datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d') msg="Date: %s\r\nFrom: %s <%s>\ r \ nA:% s \ r \ nSoggetto:% s \ r \ nX-Mailer: My-Mail \ r \ n \ r \ n "% (senddate, from_name, mittente, destinatario, oggetto) server = smtplib.SMTP ('smtp.gmail.com:587') server.starttls () server.login (mittente, password) server.sendmail (mittente, destinatario, msg + corpo) server.quit () logging.basicConfig (level = logging.INFO ) p = [[[G ',' umido ',' livello ', 0,0,100], [' LC ',' grafico1 ',' Tempo ',' Valore ', 0,100]],] c1 = carico ([ ]) readings = [] conn = ControlMyPi ('[email protected] ',' password ',' umidità ',' Moisture monitor ', p, on_msg) delta = datetime.timedelta (minuti = 30) next_time = datetime.datetime .now () delta_email = datetime.timedelta (days = 1) next_email_time = datetime.datetime.now () se conn.start_control (): try: while True: dt = datetime.datetime.now () m = mcp3008.read_pct () 5) readings.append (m) update_lcd (m) to_update = 'moist': m # Aggiorna il grafico? If dt> next_time: # Prendi la media dall'elenco delle letture per arrotondare leggermente il grafico avg = int (rotondo) (somma (letture) / len (letture))) letture = [] c1 = append_chart_po int (c1, [dt.strftime ('% H:% M'), avg]) save (c1) next_time = dt + delta to_update ['chart1'] = c1 conn.update_status (to_update) #Invia una email? se dt> next_email_time: next_email_time = dt + delta_email se m < 40: send_gmail('Your Name', '[email protected]', 'password', '[email protected]', 'Moisture sensor level', 'The level is now: %s' % m) sleep(30) finally: conn.stop_control()

Il send_gmail () la funzione si occupa dell'invio dell'e-mail. Nel ciclo principale, stiamo usando la tecnica di controllo dell'orologio per determinare se è trascorso un giorno dall'ultima volta in cui abbiamo inviato un'e-mail. Se è così, ci imbattiamo in questa volta di un giorno per il prossimo controllo. Successivamente, se il valore di umidità è inferiore a 40, inviamo l'e-mail.

Questo è il programma completo! Eseguilo usando sudo come di solito:

 pi @ raspberrypi ~ / py / tutorial / umidità $ sudo python moist_final.py

C'è un'ultima cosa da fare: avviare automaticamente il programma all'avvio. Questo ti permetterà di far girare il tuo Raspberry Pi senza testa. Per fare questo modifica il /etc/rc.local/ file come questo:

 pi @ raspberrypi ~ $ sudo pico /etc/rc.local

Aggiungi questa linea al file e salvala:

 python /home/pi/py/tutorials/moisture/moist_final.py &

Ora puoi spegnere il tuo Raspberry Pi, spostarlo nell'impianto che stai monitorando, accenderlo e il programma inizierà per te.


Conclusione

In questo tutorial, hai imparato come impostare e utilizzare SPI sul tuo Raspberry Pi per l'uso con un convertitore da analogico a digitale. Quindi hai usato un sensore per monitorare il livello di umidità del terreno in un vaso. Il software ci permette di vedere questo sensore leggendo sulla console, su un LCD, su un indicatore e un grafico su Internet e attraverso una e-mail giornaliera.

C'era molto da imparare, ma ora puoi usare queste tecniche per tutti i tipi di sensori diversi per misurare la temperatura, l'umidità, l'intensità della luce e così via. Potresti collegarlo anche a un accelerometro oa un sensore di distanza a infrarossi. Divertiti!


Il progetto finito