.

Fishino Meteo by Nicola Taraschi


Taraschi_Apertura-420x300 Fishino Meteo by Nicola Taraschi

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.

Taraschi_01-420x236 Fishino Meteo by Nicola Taraschi

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_01-355x300 Fishino Meteo by Nicola Taraschi

Prospetto 1: Tabulato prodotto dalla pagina WEB

 

 

Taraschi_02-420x236 Fishino Meteo by Nicola Taraschi

Figura 2: La scheda Fishino+meteoshied+solar shield+schede sensore di pioggia+sensore di luce

 

 

Taraschi_03-420x236 Fishino Meteo by Nicola Taraschi

Figura 3: il prototipo con il sensore di pioggia ,la sonda di temperatura e la cella solare

 

 

Taraschi_04-384x300 Fishino Meteo by Nicola Taraschi

Figura 4: la scheda METEO SHIELD adattata

 

 

Taraschi_05-377x300 Fishino Meteo by Nicola Taraschi

Figura 5: scheda sensore di pioggia

 

 

Taraschi_06 Fishino Meteo by Nicola Taraschi

Figura 6: scheda fotocellula

 

 

Taraschi_07-420x250 Fishino Meteo by Nicola Taraschi

Figura 7: il sensore di temperatura DS18B20

 

 

Taraschi_08-420x251 Fishino Meteo by Nicola Taraschi

Figura 8: iI collegamenti di Fishino. Pin A4 e A5 riservati al DS1307 clock

 

Lo sketch su Fishino

 

//fishino_meteo by nicola taraschi //taraschi_nicola@libero.it
//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();
?>




Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.