Vai al contenuto

Article: Come monitorare temperatura ed umidità in casa via WEB tramite un Arduino YUN


RyujiAndy

Messaggi raccomandati

Primo Esperimento con Arduino YUN

 

[imgx]https://dl.dropboxusercontent.com/u/27772338/Arduino_yun/ArduinoYunBack_2_450px.jpg[/imgx][imgx]https://dl.dropboxusercontent.com/u/27772338/Arduino_yun/ArduinoYunFront_2_450px.jpg[/imgx]

Introduzione:

È una nuova serie di Board che combina le funzionalità e la semplicità di programmazione dei multicontrollori della serie AtMega con un vero e proprio Processore Soc Atheros AR9331.

Infatti Arduino YUN in realtà è un Arduino Leonardo accoppiato ad un vero e proprio mini pc che lavora con una versione modificata di OpenWRT chiamata Linino che dà finalmente la possibilità di gestire la board tramite internet. Questo significa che abbiamo la possibilità di collegarlo ed interagire con lui tramite rete. Lo YUN può essere collegato sia via ethernet che tramite modulo wifi.

Avendo ora a disposizione un vero e proprio processore nasce la necessità di dover gestire il sistema oltre ad una diversa mole di dati. Per questo è stato messo a disposizione sullo YUN uno slot per microSD e una porta USB Host.

[imgx]https://dl.dropboxusercontent.com/u/27772338/Arduino_yun/BridgeInShort.png[/imgx]

I due sistemi (Soc ARM e microcontroller Atmega) comunicano tra loro tramite un Bridge usb, quindi si ha la possibilità di accedere alle periferiche e risorse da entrambe le parti.

Con questa soluzione si aggira il problema che affliggeva gli Shield Ethernet dei vecchi Arduino, infatti abbiamo a disposizione un vero e proprio miniserver che interagisce con l' "Arduino Leonardo" integrato.

 

Tralascio particolari e possibilità a livello di progettazione: voglio farvi vedere il mio primo esperimento fatto: la lettura della temperatura e dell'umidità in casa tramite arduino, ed il tutto portato su un grafico consultabile via internet da qualsiasi device.

Chi mi segue su G+ ha già visto la prima immagine del risultato.

 

La prima cosa da fare è configurare la rete Wireless (se si intende utilizzarla al posto del collegamento ethernet).

Per fare ciò sarà inizialmente necessario configurare Ardunino Yun (dovremo collegarlo alla rete tramite il cavo ethernet) e interagire tramite browser con l'interfaccia luci, che gestisce linino.

[imgx]https://dl.dropboxusercontent.com/u/27772338/Arduino_yun/net1.png[/imgx]

 

Una volta collegato l'Arduino YUN alla rete, digitate sul PC l'indirizzo "http://arduino.local" o l'indirizzo ip.

Bisognerà inserire la password per avere la schermata di gestione dei moduli rete, ora basta cliccare su configure per settare i parametri base.

Nel mio esperimento ho utilizzato le REST API, una serie di funzioni per comunicare tra i due sistemi, quindi è consigliato disattivare la protezione di autentificazione.

Se invece intendete gestirlo anche via internet per evitare eventuali comandi di reset è meglio attivarla.

Ora dobbiamo aggiungere alcuni pacchetti linux, anche se esiste una FUNZIONE sull'interfaccia Luci. Per comodità visto che utilizzo Linux ho usato un client ssh. Su Windows potete usare Putty.

ssh1.png

Intendo utilizzare il server web uhttpd con l'interprete php, quindi basta digitare:

opkg update
opkg install php5 php5-cgi

ora dobbiamo modificare il file di configurazione del server uhttpd per rendere attivo l'interprete

uci set uhttpd.main.interpreter=".php=/usr/bin/php-cgi"
uci set uhttpd.main.index_page="index.html index.htm default.html default.htm index.php"
uci commit uhttpd
sed -i 's,doc_root.*,doc_root = "",g' /etc/php.ini
sed -i 's,;short_open_tag = Off,short_open_tag = On,g' /etc/php.ini

ed ora basta riavviare il server web digitando:

/etc/init.d/uhttpd restart

Per problemi di memora ho aggiunto una microsd ed ho creato un collegamento con la cartella pubblica "/www/php"

ln -s /mnt/sda1 /www/php

Ora per avere accesso alla scheda sd dal pc in rete ho installato un server sftpd digitando:

opkg install openssh-sftp-server

Per programmare l'arduino si deve scaricare il nuovo IDE 1.5.5 che trovate nell'area DOWNLOAD di Moddingstudio

Ricordatevi di settare la giusta board e nel caso di windows e mac di installare i driver, fatto questo siamo pronti per il primo progetto.

Come già detto, l'esperimento consiste nella rilevazione della temperatura e dell'umidità, visualizzandola poi via web.

Arduino YUN non ha un sensore di umidità e temperatura integrato, quindi utilizzeremo il componente DHT11 (l'avevo già usato anche per l'automazione del mio terrario).

Ecco lo schema per il montaggio:

fritzing-yun%20dht11.png

Materiale utilizzato:

  • Breadboard
  • Sensore DHT11
  • Resistenza 5K

Realizzato il circuito si passa alla programmazione dell'AtMega.

Prima di tutto aggiungiamo le librerie necessarie allo sketch:

#include "DHT.h"

Richiama le funzioni per la comunicazione con il sensore DHT11

#include 

Richiama le funzioni per comunicare con linino

#include 
#include 

Richiama le funzioni per la creazione di un server per la visualizzazione dei dati raccolti.

#define DHTPIN 2
#define DHTTYPE DHT11

Definisce il pin di arduino con cui comunica il sensore e il tipo di sensore, poi inizializzo le variabili globali che servono per il server e il sensore:

YunServer server;
DHT dht(DHTPIN, DHTTYPE);
int h, t;

La variabile "h" servirà per memorizzare la lettura dell'umidità e "t" per la temperatura, ora passiamo all'inizializzazione dell'hardware che ci serve:

void setup() {
 Bridge.begin();
 server.listenOnLocalhost();
 server.begin();
 dht.begin();
}

Per semplificarmi la lettura ed eventuale correttura del codice mi creo delle funzioni.

void process(YunClient client) {
 
 String command = client.readStringUntil('\r');

 if (command == "termo") {
   temp(client);
 }

 if (command == "idro") {
   idro(client);
 }
}

Avendo attivato le API ed inizializzato il server possiamo inviare delle richieste specifiche con il browser (http://ip_arduino_yun/arduino/command) che andremo a scrivere nella variabile "command", e tramite dei semplici controlli posso richiamare delle funzioni che mi scrivono sul browser il valore delle rilevazioni.

void temp(YunClient client) {
 if (isnan(t)) {
   client.print(F("Error"));
 } else {
   client.print(t);
 }
}

void idro(YunClient client) {
   if (isnan(t)) {
     client.print(F("Error"));
   } else {
     client.print(h);
   }
}

Ora non resta che scrivere il ciclo principale "loop":

void loop() {

 h = dht.readHumidity();
 t = dht.readTemperature();
 YunClient client = server.accept();
 if (client) {
   process(client);
   client.stop();
 }
 
 delay(50);
}

In pratica effettua la rilevazione della temperatura e dell'umidità ogni 50 ms e sta in attesa di una richiesta da parte di un browser per richiamare la funzione che processa il comando.

Scritto il nostro sketch possiamo compilarlo ed inviarlo su Arduino YUN.

Viste le potenzialità di Linino e prendendo le API Google per la creazione di grafici possiamo creare un programma che legge i valori di temperatura e umidità per poi scriverli su di un file nella microsd.

Utilizzando linino potremo scriverle una funzione del genere in vari linguaggi... ma per renderlo alla portata di tutti ho deciso di scriverlo in php:

 

Vi posto il risultato che ho ottenuto:

01.Feb.2014 10:00|25|22
01.Feb.2014 11:00|25|22
01.Feb.2014 12:00|26|23
01.Feb.2014 13:00|26|23
01.Feb.2014 14:00|26|24
01.Feb.2014 15:00|24|23
01.Feb.2014 16:00|24|22
01.Feb.2014 17:00|24|22
01.Feb.2014 18:00|25|23
01.Feb.2014 19:00|25|23
01.Feb.2014 20:00|25|23
01.Feb.2014 21:00|25|23
01.Feb.2014 22:00|25|23
01.Feb.2014 23:00|24|23

Ora dobbiamo far eseguire il programma ogni ora, per fare questo sotto linux basta settare un crontab, quindi digitiamo da shell ssh il seguente comando:

crontab -e

ed inseriamo la seguente riga:

0 * * * * /usr/bin/php-cgi /mnt/sda1/php/save.php

Vi ricordo che si tratta di un editor "vi", quindi per scrivere bisogna prima cliccare sul tasto "insert" e per uscire e salvare bisogna prima premere "esc" e poi digitare ":quit!", ora ogni qualvolta i minuti sono a zero verrà eseguito il nostro programma "save.php".

Per visualizzare il risultato ho creato un file "data.php" che legge il file che viene creato dal nostro crontab e assegna i valori a delle variabili in questo modo:

Per visualizzare i grafici ho utilizzato le API Google. Il file "index.php" lo trovate in un download in fondo a questo articolo.

Ora andando a richiamare da browser digitando "http://ip_arduino_yun/php/index.php"

avremo il seguente risultato

Screenshot_2014-02-01-17-20-53.png

 

P.S. Lo script php non è perfetto perchè quando i dati diventano troppi il grafico generato diventa quasi illeggibile quindi andrebbe migliorato, cosa che forse farò in futuro... oppure se volete potete farlo voi facendo liberamente esperimenti sul codice.

 

File allegati

 

Avete delle migliorie da proporre? Fatevi avanti!

Modificato da RyujiAndy
Link al commento
Condividi su altri siti

Purtroppo no perché nella shield ci manca la macchina Linux.

 

Gesendet von meinem GT-I9300 mit Tapatalk

 

Il problema è che non si può generare la pagina html coi grafici, giusto? E se volessi hostare delle semplici pagine (magari con l'SD shield) da cui impartire comandi ad Arduino? Ad esempio una pagina html molto semplice, in cui cliccando su un pulsante viene impartito un comando alla board. E' fattibile?

Link al commento
Condividi su altri siti

Finché si lavora con die semplici link e si recuperano le informazioni con dei "GET" non CI sono problemi, ma non appena si cerca di inviare documenta HTML piú complessi il multicontattore si inceppa e non funziona il proggetto

 

Gesendet von meinem GT-N8013 mit Tapatalk

Link al commento
Condividi su altri siti

Finché si lavora con die semplici link e si recuperano le informazioni con dei "GET" non CI sono problemi, ma non appena si cerca di inviare documenta HTML piú complessi il multicontattore si inceppa e non funziona il proggetto

 

Gesendet von meinem GT-N8013 mit

 

Ah, bene, bene... Grazie. :)

Link al commento
Condividi su altri siti

  • 1 mese dopo...

Crea un account o accedi per lasciare un commento

Devi essere un membro per lasciare un commento

Crea un account

Iscriviti per un nuovo account nella nostra community. È facile!

Registra un nuovo account

Accedi

Sei già registrato? Accedi qui.

Accedi Ora

Giochi in Uscita



  • Community Hive Community Hive

    Community Hive allows you to follow your favorite communities all in one place.

    Follow on Community Hive
  • Utenti

    Non ci sono membri da mostrare

×
×
  • Crea Nuovo...