Non ci sono prodotti a carrello.
Il progetto ha lo scopo di rilevare dati meteorologici o ambientali e memorizzarli su un DATABASE consultabile da WEB. Il progetto utilizza una scheda FISHINO UNO, una scheda METEO SHIELD (figura 4) ed una scheda SOLAR SHIELD di FUTURA ELETTRONICA. Questa ultima scheda ha presentato 2 problemi:
- il clock-calendario inserito entrava in conflitto con quello di FISHINO e pertanto è stato rimosso l’integrato
- la sonda di temperatura inserita era eccessivamente non accurata ed è stata sostituita con un DS18B20, digitale (figura 7).
Tramite SOLAR SHIELD il sistema ha una autonomia di alimentazione. Lo sketch su FISHINO rileva i dati di temperatura, umidità e pressione ad intervalli regolari, selezionabili fra 1 e 60 minuti. Un sensore di pioggia (figura 5) ed una fotoresistenza (figura 6 ) rilevano inoltre i segnali corrispondenti alla presenza di pioggia e luce. Fishino si collega alla rete wi-fi di casa tramite l’autenticazione, e trasmette i valori rilevati ad un database su ARUBA, richiamando il programma PHP2.PHP sul server (figura 1), che riceve i dati e li memorizza sul database.
Figura 1 : Output sul monitor programma in esecuzione su Fishino
Il programma VEDO.PHP richiamabile alla pagina: www.termoinrete.com/vedo.php sempre sul server di ARUBA, legge i dati e li visualizza (prospetto 1). Successive implementazioni saranno la ricerca per data, l’elaborazione dei dati, l’uscita in formato grafico, ulteriori sensori.
Prospetto 1: Tabulato prodotto dalla pagina WEB
Figura 2: La scheda Fishino+meteoshied+solar shield+schede sensore di pioggia+sensore di luce
Figura 3: il prototipo con il sensore di pioggia ,la sonda di temperatura e la cella solare
Figura 4: la scheda METEO SHIELD adattata
Figura 5: scheda sensore di pioggia
Figura 6: scheda fotocellula
Figura 7: il sensore di temperatura DS18B20
Figura 8: iI collegamenti di Fishino. Pin A4 e A5 riservati al DS1307 clock
Lo sketch su Fishino
//fishino_meteo by nicola taraschi //[email protected] //19 marzo 2016 #include <Flash.h> #include <FishinoUdp.h> #include <FishinoSockBuf.h> #include <Fishino.h> #include <SPI.h> #include <Wire.h> #include <OneWire.h> #include <DS1307.h> DS1307 clock;//definisce un oggetto della classe DS1307 OneWire ds(8); // ds18b20 al pin D8 di Fishino #define MY_SSID "TNCAPBA92A3" #define MY_PASS "D55BCFDE39" #define UMID 1 //HUMIDITY ACQUISITION ON ANALOG PIN 1 #define PRESS 0 //PRESSURE ACQUISITION ON ANALOG PIN 0 #define pindimodo 9 FishinoClient client; int modo=1; // indirizzo server : char server[] = "www.termoinrete.com"; unsigned long lastConnectionTime = 0; const unsigned long postingInterval =60000; float temperatura; double umidita; float pressione; int radiazione; int pioggia; float vento; boolean allarme; int stazione; int volte=0; String strURL = ""; String hsec=""; String hmin=""; float val = 0.0; int lettura=0; float T= 0.0; float temper ; double RH = 0.0; double RHout = 0.0; double UM = 0.0; double Pascal=0.0; double PS=0.0; double P=0.0; float VADC= 5; int DPR = 0; int RHCORR = 0; int PCORR = 0; int TCORR= -3; double STAMPA_T = 0; double STAMPA_U = 0; double STAMPA_P = 0 ; boolean blacklightStatus = false; double nread = 1.0; double somma = 0.0; byte i; byte present = 0; byte data[12]; byte addr[8]; int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole; boolean vedoseriale=true; /*Function: Display tempo sul monitor seriale void printTime() { clock.getTime(); Serial.print(clock.hour, DEC); Serial.print(":"); Serial.print(clock.minute, DEC); Serial.print(":"); Serial.print(clock.second, DEC); Serial.print(" "); Serial.print(clock.month, DEC); Serial.print("/"); Serial.print(clock.dayOfMonth, DEC); Serial.print("/"); Serial.print(clock.year+2000, DEC); Serial.print(" "); Serial.print(clock.dayOfMonth); Serial.print("*"); switch (clock.dayOfWeek)// Friendly printout the weekday { case MON: Serial.print("MON"); break; case TUE: Serial.print("TUE"); break; case WED: Serial.print("WED"); break; case THU: Serial.print("THU"); break; case FRI: Serial.print("FRI"); break; case SAT: Serial.print("SAT"); break; case SUN: Serial.print("SUN"); break; } Serial.println(" "); delay(1000); } double readUMID(){ somma=0; for (int i=0; i<nread; i++) { UM = analogRead( UMID ); RHout=(((UM*VADC/1024.0/3.3)-0.1515)/0.00636)+RHCORR; //HUMIDITY somma += RHout; delay(100); } return ( somma / nread ); } float pressure(){ somma = 0.0; for (int i=0; i<nread; i++) { Pascal=analogRead(PRESS); P=(((Pascal*VADC/1024)/VADC+0.095)/0.009)*10+DPR+PCORR; //PRESSURE TRANSFERT FUNCTION somma += P; delay(100); } return ( somma / nread ); } void getTemp() { int foo, bar; ds.reset(); ds.select(addr); ds.write(0x44,1); present = ds.reset(); ds.select(addr); ds.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds.read(); } LowByte = data[0]; HighByte = data[1]; TReading = (HighByte << 8) + LowByte; SignBit = TReading & 0x8000; // test most sig bit if (SignBit) { TReading = -TReading; } Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25 temper = (Tc_100*0.01); // multiply by (100 * 0.0625) or 6.25 } void LETTURA() { delay(200); getTemp(); STAMPA_T= temper; STAMPA_U= readUMID(); STAMPA_P = pressure(); vento=0; radiazione=analogRead(3); delay(100); pioggia=analogRead(2); allarme=false; // lettura=lettura+1; } void VIDEO_Seriale() { // SERIAL METEO OUTPUT Serial.print(" lettura="); Serial.print(lettura); Serial.print(" TEMPERATURA "); Serial.print(STAMPA_T,1); temperatura=STAMPA_T; Serial.print(" C; "); Serial.print("UMIDITA % "); Serial.print(STAMPA_U,1); umidita=STAMPA_U; Serial.print("%; "); Serial.print("PRESSIONE "); Serial.print(STAMPA_P,0); pressione=STAMPA_P; Serial.print(" mbar"); Serial.print(" radiazione "); Serial.print(radiazione); Serial.print(" pioggia "); Serial.print(pioggia); Serial.print(" stazione="); Serial.println(stazione); } void httpRequest() { client.stop(); // se la connessione è riuscita: if (client.connect(server, 80)) { printTime(); printWifiStatus(); Serial << F("connessione...\n"); vento=0; radiazione=0; pioggia=0; LETTURA(); LETTURA(); stazione=1; strURL = "GET /php2.php?temperatura="; strURL += temperatura; strURL += "&umidita="; strURL += umidita; strURL += "&pressione="; strURL += pressione; strURL += "&radiazione="; strURL += radiazione; strURL += "&pioggia="; strURL += pioggia; strURL += "&vento="; strURL += vento; strURL += "&stazione="; strURL += stazione; strURL += " HTTP/1.1"; client.println(strURL); if (vedoseriale==true) { VIDEO_Seriale();} //Serial.println(strURL); client.println("Host: www.termoinrete.com"); client.println("User-Agent: ArduinoWiFi/1.1"); client.println("Connection: close");; client.println(); } else { // se la connessione non è riuscita: Serial << F("connessione fallita\n"); } // registra il tempo in cui è stata fatta la connessione lastConnectionTime = millis(); } void printWifiStatus() { // stampa lo SSID della rete: if (vedoseriale==true){ Serial.print("SSID: "); } Serial.println(Fishino.SSID()); // stampa l'indirizzo IP della rete: IPAddress ip = Fishino.localIP(); if (vedoseriale==true){ Serial << F("IP Address: "); Serial.println(ip); } // stampa la potenza del segnale di rete: long rssi = Fishino.RSSI(); if (vedoseriale==true){ Serial << F("intensità signale (RSSI):"); Serial.print(rssi); Serial << F(" dBm\n"); } } void setup() { // Inizializza la porta seriale e ne attende l'apertura Serial.begin(9600); vedoseriale=true; clock.begin(); // only for Leonardo needed // necessario solo per la Leonardo while (!Serial) ; // initialize SPI // inizializza il modulo SPI SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV2); // resetta e testa il modulo WiFi while(!Fishino.reset()) if (vedoseriale==true) { Serial << F("Fishino RESET FALLITO, RITENTO...\n");} if (vedoseriale==true) { Serial << F("Fishino WiFi RESET OK\n");} // imposta la modalità stazione Fishino.setMode(STATION_MODE); // tenta la connessione finchè non riesce if (vedoseriale==true) { Serial << F("Connessione a AP...");} while(!Fishino.begin(MY_SSID, MY_PASS)) { if (vedoseriale==true) { Serial << ".";} delay(2000); } if (vedoseriale==true) { Serial << "OK\n";} // wait till connection is established if (vedoseriale==true) { Serial << F("attesa per IP...");} while(Fishino.status() != STATION_GOT_IP) { if (vedoseriale==true) { Serial << ".";} delay(500); } if (vedoseriale==true) { Serial << "OK\n"; } // stampa lo stato della connessione sulla porta seriale printWifiStatus(); Wire.begin(); if ( !ds.search(addr)) { Serial.print(" Nessuna sonda!"); delay(1000); ds.reset_search(); return; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC not valid!"); delay(1000); return; delay(1000); } pinMode(13,OUTPUT); } void exa_allarme() { allarme=false; if (modo==0) { if ((hsec=="0")|| (hsec=="30")) {allarme=true;}//ogni 30" } if (modo==1)//ogni 5 minuti { if ((hsec=="0") &&((hmin=="0")|| (hmin=="5")|| (hmin=="10")|| (hmin=="15")||(hmin=="20")|| (hmin=="25")||(hmin=="30"))){allarme=true;} if ((hsec=="0") &&((hmin=="35")||(hmin=="40")|| (hmin=="45")||(hmin=="50")|| (hmin=="55"))) {allarme=true;} } if (modo==2)//ogni 10 minuti { if ((hsec=="0") &&((hmin=="0")|| (hmin=="10")||(hmin=="20")||(hmin=="30"))){allarme=true;} if ((hsec=="0") &&((hmin=="40")||(hmin=="50"))) {allarme=true;} } if (modo==3)//ogni 15 minuti { if ((hsec=="0") &&((hmin=="0")|| (hmin=="15")||(hmin=="30")||(hmin=="45"))){allarme=true;} } if (modo==4)// ogni 30 minuti { if ((hsec=="0") &&((hmin=="0")||(hmin=="30"))){allarme=true;} } if (modo==5)//ogni ora { if ((hsec=="0") &&(hmin=="0")){allarme=true;} } } void loop() { allarme=false; clock.getTime(); hmin=clock.minute; hsec=clock.second; //printTime(); // se ci sono dati provenienti dalla rete // li invia alla porta seriale. while (client.available()) { char c = client.read(); Serial.write(c); } exa_allarme(); if (allarme==true) { LETTURA(); delay(500);LETTURA(); digitalWrite(13,HIGH); httpRequest();digitalWrite(13,LOW); if (volte==0) { digitalWrite(13,HIGH); httpRequest();digitalWrite(13,LOW);} allarme=false;volte=1; } }
Il listato PHP2.PHP
<? /* specifichiamo il nome della nostra tabella */ $table = "daticlimatici"; /* Connettiamoci al database */ $db_connection=mysql_connect("62.149.150.191","Sql845605","lzsq0446t5"); mysql_select_db("Sql845605_1",$db_connection); $cerco_data='2016/2/21'; /* impostiamo la query */ $sqlquery = "SELECT * FROM $table WHERE data='$cerco_data'"; $result = mysql_query($sqlquery); $number = mysql_num_rows($result); $i = 0; echo " <h1>dati climatici</h1>; <h2>$cerco_data</h2>"; echo ' <table border="1"> <tr> <th>data</th> <th>ora</th> <th>stazione</th> <th>temperatura[°C]</th> <th>umidita[%]</th> <th>pressione[mbar]</th> <th>radiazione[]</th> <th>pioggia[mm]</th> </tr>'; while ($row = mysql_fetch_assoc($result)) { $temperatura = htmlentities($row['temperatura']); $umidita = htmlentities($row['umidita']); $pressione = htmlentities($row['pressione']); $radiazione = htmlentities($row['radiazione']); $pioggia = htmlentities($row['pioggia']); $data = htmlentities($row['data']); $ora= htmlentities($row['ora']); $stazione = htmlentities($row['stazione']); echo "<tr> <td>$data</td><td>$ora</td><td>$stazione</td><td>$temperatura</td> <td>$umidita</td> <td>$pressione</td> <td>$radiazione</td> <td>$pioggia</td> </tr>"; } echo '</table>'; // libero la memoria di PHP occupata dai record estratti con la SELECT mysql_free_result($result); mysql_close(); ?>