Fishino Meteo by Nicola Taraschi

Taraschi_Apertura
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

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
Prospetto 1: Tabulato prodotto dalla pagina WEB
 
 
Taraschi_02
Figura 2: La scheda Fishino+meteoshied+solar shield+schede sensore di pioggia+sensore di luce
 
 
Taraschi_03
Figura 3: il prototipo con il sensore di pioggia ,la sonda di temperatura e la cella solare
 
 
Taraschi_04
Figura 4: la scheda METEO SHIELD adattata
 
 
Taraschi_05
Figura 5: scheda sensore di pioggia
 
 
Taraschi_06
Figura 6: scheda fotocellula
 
 
Taraschi_07
Figura 7: il sensore di temperatura DS18B20
 
 
Taraschi_08
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();
?>

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Main Menu