Ciao a tutti!
Come già trattato in alcuni altri topic in questo forum, scrivo per parlare della mia stazione meteo.
Si basa su una scheda ESP32, alla quale sono collegati un sensore BME280 per rilevare temperatura, pressione e umidità, una fotoresistenza per rilevare la luminosità, un anemometro ALMOT 08880905 ed un pluviometro MS-WH-SP-RG.
Riporto di seguito il codice completo.
Purtroppo riscontro che dopo alcuni giorni di corretto funzionamento non si caricano più i dati, la scheda e tutto il sistema rimangono apparentemente bloccati fino a quando non stacco l'alimentazione e la ricollego.
Sapete aiutarmi ad individuare quale potrebbe essere la causa di questi blocchi e come correggere il problema?
Grazie a tutti
#include <Adafruit_Sensor.h> //per gestire il sensore BME280
#include <Adafruit_BME280.h> //per gestire il sensore BME280
#include <WiFiClientSecure.h> //per gestire la connessione alla rete Wifi e al client xyz.it
#include <WiFi.h> //per gestire la connessione wifi
#include <Wire.h> //per gestire I2C
//dati per la connessione alla rete Wifi
const char* SSID = "xxx";
const char* PASSWORD = "xxx";
//dati per la connessione ad xyz.it
const char* server = "www.xyz.it";
const uint16_t port = 443;
//dati intervallo lettura sensori
unsigned long tempo_start_lettura_sensori;
unsigned long intervallo_lettura_sensori = 60000; //effettuiamo una lettura dei sensori ogni 60 secondi
//dati sensore BME280
Adafruit_BME280 sensore_temp_umid_press_BME280;
//dati sensore fotoresistenza
const int pinFotoresistenza = 32;
//dati anemometro
const float pigreco = 3.141593;
const float raggio = 0.06; //raggio dell'anemometro in metri
const int pinAnemometro = 27;
int stato_reed_anemometro = 0;
int stato_reed_old_anemometro = 0; //variabile per evitare doppie pulsazioni
int num_pulsazioni = 0; //numero di pulsazioni (una per giro, c'è un solo magnete)
unsigned long int tempo_massimo_anemometro = 2000; //tempo (in millisecondi) dopo il quale calcolare la velocità e azzerare il numero di pulsazioni
//così non si conteggiano brevi folate di vento
unsigned long int inizio_elaborazione_anemometro;
float velocita_vento; //velocita vento rilevata dalla lettura
float velocita_vento_max = 0; //velocita vento massima misurata nelle 10 rilevazioni
float velocita_vento_min = 1000; //velocita vento minima misurata nelle 10 rilevazioni
//dati pluviometro
const float mmBasculata = 0.40; //millimetri per ogni basculata
const int pinPluviometro = 13;
int basculate = 0; //conteggio numero basculate
float mmPrecipitazioni = 0.0; //conteggio millimetri di pioggia
int stato_reed_pluviometro = 0;
int stato_reed_old_pluviometro = 0; //variabile per evitare doppie pulsazioni
//dichiarazione variabili ed array
int num_rilevazioni = 0;
float temperatura_media;
float umidita_media;
float pressione_media;
float luminosita_media;
float velocita_vento_media;
float temperatura_tot;
float umidita_tot;
float pressione_tot;
float luminosita_tot;
float velocita_vento_tot;
float precipitazioni; //valore da trasmettere al database
void setup() {
delay(500);
//Serial.begin(9600);
//connessione Wifi
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
//Serial.println("Tentativo di connessione");
}
//Serial.println("Connesso");
//impostazione avvio millis per lettura sensori
tempo_start_lettura_sensori = millis();
//inizializzazione I2C
Wire.begin();
//inizializzazione sensore BME280
sensore_temp_umid_press_BME280.begin(0x76);
//impostazione pin anemometro
pinMode(pinAnemometro, INPUT);
//impostazione pin pluviometro
pinMode(pinPluviometro, INPUT);
}
void loop() {
//reset di tempo_start_lettura_sensori in caso di overflow di millis che si azzera
if (millis()-tempo_start_lettura_sensori<0) {
tempo_start_lettura_sensori = millis();
}
//pluviometro
stato_reed_pluviometro = digitalRead(pinPluviometro); //legge il contatto reed
if (stato_reed_pluviometro != stato_reed_old_pluviometro){ //verifica se è cambiato lo stato
stato_reed_old_pluviometro = stato_reed_pluviometro; //se SI aggiorna lo stato
if (stato_reed_pluviometro == HIGH){ //controlla se lo stato è alto (passaggio magnete)
basculate++; //incrementa il numero di basculate
mmPrecipitazioni = mmPrecipitazioni + mmBasculata; //sommatoria millimetri di pioggia rilevati
}
}
//verifica se è trascorso l'intervallo per la lettura dei sensori
if ((millis()-tempo_start_lettura_sensori) > intervallo_lettura_sensori){
tempo_start_lettura_sensori = millis();
//anemometro
inizio_elaborazione_anemometro = millis(); //memorizza l'inizio dell'elaborazione
while (millis() - inizio_elaborazione_anemometro < tempo_massimo_anemometro) { //esegue fino a quando il tempo trascorso è minore al tempo massimo impostato
stato_reed_anemometro = digitalRead(pinAnemometro); //legge il contatto reed
if (stato_reed_anemometro != stato_reed_old_anemometro) { //verifica se è cambiato lo stato
stato_reed_old_anemometro = stato_reed_anemometro; //se SI aggiorna lo stato
if (stato_reed_anemometro == HIGH) { //controlla se lo stato è alto (passaggio magnete)
num_pulsazioni = num_pulsazioni + 1; //aggiorna il contatore delle pulsazioni
}
}
delay(10);
//reset di tempo_start_lettura_sensori in caso di overflow di millis che si azzera
if (millis()-inizio_elaborazione_anemometro<0) {
inizio_elaborazione_anemometro = millis();
}
}
float tempo_trascorso_anemometro_in_secondi = (tempo_massimo_anemometro/1000.0); //converte in secondi
//velocita_vento[num_rilevazioni] = (3.6*num_pulsazioni*2*pigreco*raggio)/tempo_trascorso_anemometro_in_secondi; //velocità in km/h (formula iniziale non utilizzata)
//2 impulsi/sec -> velocità vento 5km/h quindi: 5km/h : 2 impulsi/sec = velcoità vento : (impulsi/secondo rilevati)
//coefficiente correzione attrito x2.5
velocita_vento = ((num_pulsazioni/tempo_trascorso_anemometro_in_secondi) * 5 / 2) * 2.5;
velocita_vento_tot = velocita_vento_tot + velocita_vento;
//calcolo velocita_vento_max
if (velocita_vento>=velocita_vento_max){
velocita_vento_max=velocita_vento;
}
//calcolo velocita_vento_min
if (velocita_vento<=velocita_vento_min){
velocita_vento_min=velocita_vento;
}
num_pulsazioni = 0; //azzera il contatore delle pulsazioni per una nuova lettura
//sensore BME280
temperatura_tot = temperatura_tot + sensore_temp_umid_press_BME280.readTemperature();
umidita_tot = umidita_tot + sensore_temp_umid_press_BME280.readHumidity();
pressione_tot = pressione_tot + sensore_temp_umid_press_BME280.readPressure();
//sensore fotoresistenza
luminosita_tot = luminosita_tot + analogRead(pinFotoresistenza);
//operazioni da eseguire alla decima lettura eseguita
if (num_rilevazioni==9){
//calcolo dei valori da trasmettere al database
temperatura_media=temperatura_tot / 10.00;
umidita_media=umidita_tot / 10.00;
pressione_media=pressione_tot / 10.00;
luminosita_media=luminosita_tot / 10.00;
velocita_vento_media=velocita_vento_tot / 10.00;
precipitazioni=mmPrecipitazioni;
//trasmissione dati al server
if (WiFi.status() != WL_CONNECTED) {
//verifica connessione Wifi
//connessione Wifi
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
//Serial.println("Tentativo di connessione");
}
//Serial.println("Connesso");
}
if(WiFi.status()== WL_CONNECTED){
//verifica che il collegamento wifi sia attivo
String var="temp=" + String(temperatura_media) + "&umid=" + String(umidita_media) + "&pres=" + String(pressione_media) + "&lumi=" + String(luminosita_media) + "&velo=" + String(velocita_vento_media) + "&velo_max=" + String(velocita_vento_max) + "&velo_min=" + String(velocita_vento_min) + "&prec=" + String(precipitazioni);
String url = "GET /aggiungi.php?" + var + " HTTP/1.1";
//collegamento all'host xyz.it
WiFiClientSecure client;
client.setInsecure(); //non si utilizzano certificati di sicurezza
if (client.connect(server, port)) {
//verifica che il collegamento col client sia andato a buon fine
client.println(url);
client.println("Host: www.xyz.it");
client.println("Access-Control-Allow-Origin: *");
client.println("Connection: close");
client.println();
delay(500); //delay fondamentale altrimenti a volte chiude la connessione prima che la pagina sia stata correttamente interrogata
client.stop();
}
}
//azzeramento delle variabili
num_rilevazioni=-1; //appena fuori dal if ci sarà subito un +1 chela porta al valore iniziale 0
temperatura_tot=0;
umidita_tot=0;
pressione_tot=0;
luminosita_tot=0;
velocita_vento_tot=0;
velocita_vento_max=0;
velocita_vento_min=1000;
precipitazioni=0; //valore da trasmettere al database
basculate=0;
mmPrecipitazioni=0;
}
num_rilevazioni=num_rilevazioni+1;
} //millis lettura sensori
} //loop