Lettura dati sensore sballati dopo alcune ore

Ciao a tutti, mi scuso anticipatamente per il titolo un po altisonante ma non saprei bene come descrivere il mio problema...
Ho realizzato una piccola stazione meteo con due arduini che comunicano a distanza usando i famosi moduli RF economici da 433mhz, con qualche modifica riesco ad avere un segnale stabile dall arduino che si trova all'esterno dentro una scatola impermeabilizzata che legge valori dal dht22 e li invia all' arduino dentro casa, collegato in seriale usb con un raspberry che riceve i dati e me li colloca in un database da poi mostrare online... Il tutto funziona stabilmente per alcune ore dopodiche per un problema credo imputabile al DHT22 che uso per leggere temp e umidità, impazzisce restituendo valori tipo 13108 oppure 0 dopo alcune ore di attività. Vi allego il codice dell arduino che trasmette, quindi probabilmente il "colpevole".

#include <VirtualWire.h>
#include <DHT.h>
#include <stdlib.h>
#define dhtPin 4
#define dhtType DHT22
#define txPowerPin 3
#define BUTTON 7

DHT dht(dhtPin, dhtType);

int  val = 0;
float tem = 0.00;
float hum = 0.00;
int cont = 0;


void setup() {
 pinMode(txPowerPin, OUTPUT);
 pinMode(txPowerPin, LOW);
 pinMode(BUTTON, INPUT);
 vw_setup(4800);     // VirtualWire communication speed
 vw_set_tx_pin(2);  // VirtualWire transmit pin
 Serial.begin(9600);
}

void loop() {

while (cont<600) {           //TIMER DI 10 MINUTI, MI SERVE PER NON SATURARE IL DB INUTILMENTE
  val = digitalRead(BUTTON);
  if (val == HIGH){              //PER PROVA ANZICHE ASPETTARE PER FORZA 10 MINUTI, BASTA CHE PREMO UN PULSANTE PER AVERE SUBITO LA TRASMISSIONE DEI DATI
    sendValue();
  }
  delay(1000);
  cont++;
}
   
if (cont>=600) {
  sendValue();
 }
}

void sendValue() {
digitalWrite(txPowerPin, HIGH);    // ACCENDE IL LED DI TRASMISSIONE  
 hum = dht.readHumidity();            //LEGGE TEMP E UMIDITA' DAL SENSORE
 tem = dht.readTemperature();                            
 char cMsg[254], cTemp[8], cHum[8];    //DICHIARA LE STRINGHE
 FtoChar(tem, 1, cTemp);                          //CONVERSIONE DA FLOAT A CHAR
 FtoChar(hum, 1, cHum);
 sprintf(cMsg, "%s;%s;\n", cTemp, cHum);    // PRENDE I DUE CHAR E LI INSERISCE IN UN UNICA STRINGA SEPARATA DA ;
 
 Serial.println(cMsg);             //DEBUG SERIALE 
 vw_send((uint8_t *)cMsg, strlen(cMsg));     // INVIA LA STRINGA
 vw_wait_tx();                         // Wait for tx to finish
 digitalWrite(txPowerPin, LOW);
 cont=0;
}

char* FtoChar(float fVal, int iDigs, char* cF) {

    // Separator = 10 ˆ Number of decimal places
    long dSep = pow(10, iDigs);

// DEBUG
// Serial.print(F("FtoChar dSep: "));
// Serial.println(dSep);

    // Display value = floal value * separator
    signed long slVal = fVal * dSep;

    sprintf(cF, "%d.%d", int(slVal / dSep), int(slVal % int(dSep)));
}

La comunicazione tra i due arduini avviene mediante la combinazione di due float convertiti in char e successivamente combinati in un unica stringa, in modo da sintetizzare le due informazioni in una sola, quindi nella stringa abbiamo la temperatura seguita da un ; e il valore dell'umidità, l'arduino ricevente interpreta questi due valori sapendoli estrapolare e riconvertendoli in float.
Vi allego anche il mio thingspeak, database online accessibile che uso per immagazzinare tutti i valori letti ogni 10 minuti, potete notare bene come gia accennato che dopo ore di funzionamento normale, improvvisamente segna valori strani, sottolineo anche il fatto che se scollego e ricollego soltanto l'arduino trasmettente, ritorna a trasmettere i valori letti correttamente per poi ribuggarsi dopo alcune ore, che a volte sono un decina a volte anche 24 ore, dipende....

Ho letto anche in giro che i sensori dht lasciati all'esterno anche se protetti dall'acqua, l'umidità atmosferica va come a saturare il sensore e quindi causare un malfunzionamento. Il mio è fuori da 4 mesi, mai acqua diretta ma nella scatola in cui si trova ovviamente c'è una griglia che fa passare l'aria e quindi anche umidità, potrebbe essere lui? Oppure magari è un problema di codice? Ho provato anche solo con il pc a ricevere i dati sulla seriale quindi bypassando il raspberry e i valori sono identici... Ho anche un altro dht11 che non ho mai usato praticamente, potrei provare a sostituirlo e vedere se fa uguale.... Vi aggiorno e ringrazio anticipatamente per la comprensione

Link al db online temperatura

Link al db online umidità

Buonasera e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà, quindi ti consiglio di farla al più presto. :wink:

Ciao, mi sono presentato :+1:

Ok, io solo questo aspettavo

Il programma grosso modo va bene

Ha qualche incertezza, in particolare non inizializzi correttamente il pin txpower, ma non è li il problema

Il problema credo sia nella sendvalue()
Dove crei tre array di char senza inizializzarli
Siccome sono locali se non li inizializzi il loro contenuto potrebbe essere sporco

Inizializzali a 0 (terminatore di stringa) e vediamo cosa succede

Ciao, grazie mille per la dritta, ho corretto il codice e lo ora lo ricarico sull'arduino, vi aggiornerò tra un po di ore :slightly_smiling_face:

Allora vi aggiorno, ho inizializzato i tre array di char a 0, purtroppo il problema è rimasto tale, cosi ho cambiato direttamente il sensore con un dht11, anche lui però dopo un po di ore segna valori tipo 80 gradi o cose cosi e finisce per bloccare e non trasmettere piu. Ho provato quindi ad alimentarlo a 3.3v anziche 5 ma sta volta non si è bloccato ma ogni tot segna comunque valori sballati... Ora mi viene da pensare solo che sia un problema legato magari ai due moduli, che magari il trasmettitore non vada a trasmettere correttamente la stringa per alcuni motivi e venga interpretata male dall'arduino che riceve, ovviamente da due cosi cinesi da 2€ per me è gia tanto che riesco a farli comunicare da parte a parte della casa :rofl: :rofl:

Posso provare a collegare semplicemente l'arduino in seriale al pc, lasciarlo acceso diverse ore e vedere se veramente è il dht il problema

Hai verificato che siano effettivamente i valori tornati da dht ad essere sbagliati e non sia un problema di conversione?

Facendo una cosa del genere vedi come i dati?

hum = dht.readHumidity();
tem = dht.readTemperature();
Serial.print("hum: ");
Serial.print(hum);
Serial.print("tem: ");
Serial.println(tem);

Ragazzi allora credo che sia stato un problema di alimentazione, ora ho sempre il dht11 collegato ai 3.3v dell arduino, mentre invece tutta la scheda mi ero scordato di specificare che la sto alimentando tramite un alimentatore 12v da 5A che uso per la sorveglianza, visto che è sempre attaccato e il consumo irrisorio mi sono allacciato li e tramite un DC DC converter ho abbassato la tensione da 6 a 5 volt precisi, probabilmente la tensione piu alta va a "disturbare" o il dht o i moduli RF, adesso sembrerebbe funzionare tutto, ora sono piu di 24 ore che è collegato e i dati sono precisi.

Lascio qualche altro giorno cosi e dopo riprovo di nuovo col dht22 :slight_smile:

1 Like

Ragazzi ormai il sistema è on da piu di una settimana... I dati tutto sommato arrivano precisi eccetto ogni tot di ore che la stringa arriva "tagliata" all'arduino ricevente (colpa dei moduli RF), di conseguenza i valori vengono falsati, per ovviare a questo ho messo un controllo sul codice che va a confrontare il valore appena letto con quello precedente, di conseguenza se la differenza è oltre una soglia, non invia i dati al database, altrimenti se sono validi si. Alla fine forse il dht non c'entrava, o se c'entrava era per l'alimentazione, piuttosto come ho detto sono i moduli che non sono affidabili, semplicemente è troppa distanza e quindi capita che ogni tanto la stringa non arrivi come dovrebbe arrivare, però alla fine sono soddisfatto comunque, il sistema funziona!

Effettivamente il DHT11 è un po' più "schizzinoso" sulla tensione: il data sheet riporta 3,5-5,5v quindi a 6 volt non era garantita la corretta lettura, ma nemmeno a 3,3 volt...
Magari usa i DHT22 che non costano tanto di più ma sono migliori perché hanno una precisione del 2% contro il 5% sull'umidità e accettano tensioni dai 3,3 ai 6 volt.