/* Arduino Weather Station by Mauro Cicolella - www.emmecilab.net Un semplice web server che visualizza le misurazioni ambientali di temperatura, umidita' e pressione utilizzando il Weather Shield realizzato da Ethermania. Hardware: * Arduino UNO * Ethernet shield collegato ai pin 10, 11, 12, 13 * Weather Shield realizzato da www.ethermania.com Codice originale del web server realizzato da David A. Mellis e Tom Igoe Codice originale del Weather Shield realizzato da Marco Signorini - Ethermania */ #include #include #include #include // Indirizzi MAC ed IP associati all'Ethernet Shield byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192,168,1, 1 }; #define RXBUFFERLENGTH 4 WeatherShield1 weatherShield; /* Classe contenitore per i valori letti dai sensori */ class WeatherData { private: float fTemperature; unsigned short shTemperature; float fPressure; unsigned short shPressure; float fHumidity; unsigned short shHumidity; public: WeatherData() { bReady = false; } // costruttore della classe // get methods float getAvgTemperature() { return fTemperature; } float getInstTemperature() { return ((float)shTemperature/16); } float getAvgPressure() { return fPressure; } float getInstPressure() { float value ; value = (((float)shPressure/1024)+0.095)/0.009; return value; } float getAvgHumidity() { return fHumidity; } float getInstHumidity() { float value; value = (((float)shHumidity/1024)-0.1515)/0.00636; // senza compensazione // effettuiamo la compensazione dell'umidita' relativa utilizzando la temperatura value = value/(1.0546-0.00216*getInstTemperature()); return value; } // set methods void setAvgTemperature(float Temperature) { fTemperature=Temperature; } void setInstTemperature(unsigned short Temperature) { shTemperature=Temperature; } void setAvgPressure(float Pressure) { fPressure=Pressure; } void setInstPressure(unsigned short Pressure) { shPressure=Pressure; } void setAvgHumidity(float Humidity) { fHumidity=Humidity; } void setInstHumidity(unsigned short Humidity) { shHumidity=Humidity; } public: boolean bReady; }; // Inizializzazione del server che resta in ascolto // sulla porta 80 (valore di default per il protocollo HTTP): Server server(80); String readString; float temp; WeatherData weatherData; boolean currentLineIsBlank = true; void printHeader(Client c ) { c.println("HTTP/1.1 200 OK"); c.println("Content-Type: text/html"); c.println(); c.print("ARDUINO WEATHER STATION"); c.println("

Arduino Weather Station

"); c.println("
"); c.println("
www.emmecilab.net - www.ethermania.com
"); c.println("
"); } void printMenu(Client c ) { c.print("

Leggi sensori | Impostazioni | Reset connessione

"); } void printSettings(Client c ) { c.println(); c.println("IP Address: "); for (int i = 0; i < 4; i++) { c.print(ip[i],DEC); if (i<3) c.print("."); } c.println(); c.println("MAC Address: "); for (int i = 0; i < 5; i++) { c.print(mac[i],HEX); if (i<4) c.print(" "); } } void setup() { // Avvio della connessione e del server sulla porta 80 Ethernet.begin(mac, ip); server.begin(); } void loop() { // in attesa di richieste da parte dei client Client client = server.available(); if (client) { // la richiesta HTTP termina con una linea vuota readString=""; while (client.connected()) { if (client.available()) { char c = client.read(); readString.concat(c); // ricevuto il carattere di newline se la riga corrispondente é vuota // allora la richiesta é terminata e si può rispondere if (c == '\n') { break; } } } printHeader(client); printMenu(client); if(readString.indexOf("L=1") > 0) { if(readValues(weatherShield)) client.print("Temperatura attuale "); client.print(weatherData.getInstTemperature()); client.print(" C "); client.println(); client.print("Temperatura media "); client.print(weatherData.getAvgTemperature()); client.print(" C "); client.println("
"); client.print("Pressione attuale "); client.print(weatherData.getInstPressure()); client.print(" kPa"); client.println(); client.print("Pressione media "); client.print(weatherData.getAvgPressure()); client.print(" kPa"); client.println("
"); client.print("Umidita' attuale "); client.print(weatherData.getInstHumidity()); client.print(" %"); client.println(); client.print("Umidita' media "); client.print(weatherData.getAvgHumidity()); client.print(" %"); } if(readString.indexOf("L=2") > 0) printSettings(client); if(readString.indexOf("L=3") > 0) weatherShield.resetConnection(); client.println(""); // ritardo per acquisizione dati da parte del browser delay(1); // chiusura della connessione client.stop(); } } /* Questa funzione legge i valori dei sensori e li memorizza in una istanza della classe WeatherData che funge da contenitore. Il valore di ritorno e' false solo nel caso in cui ci siano stati dei problemi con il Weather Shield */ boolean readValues(WeatherShield1 &weatherShield) { /* Buffer contenente i valori letti */ unsigned char ucBuffer[RXBUFFERLENGTH]; /* Controllo connessione al weather shield e lettura dei sensori */ if (weatherShield.sendCommand(CMD_ECHO_PAR, 100, ucBuffer)) { /* Valori di temperatura */ if (weatherShield.sendCommand(CMD_GETTEMP_C_AVG, 0, ucBuffer)) weatherData.setAvgTemperature(weatherShield.decodeFloatValue(ucBuffer)); if (weatherShield.sendCommand(CMD_GETTEMP_C_RAW, PAR_GET_LAST_SAMPLE, ucBuffer)) weatherData.setInstTemperature(weatherShield.decodeShortValue(ucBuffer)); /* Valori di pressione */ if (weatherShield.sendCommand(CMD_GETPRESS_AVG, 0, ucBuffer)) weatherData.setAvgPressure(weatherShield.decodeFloatValue(ucBuffer)); if (weatherShield.sendCommand(CMD_GETPRESS_RAW, PAR_GET_LAST_SAMPLE, ucBuffer)) weatherData.setInstPressure(weatherShield.decodeShortValue(ucBuffer)); /* Valori di umidità */ if (weatherShield.sendCommand(CMD_GETHUM_AVG, 0, ucBuffer)) weatherData.setAvgHumidity(weatherShield.decodeFloatValue(ucBuffer)); if (weatherShield.sendCommand(CMD_GETHUM_RAW, PAR_GET_LAST_SAMPLE, ucBuffer)) weatherData.setInstHumidity(weatherShield.decodeShortValue(ucBuffer)); return true; } return false; }