Utilizzare un webserver per acquisire dati dagli ingressi analogici
Continuiamo l’articolo precedente inserendo nello sketch il codice che permette di campionare segnali analogici per poterli inviarli tramite protocollo http.
Utilizzando la funzione analogRead() acquisiamo il valore della tensione presente sul pin analogico, che verrà utilizzato per essere inserito nella pagina html da inviare al client. Con alcuni tag html aggiuntivi abbiamo la possibilità di avere un refresh automatico della pagina che ad intervalli regolari interrogherà il server Arduino, ottenendo automaticamente nuovi campionamenti del segnale analogico.
Il circuito seguente:
In questo esempio la tensione presente sul pin è fissa, ma nulla vieta l’inserimento di un potenziometro o meglio di un sensore analogico come la sonda di temperatura mcp9700a.
Il codice dello sketch rimane essenzialmente invariato tranne per l’inserimento di una variabile per contenere i valori provenienti dalla funzione analogRead() e di qualche riga html aggiuntiva per formattare la pagina:
if (Data_RX == '\n') { //campiono il valore di tensione analogia //in ingresso sul pin0 ella borad Arduino UNO analogIn0 = analogRead(0); //Invio la risposta al client //invio lo status code pc_client.println("HTTP/1.1 200 OK"); //imposto il data type pc_client.println("Content-Type: text/html"); pc_client.println(); //invio codice html pc_client.print(""); pc_client.print(""); //questo codice html permette di eseguireil refresh automatico //della pagina html pc_client.print(""); pc_client.print(""); pc_client.print(" Valore analogico letto dal pin 0"); //inserisco nella pagina html il valore acquisito dal pin analogico pc_client.print(analogIn0); pc_client.print(" "); //aspetto 1 ms affinche la risposta giunga al browser del client delay(1); //esco dal ciclo while una volta completato l'invio della risposta break; }
Non serve altro, è veramente semplice inviare via http i dati acquisiti dall’Arduino.
Possiamo certamente utilizzare anche gli altri ingressi analogici o come nel prossimo esempio leggere lo stato di alcuni pin digitali.
Per impiegare i pin digitali dobbiamo, nel blocco setup(), specificare quali intendiamo utilizzare come ingressi. Per una semplice prova io ho usato il pin6 e il pin7:
void setup() { //inizializza lo shield con il mac e l'ip Ethernet.begin(mac, ip); //inizializza l'oggetto server ArduinoServer.begin(); //definisco i pin6 e pin7 come ingressi pinMode(6, INPUT); pinMode(7, INPUT); }
La funzione digitalRead() acquisisce il valore dello stato dei pin in esame e lo memorizza in una variabile precedentemente dichiarata. Questo valore viene successivamente inviato al client tramite la pagina html
if (Data_RX == '\n') { //leggo lo stato dei pin digitali 6 e 7 valPin6 = digitalRead(6); valPin7 = digitalRead(7); //campiono il valore di tensione analogia //in ingresso sul pin0 ella borad Arduino UNO analogIn0 = analogRead(0); //Invio la risposta al client //invio lo status code pc_client.println("HTTP/1.1 200 OK"); //imposto il data type pc_client.println("Content-Type: text/html"); pc_client.println(); //invio codice html pc_client.print(""); pc_client.print(""); //questo codice html permette di eseguireil refresh automatico //della pagina html pc_client.print(""); pc_client.print(""); pc_client.print(" Valore analogico letto dal pin 0"); //inserisco nella pagina html il valore acquisito dal pin analogico pc_client.print(analogIn0); pc_client.print(" "); //inserisco nella pagina htm lo stato dei pin in ingresso if(valPin6 == HIGH) //se il valore è alto pc_client.print("Stato pin6 = HIGH"); else //se il valore è basso pc_client.print("Stato pin6 = LOW"); pc_client.println(" "); if(valPin7 == HIGH) //se il valore è alto pc_client.print("Stato pin7 = HIGH"); else //se il valore è basso pc_client.print("Stato pin7 = LOW"); pc_client.print(""); //aspetto 1 ms affinche la risposta giunga al browser del client delay(1); //esco dal ciclo while una volta completato l'invio della risposta break; }
Anche questo codice risulta semplice e i commenti che lo accompagnano descrivono bene le varie istruzioni. Dopo aver caricato lo sketch sull’Arduino ho messo il pin6 alla +5Vdc e il pin 7 a massa ottenendo il risultato seguente:
Naturalmente i pin 10-11-12-13, sono utilizzati per la comunicazioni SPI con l’ethernet shield e quindi, non possono essere impiegati per altri scopi senza interferire nella comunicazione stessa.
Vi rimando al prossimo articolo dove vedremo come utilizzare il browser per inviare comandi alla board Arduino, nel frattempo potete sperimentare con le nozioni acquisite per aumentare le vostre capacità nell’uso della athernet shield.
A presto!
Related posts
3 Comments
Lascia un commento Annulla risposta
Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test
Ciao
Ho provato il tuo sketch, funziona apparentemente, quando faccio un refresh ottengo una sfilza di caratteri lunga paginate intere, e poi si schianta arduino, bisogna resettare
Ciao,
ho riprovato nuovamente il codice, ma non noto nessuna anomalia, anche eseguendo il refresh. Considera comunque che il refresh viene eseguito automaticamente dal codice html. Ho provato lo scketch sia con IE8.0 sia con Firefox 7 e anche eseguendo vari refresh manuali tutto funziona come dovrebbe.
Il codice è stato caricato su una board Arduino Ethernet. Non so come mai a te non funzioni, dimmi qualcosa di più, tipo di browser e biard utilizzata. Per il debug potresti utilizzare Serial.print per verificare passo passo il codice.
saluti
Marco
salve sono nuovo !!!! complimenti per la semplicità nelle spiegazioni esaustive ,so pochissimo di programmazione quindi parto da zero ….mi domandavo cmq se è possibile far funzionare il tutto senza avere un Adsl ma con una sim UMTS con rete dati quindi sempre connesso perchè se cosi fosse si avrebbe l’oppurtunità di funzionare ovunque tipo seconde case dove raramente uno ha l’ Adsl e di cose tramite vari senori da tener sotto controllo ce ne sono tante .Grazie anticipatamente….