http://www.lineameteo.it/viewtopic.php?f=2&t=12889&p=374892#p374892
-----------------------------------
As_Needed
Ven 06 Nov, 2015 16:58

Re: Stazione Meteo Base (FAI DA TE)
-----------------------------------
Finalmente ho finito il programma!! Successivamente lavorerò per le minime e massime, adesso veramente devo solo montare il tutto. ;)

Questo il programma completo (ho migliorato anche la grafica  :D  Ho messo 4 if che a seconda di quanto è la temperatura esterna, il colore del valore della temperatura cambia)
[code]
#include <Wire.h>
#include <BMP180.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#define sclk 13
#define mosi 11
#define cs   10
#define dc   9
#define rst  8  
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);
#include "DHT.h"
#include <OneWire.h>
#include <DallasTemperature.h>
 // Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2
 // Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
 // Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
DHT dht(3,DHT22); //Definisco il pin al quale è collegato il sensore e il tipo
float dewPoint;
float windchill;
float temperaturaf;
float heatindexf;
float heatindexc;
float pressionelivellodelmarehPa;
float pressionelivellodelmare;
int dataPin = 4;
int bitLength = -1;
int data[45];
int gooddata = 1;
int timeout;
int loops = 0;
int spd[8];
int i = 0;
int j = 0;
char windDirection[16][4] = {
  "N","NNE","NE", "ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"};
 // Store an instance of the BMP180 sensor.
BMP180 barometer;
// Store the current sea level pressure at your location in Pascals.
float seaLevelPressure = 102500; 
 
void setup() {
  tft.initR(INITR_BLACKTAB);
  Serial.begin(9600);
  //Serial.println("DHT test");
  dht.begin();
   // Start up the library
  sensors.begin();
  Serial.print("\n\nInitializing...\n");
  //  Serial.print("Data Pin: ");
  //  Serial.println(digitalRead(dataPin));
    pinMode(dataPin, INPUT);
     // We start the I2C on the Arduino for communication with the BMP180 sensor.
 Wire.begin();
 // We create an instance of our BMP180 sensor.
 barometer = BMP180();
 // We check to see if we can connect to the sensor.
 if(barometer.EnsureConnected())
 {
 Serial.println("Connected to BMP180."); // Output we are connected to the computer.
 // When we have connected, we reset the device to ensure a clean start.
 barometer.SoftReset();
 // Now we initialize the sensor and pull the calibration data.
 barometer.Initialize();
 }
 else
 { 
 Serial.println("No sensor found.");
 }
}


//void delay2(unsigned long ms){
//	unsigned long start = micros();
//	while (micros() - start <= ms);
//}

void loop() {
  sensors.requestTemperatures();
  pressionelivellodelmare=barometer.GetPressure()+5473;
  pressionelivellodelmarehPa=pressionelivellodelmare/100;
  float h = dht.readHumidity(); // Leggo il valore di umidità
  //float t = dht.readTemperature(); // Leggo il valore di temperatura
  //if (isnan(t) || isnan(h)) // Se almeno uno dei due valori è NaN (Not a Number)
  
    //Serial.println("Impossibile leggere il sensore!");
  
  //else //altrimenti
  if(barometer.IsConnected)
 {
 // Retrive the current pressure in Pascals.
 long currentPressureP = barometer.GetPressure();
 float currentPressuremb = currentPressureP/100.0;
 float currentPressureinHg = currentPressuremb*0.02953;


 // Retrive the current altitude (in meters). Current Sea Level Pressure is required for this.
 float altitudem = barometer.GetAltitude(seaLevelPressure);
 float altitudeft = altitudem*3.2808;


 // Retrive the current temperature in degrees celcius.
 float currentTemperatureC = barometer.GetTemperature();
 float currentTemperatureF = (9.0/5.0)*currentTemperatureC+32.0;
}
    Serial.print("Temperatura ");
    Serial.println(sensors.getTempCByIndex(0));
    Serial.print("Umidita' ");
    Serial.print(h);
    Serial.print(" %\t");

    Serial.println ("Dew Point");
Serial.print (dewPoint);
Serial.println ("C");
//Serial.println ("Wind Chill");
//Serial.print  (windchillc);
//Serial.print ("C");

dewPoint = (pow (h/100,0.125)*(112+(0.9*sensors.getTempCByIndex(0)))+0.1*sensors.getTempCByIndex(0)-112);
   temperaturaf=sensors.getTempCByIndex(0)*1.8+32;
  
  if ((sensors.getTempCByIndex(0)>=26.7)&&(h>=40))
 { 
  heatindexf=(-42.379+2.04901523*temperaturaf+10.14333127*h-0.22475541*temperaturaf*h-0.00683783*pow(temperaturaf,2)-0.05481717*pow(h,2)+0.00122874*pow(temperaturaf,2)*h+0.00085282*temperaturaf*pow(h,2)-0.00000199*pow(temperaturaf,2)*pow(h,2));
 heatindexc= (heatindexf-32)/1.8;
   }
   else
   { 
    heatindexc=sensors.getTempCByIndex(0);
   }
 //delay(1000);
    
    //Serial.print("Temperatura: ");
    //Serial.print(t);
    //Serial.println(" *C");
    // non è necessario mettere un delay() perchè ci vogliono due secondi per leggere i valori, quindi il serial monitor riceverà dati ogni 2 secondi.
   
  Serial.println("Start");
  gooddata = 1;
  collectData();
  if (gooddata == 1) {
    rawdump();
    outputResults();
    TheData();
  }
  else {
    Serial.println ("READ ERROR");
  }
  Serial.println(++loops);
  Serial.println();
 delay(1500);
}

int collectData(void) {
   if (bitLength <0){
     bitLength = 1220;//getbitlenght2();

  }
 
 pinMode(dataPin, OUTPUT);

 digitalWrite(dataPin, HIGH);
 delay(100);
 digitalWrite(dataPin, LOW );
 delay(500);
 pinMode(dataPin, INPUT);


 while(digitalRead(dataPin) == LOW){
 }  
 //wait slave start signal
 while(digitalRead(dataPin) == HIGH){
 }
 while(digitalRead(dataPin) == LOW){
 }
 


 
  for (int i=0 ; i<42 ; i++) {
    data[i] = (digitalRead(dataPin) == LOW)? 0:1; // read and save either a 0 or 1
    delayMicroseconds(bitLength);
  }
}

int TheData() {
  Serial.println("TheData");
  int i, idx = 0, idy = 0;
 // for (i=8; i>4; i--) {  dato originale
    for (i=6; i>2; i--) { // dato modificato
    idx = idx *2 + data[i];
  }

  //  Serial.print("idx: ");
  //  Serial.println(idx, DEC);
  Serial.print("Wind: ");
  Serial.println(windDirection[idx] );

 // for (i=17; i>8; i--) {  dato originale per velocità
    for (i=15; i>6; i--) {   // dato modificato
    idy = idy * 2 + data[i];
  }

  Serial.print("Speed: ");
  Serial.print(idy, DEC);
  Serial.println (" m/s read");

  float idz = idy/10.0;
  Serial.print("Speed: ");
  Serial.print(idz);
  Serial.println (" m/s real");

  float KMH = idz * 3.6;
  Serial.print("Speed: ");
  Serial.print(KMH);
  Serial.println (" kmh");

  float MPH = KMH * 0.621371192;
  Serial.print("Speed: ");
  Serial.print(MPH);
  Serial.println (" mph");

  windchill=(13.12+0.6215*sensors.getTempCByIndex(0))-(11.37*pow(KMH,0.16))+(0.3965*sensors.getTempCByIndex(0)*pow(KMH,0.16));
if ((windchill<sensors.getTempCByIndex(0))&&(KMH>4.6))
{
windchill=(13.12+0.6215*sensors.getTempCByIndex(0))-(11.37*pow(KMH,0.16))+(0.3965*sensors.getTempCByIndex(0)*pow(KMH,0.16));
  }
  else
  {
    windchill=sensors.getTempCByIndex(0);
  }

tft.fillScreen(ST7735_BLACK);
  tft.setTextColor (ST7735_GREEN);
   tft.setCursor(0, 0);
  tft.setTextSize(1);
  tft.println("Temp.OUTSIDE");
  if (sensors.getTempCByIndex(0)<3)
  { 
  tft.setTextColor (ST7735_BLUE);
  tft.setCursor(80, 0);
  tft.setTextSize(1);
  tft.print(sensors.getTempCByIndex(0));
  tft.print ( (char)248);
  tft.println("C");
//delay(5000);
   }
   if ((sensors.getTempCByIndex(0)>=3)&&(sensors.getTempCByIndex(0)<=15))
  { 
  tft.setTextColor (ST7735_GREEN);
  tft.setCursor(80, 0);
  tft.setTextSize(1);
  tft.print(sensors.getTempCByIndex(0));
  tft.print ( (char)248);
  tft.println("C");
  }
    if ((sensors.getTempCByIndex(0)>15)&&(sensors.getTempCByIndex(0)<30))
  { 
  tft.setTextColor (ST7735_YELLOW);
  tft.setCursor(80, 0);
  tft.setTextSize(1);
  tft.print(sensors.getTempCByIndex(0));
  tft.print ( (char)248);
  tft.println("C");
  }
    if ((sensors.getTempCByIndex(0)>=30))
  { 
  tft.setTextColor (ST7735_RED);
  tft.setCursor(80, 0);
  tft.setTextSize(1);
  tft.print(sensors.getTempCByIndex(0));
  tft.print ( (char)248);
  tft.println("C");
  }
   
  tft.setTextColor (ST7735_WHITE);
  tft.setCursor (0,10);
  tft.setTextSize (1);
  tft.print ("Umidita'");
  tft.setCursor (80,10);
   tft.setTextSize (1);
  tft.print (dht.readHumidity());
  
  tft.print (" %");

tft.setCursor (0,20);
  tft.setTextSize (1);
  tft.print ("Dew Point");
  tft.setCursor (80,20);
   tft.setTextSize (1);
  tft.print (dewPoint);
  tft.print ((char)248);
  tft.print ("C");
 tft.setCursor (0,30);
  tft.setTextSize (1);
  tft.println ("Vento");
  tft.setCursor (55,30);
  tft.setTextSize (1);
tft.print (KMH);
tft.print ("Km/h");
tft.setCursor (110,30);
tft.setTextSize (1);
tft.print (windDirection[idx]);
tft.setCursor (0,40);
tft.setTextSize (1);
tft.print ("Pressione");
tft.setCursor (65,40);
tft.setTextSize (1);
tft.print (pressionelivellodelmarehPa);
tft.setCursor (110,40);
tft.setTextSize (1);
tft.print ("hPa");
 tft.setTextColor (ST7735_BLUE);
tft.setCursor (0,50);
tft.setTextSize(1);
tft.print ("Wind Chill");
tft.setCursor (80,50);
tft.setTextSize(1);
tft.print (windchill);
tft.print ((char)248);
tft.print ("C");
 tft.setTextColor (ST7735_RED);
tft.setCursor (0,60);
tft.setTextSize (1);
tft.println ("Heat Index");
tft.setCursor (80,60);
tft.setTextSize (1);
tft.print (heatindexc);
tft.print ((char)248);
tft.print ("C");
tft.setTextColor (ST7735_YELLOW);
tft.setCursor(0, 70);
tft.setTextSize(1);
tft.println("Temp.INSIDE");
tft.setCursor(80, 70);
tft.setTextSize(1);
tft.print(barometer.GetTemperature());
tft.setTextSize(1);
tft.print((char)248);
tft.setTextSize(1);
tft.println("C");
tft.drawLine (0,80,tft.width()-1,80,ST7735_WHITE);
}
void rawdump() {
  Serial.print("Raw: ");
  for (int i=0 ; i<41 ; i++) {
    Serial.print (data[i]);
    if (i == 4) {
      Serial.print (" ");
    }
    if (i == 8) {
      Serial.print (" ");
    }
    if (i == 17) {
      Serial.print (" ");
    }
    if (i == 20) {
      Serial.print (" ");
    }
    if (i == 24) {
      Serial.print (" ");
    }
    if (i == 28) {
      Serial.print (" ");
    }
    if (i == 37) {
      Serial.print (" ");
    }
  }
}

void outputResults() {
  Serial.println();

  int idx =0;
  for (int i=8 ; i> 4 ; i--) 
  //for (int i=6 ; i> 2 ; i--) // dato modificato
  {
    idx = idx *2 + data[i];  // data[i] == 0/1.. see prev post.  //
  }

  Serial.print("idx: ");
  Serial.println(idx, DEC);
  Serial.print("Wind: ");
  Serial.println(windDirection[idx] );
  //  Serial.println();

  Serial.print("Swapped: ");

  //HEAD
  for (int i =0 ; i< 5 ; i++)
  {
    Serial.print(data[i]);  // it contains 0 or 1
  }

  Serial.print(" ");

  //WINDDIR
  for (int i =8 ; i> 4 ; i--)
  {
    Serial.print(data[i]);
  }
  Serial.print(" ");

  //WIND SPEED
  for (int i =17 ; i> 8 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  //WIND SPEED+3
  for (int i =20 ; i> 17 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  /*
  // Checksum
   for (iCounter=0;iCounter<4;iCounter++)
   {
   checksum |= (TX23_DATA_GET_BIT << iCounter);
   delayTargetuSec += bitLength;
   TX23_DoDelay;
   }

   //Calculate Checksum
   unsigned int checksumCalc = 0;
   checksumCalc += (winddir & 15);
   checksumCalc += ((windspeed >> 8) & 15);
   checksumCalc += ((windspeed >> 4) & 15);
   checksumCalc += (windspeed & 15);
   */

  // Checksum
  for (int i =24 ; i> 20 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  //WIND DIR NEGATEIVE
  for (int i =28 ; i> 24 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  //WIND SPEED NEGATED
  for (int i =37 ; i> 28 ; i--){
    Serial.print(data[i]);
  }

  Serial.print(" ");

  //WIND SPEED NEGATED +3
  for (int i =40 ; i> 37 ; i--){
    Serial.print(data[i]);
  }
  Serial.println();
  //  Serial.println();
  //  Serial.println();


  
}
[/code]
Comprende tutti i valori che si leggono in questa foto la stazione meteo. ;) 
[img]http://www.lineameteo.it/files/images/1789/img_0501.jpg[/img] 

Ho tarato la pressione con la davis di pigi ed è identico il valore di pressione, ovviamente sul livello del mare, alla sua che sta a 2km. In più ovviamente adesso che c'è questa struttura anticiclonica di sicuro non mi sbaglio  :D  Vedi che serve a qualcosa  :mrgreen: 
 :bye:

P.S. A leggere tutto ci vogliono circa 5/6 secondi per via della lunghezza del programma. ;)


