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à