Progetto Domotico Arduino: Sensore di Luce e Temperatura via Web #3

 Articolo letto 9522 volte 

Eccoci giunti all’ultimo articolo dedicato alla realizzazione di un piccolo sistema domotico. Nella prima parte sono stati presentati i componenti utilizzati mentre nella seconda si è visto l’assemblaggio. Adesso ci dedicheremo alla parte software: vedremo come creare un programma con l’IDE dedicato e caricarlo sulla board Arduino.Prima di tutto, scaricare l’ultima versione del software dalla pagina dedicata. Dopo aver scompattato il file, collegate la board Arduino al pc tramite il cavo usb. Su Windows non dovrete far altro che installare i driver per la periferica Arduino UNO (COMxx) che troverete tra i dispositivi (gestione periferiche). Una volta individuata, installate i driver che trovate nella relativa cartella all’interno del file scompattato in precedenza. Dopo aver installato i driver, avviate Arduino ed inviduare la porta seriale della nostra board. Dal Menu > Porta Seriale, collegando e scollegando la board, individuare la porta COM che appare e poi scompare. Per maggiori informazioni sulla configurazione ed installazione vi rimando alla pagina relativa sul sito ufficiale.

Siamo pronti a programmare il nostro Arduino. Per fare un rapido test, apriamo tramite File > Esempi > 01.Basics > Blink, uno degli esempi forniti e carichiamo premendo sul tasto carica

arduino ide, tasto compila e caricaNell’immagine è possibile vedere sulla sinistra i due tasti: il primo (a forma di visto) serve a ‘verificare’ il programma (compilazione), mentre il secondo a caricare il programma compilato sulla board. Caricando l’esempio blink, salvo errori, dovremmo vedere uno dei led presenti su Arduino lampeggiare.

Creare e Configurare l’account su Cosm

Cosm.com è una piattaforma online per la memorizzazione, in tempo reale, di dati raccolti da vari dispositivi e non solo. Il servizio è completamente gratuito e fornisce dei buoni strumenti per la consultazione e la condivisione dei dati.

Dopo aver creato un account, dalla console selezionare +Device Feed, selezionare la piattaforma Arduino e diamo un nome e dei tag al nostro feed. Cliccare Create e Finish per completare l’operazione.

Aggiungiamo tramite +Datastream, due sorgenti dati: la prima avrà ID temp1, mentre la seconda sensor1. Oltre agli ID è possibile configurare i tag, l’unità di misura ed il simbolo.

Quello che ci serve per il nostro codice è l’API KEY ed il feed number che potremo ottenere dalla console, cliccando sul nostro account (in alto a sinistra) e selezionando keys. Questi parametri ci serviranno per dialogare con i server di Cosm.

Il Codice

#include <SPI.h>
#include <Ethernet.h>
#define APIKEY "<sostituire con la vostra API KEY" // api key
#define FEEDID sostituire_con_numero_del_feed // numero Feed
#define USERAGENT "Cosm: Esempio Arduino"
byte mac[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; //il mac address dell'ethernet shield sostituitelo col vostro
char lum[] = "sensor1"; //nome del sensore di luce su cosm
char temp[] = "temp1"; //nome del sensore di temperatura su cosm
IPAddress ip(10,0,1,20); //un ip libero all'interno della vostra rete per la configurazione manuale della rete
EthernetClient client; // inizializza la libreria ethernet
IPAddress server(216,52,233,121); //IP per api.cosm.com
unsigned long lastConnectionTime = 0; // ultima connessione al server
unsigned int rrsid = 0; //ultimo dispositivo che ha inviato i dati
boolean lastConnected = false; // stato dell'ultima connessione al server
const unsigned long postingInterval = 5*1000; //intervallo aggiornamento dati

void setup() {
Serial.begin(9600); //inizializza la porta seriale
if (Ethernet.begin(mac) == 0) { //connessione ethernet tramite DHCP - se 0 passo a configurazione manuale
Serial.println("Impossibile configurare l'Ethernet Shield tramite DHCP");
Ethernet.begin(mac, ip); //configurazione manuale
}
}

void loop() {
// lettura dei sensor
int sensorReading = analogRead(A0);
int sensorTemp = analogRead(A1);
if (client.available()) { //stampo per debug la risposta del server
char c = client.read();
Serial.print(c);
}
if (!client.connected() && lastConnected) { //procedura di disconnessione
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
// trascorso l'intervallo massimo tra un aggiornamento e l'altro mi collego ed invio i dati
if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
if (rrsid==0) { //dati inviati tramite round robin (i dati inviati sono alternati: prima il sensore di luce poi quello di temperatura
sendData(sensorReading,lum);
rrsid=1;
} else if (rrsid==1) {
sendData(Thermistor(sensorTemp),temp);
rrsid=0;
}
}
//memorizzo l'istante dell'ultimo aggiornamento
lastConnected = client.connected();
}
// crea una connessione http al server ed invia i dati
void sendData(int thisData, char* sensid) {
if (client.connect(server, 80)) {
Serial.println("connecting...");
client.print("PUT /v2/feeds/");
client.print(FEEDID);
client.println(".csv HTTP/1.1");
client.println("Host: api.cosm.com");
client.print("X-ApiKey: ");
client.println(APIKEY);
client.print("User-Agent: ");
client.println(USERAGENT);
client.print("Content-Length: ");
int thisLength = 8 + getLength(thisData);
client.println(thisLength);
client.println("Content-Type: text/csv");
client.println("Connection: close");
client.println();
client.print(sensid);
client.print(",");
client.println(thisData);
}
else {
Serial.println("connection failed");
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
lastConnectionTime = millis();
}
double Thermistor(int RawADC) {
//calcola la temperatura in gradi centigradi tramite l'equazione di Steinhart-Hart
//i valori dei parametri dovrebbe andare bene per i termistori da 4,7 Kohm
long Resistance; double Temp;
Resistance=((10240000/RawADC) - 10000);
Temp = log(Resistance);
Temp = 1 / (0.0012954816 + (0.00023539242 * Temp) + (0.00000011285038 * Temp * Temp * Temp));
Temp = Temp - 273.15;
return Temp;
}

//calcola la lunghezza dei dati da inviare
int getLength(int someValue) {
int digits = 1;
int dividend = someValue /10;
while (dividend > 0) {
dividend = dividend /10;
digits++;
}
return digits;
}

Il codice è già commentato, occorre modificare i valori evidenziati in arancio. Di particolare rilevanza è il metodo double Thermistor(int RawADC) che a partire dal valore letto dalla porta analogia calcola la temperatura in gradi centigradi tramite l’equazione di Steinhart-Hart che vi invito a studiare per poter ottenere risultati più precisi.

Per testare il tutto basta caricare il codice tramite l’IDE ed avviare il Monitor Seriale per verificare il funzionamento del nostro programma. Questo è solo un banale esempio di ciò che è possibile fare con Arduino, con un po’ di studio e tanta fantasia è possibile realizzare  praticamente di tutto, ne è testimone l’enorme successo che ha avuto questa piattaforma.

 Articolo letto 9522 volte 

  • GIANNI

    Buona sera ho seguito il tuo articolo e vorrei sottopoti un mio problema. In particolare da xively io ottengo i dati in formato json mentre per il mio progetto servirebbero in formato csv. Puoi aiutarmi? TKS Gianni