Salve gente!
Siccome da quasi un anno che testo il pluvio con Arduino della LaCrosse WS2300-16, da poco ha cominciato a fare un problemino. Mi spiego: praticamente a volte non rileva l'interrupt che è nel codice. Ovvero quindi non mi segna qualche volta la pioggia, faccio scattare la bascula ed è come se non è successo niente. Siccome io ho cercato allora di ottimizzare l'interrupt al meglio e renderlo pulito, allora mi sono detto che non può essere qualcosa di SW, poi ditemi che ne pensate, intanto pubblico la parte relativa a esso nello sketch:
Queste le dichiarazioni di guerra ![]()
const int pinLed_blink = 6; // led verde che lampeggia
const int pinLed_inter = 7;
const float mmGoccia = 0.518;
const int pinInterrupt = 3;
unsigned int gocce = 0; // variabile conteggio numero basculate
float mmPioggia = 0.0; // conteggio millimetri di pioggia
boolean statoLed = false;
unsigned long time;
volatile unsigned long time1;
unsigned long PluvioStep = 0;
unsigned long PluvioOldStep = 0;
const long OF = 4294940295;
volatile int PluvioFlag = 0;
//int PluvioScanTime = 500;
float mmPioggiamese = 0.0;
float mmPioggiaanno = 0.0;
float rainrate = 0;
Questo nel setup:
attachInterrupt(1, ContaGocce, FALLING);
Questa la funzione ISR
void ContaGocce()
{
// noInterrupts();
// if ((time - PluvioStep) >= PluvioScanTime) { //con questo PluvioContatore evitiamo che uno scatto venga Conteggiato per due volte
//if (PluvioVal==LOW) {
PluvioFlag = 1;
//}
//}
time1 = millis();
//}
//interrupts();
}
Questa la funzione del rain rate (ma in realtà non ce ne frega niente, però la metto lo stesso
)
void PluvioDataEngine() {
if (((PluvioStep - PluvioOldStep) != 0) && (gocce >= 2)) {
if ((time - PluvioStep) > (PluvioStep - PluvioOldStep)) {
rainrate = 3600 / (((time - PluvioStep) / 1000)) * mmGoccia;
if (rainrate < 1) {
gocce = 0;
rainrate = 0;
}
} else {
rainrate = 3600 / (((PluvioStep - PluvioOldStep) / 1000)) * mmGoccia;
}
} else {
rainrate = 0.0;
}
}
Infine il famoso loop
time = millis();
if (millis() >= OF) //per evitare problemi di rain rate quando millis andrà in overflow, gli facciamo prendere una pausa alla funzione PluvioDataEngine()
{
gocce = 0;
}
if (PluvioFlag == 1) {
PluvioFlag = 0;
PluvioOldStep = PluvioStep;
PluvioStep = time1;
gocce++; // incrementa numero basculate
mmPioggia = mmPioggia + mmGoccia; // sommatoria millimetri pioggia
mmPioggiamese = mmPioggiamese + mmGoccia;
mmPioggiaanno = mmPioggiaanno + mmGoccia;
EEPROM.put (eeAddress29, mmPioggia);
EEPROM.put (eeAddress30, mmPioggiamese);
EEPROM.put (eeAddress31, mmPioggiaanno);
statoLed = !statoLed;
digitalWrite(pinLed_inter, statoLed ? HIGH : LOW);
}
PluvioDataEngine();
Sinceramente a me mi sa perfetto...
Così invece la parte HW
Io pensavo al massimo di abbassare la Rpullup, ma bho.
Secondo me infine penso sia un problema proprio di pluviometro, informandomi in giro ho visto che può avere problemi, al di fuori proprio di Arduino, l'ampolla reed: dicono sia scadente. Voi che dite?

