Scusatemi!
Avete ragione, mi sono dimenticato di dire che:
Attualmente sto sperimentando con la genuino 101
Uso un sensore di temperatura/pressione in I2C bosch BMP 180 con la libreria apposita.
Il codice è in pratica l'esempio originale della guida della libreria BMP 180.
solo che ho inserito la parte dell' LCD, e dovrei inserire anche altre funzioni...
La pressione atmosferica varia di circa 3-4 fino a 5-6 hPa/24h, ma questo sensore ogni 5 secondi scrive sulla variabile p0 un valore con i decimali che oscillano.
Possiedo altre 2 centraline, una Netatmo e una vecchia WS2350. il sensore Bosch BMP180 I2C collegato alla genuino è preciso e pari al 100% alle altre due.
Comunque il problema non è l'attesa di un significativo cambio di pressione: ogni 5 secondi per esempio sul monitor e su LCD vedo: 1019.54, 1019,46, 1019,56, 1019,64... Penso sia normale che oscilli. Quello che conta in meteorologia sono i numeri prima della virgola, e la loro tendenza...
Per provare il mio sketch subito senza attendere un giorno (dato che sono giorni che ci provo ma non va) riduco il tempo a 30 secondi. Ogni 30 secondi Dovrei sempre vedere un valore decimale diverso, di poco ma diverso...
Se sommo dp1 e dp2 visualizzo correttamente le due variabili sommate, se sottraggo vedo sempre zero positivo o negativo, anche se i due operandi non sono uguali...
Esempio, se prima leggo 1013.20, poi dopo 30 secondi leggo 1013.25 dovrei trovarmi -0,05 hPa
Se metto una costante in sottrazione con dp1 o dp2, vedo la costante con segno negativo... (come se dp1 e dp2 fossero uguali a zero.
Il problema è come se non si potesse scendere sotto lo zero con i numeri negativi, ma le variabili float in teoria dovrebbero essere anche con segno. Inoltre se provo a sottrarre con due costanti fisse mettendo dp = 1000,05 - 1000,10 sull'LCD e sul monitor visualizzo correttamente -0,05...
Ecco il codice, è un po un taglia e cuci ed è fatto da un novello:
#include <SFE_BMP180.h> //libreria per lettura sensore
#include <Wire.h> //libreria originale arduino per bus I2C
#include <LiquidCrystal_I2C.h> //libreria per display LCD I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);
SFE_BMP180 pressure; //creo un oggetto chiamato pressione su libreria del pressostato
#define ALTITUDE 44 // definisco Altitude attuale dove mi trovo in metri, utile per calcolare la pressione relativa
void setup() {
while (!Serial);
Serial.begin(9600); //inizializzo la seriale per monitor PC
Serial.println("IN AVVIO"); //scrivo sul monitor PC l'avvio della lettura
lcd.begin();
lcd.clear(); //pulisco il display per riavvarlo
lcd.print("Centralina Meteo"); //scrivo sul display una scritta di avvio
lcd.setCursor(0, 1); //sposto il cursore sulla seconda colonna (seconda riga)
lcd.print("by Luca 2016"); //scritta di avvio sulla secona riga
delay(2000); //attendo 5 secondi questa pagina di avvio
if (pressure.begin()) { //inizializzo sensore (questo è importante per ottenere valori di calibrazione memorizzati sul sensore)
Serial.println ("Avvio effettuato correttamente"); //se l'inizializzazione ha successo, scrivo nel monitor l'avvenuta inizializzazione
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Avvio sensore OK");
delay(2000);
lcd.clear();
}
else
{
Serial.println("Errore inizializzazione sensore"); //altrimenti scrivo errore inizializzazioni
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Errore inizializzazione");
lcd.setCursor(0,1);
lcd.print("sensore");
while (1); //se l'inizializzazione del programma è fallita con while(1) vado in pausa perenne.
}
}
void loop() // Loop del programma per ottenerei i valori di pressione ogni 5 secondi .
{
char status;
double T, P, p0, a;
float dp, dp1,dp2;
Serial.println();
Serial.print("Altitudine iniziale: ");
Serial.print(ALTITUDE, 36);
Serial.println(" metri ");
// Se si vuole misurare l'altitudine e non la pressione è necessario fornire una pressione di riferimento nota .
// Questo è mostrato alla fine dello sketch.
// È necessario innanzitutto ottenere una misura di temperatura per eseguire una lettura della pressione .
// Avvia una misurazione della temperatura :
// Se la richiesta ha successo , viene restituito il numero di ms di attesa .
// Se la richiesta non è riuscita, viene restituito 0
status = pressure.startTemperature();
if (status != 0)
{
// Attendere che la misura per completare:
delay(status);
// Recupera la misurazione della temperatura completato:
// Si noti che la misura è memorizzato nella variabile di T.
// Funzione restituisce 1 in caso di successo , 0 se il fallimento .
status = pressure.getTemperature(T);
if (status != 0)
{
// Print out the measurement:
Serial.print("temperatura: ");
Serial.print(T, 2);
Serial.println("'C " );
lcd.setCursor(5, 0);
lcd.print("C");
lcd.setCursor(3, 1);
lcd.print(T);
// Start lettura pressione atmosferica
status = pressure.startPressure(3);
if (status !=0)
{
// Attendi per la misura
delay(status);
// Calcolo pressione assoluta
status = pressure.getPressure(P, T);
if (status != 0)
{
// Print out the measurement:
Serial.print("pressione assoluta: ");
Serial.print(P, 2);
Serial.println(" hP ");
// calcolo pressione relativa alla quota in metri impostata su variabile ALTITUDE
p0 = pressure.sealevel(P, ALTITUDE);
Serial.print("pressione relativa: ");
Serial.print(p0, 2);
Serial.println(" hP ");
l
// Calcolo variazione altitudine
a = pressure.altitude(P, p0);
Serial.print("altitudine calcolata: ");
Serial.print(a, 0);
Serial.println(" metri ");
}
else Serial.println("errore retrieving pressure measurement\n");
}
else Serial.println("errore starting pressure measurement\n");
}
else Serial.println("errore retrieving temperature measurement\n");
} else Serial.println("errore starting temperatura measurement\n");
//Calcolo variazione pressione su 12h.
lcd.setCursor(11, 0);
lcd.print("mBar");
lcd.setCursor(10, 1);
lcd.print(p0);
dp1 = p0;
delay(30000);
dp2 = p0;
dp = dp2-dp1;
lcd.setCursor(0, 3);
lcd.print("Diff. ");
lcd.setCursor(14,3);
lcd.print("mbar/h");
lcd.setCursor(6,3);
lcd.print(dp);
}/code]