Basé sur le modèle de MakerWorld

Le pluviomètre est équipé d’un Module Hal KY-024 , qui détecte les basculements de l’auget (aimant sur l’axe).
Le capteur est raccordé a l’esp32 sur une entrée numérique qui drive un interrupt logiciel de la mêe manière que la mesure de vitesse.
Voici la détection, tilted indiquant le nombre de basculement détectés. 
L’auget du pluviomètre Makerworld contient 5 ml d’eau (volume de bascjuement), soit 5000 mm3 et le diamètre de l’entonnoir d’entrée est de 107,58 mm, comme expliqué sur makerworld cela nous donne une surface d’entrée de 2893,44 mm2
Donc la colonne d’eau exprimée en mm est donc le volume divisé parr la surface ( mm3 / mm2 = mm).
Il suffit donc de compter le nombre de basculement de l’auget par unité de temps choisie (habituellement 24 Hrs) pour connaitre le volume total d’eau.
Au niveau de la programmation, les basculement est signifié a l’ESP32 via un data input, celui-ci est confiuré pour interrompre le programme de l’ESP et d’effectuer le code (minimum) du compteur.
définir la variable en volatile , cette varialbe devant être modifiée par la routine de traitement des interruptions elle doit donc être mise en RAM (volatile).
volatile unsigned long tiptime = millis();
définir la pin d’entrée du signal envoyé par le capteur de basculement de l’auget dans mon cas la GPIO D5.
#define RAININTRPT 5
Cette routine est placée à une adresse fixe dans la mémoire (IRAM_ATTR), ce qui permet d’y faire appel a n’importe quel moment du déroulement du programme principal, on spécifie donc au compilateur/linker de l’y placer On y ajoute un debounce de 50 ms pour éviter les fausses détections.
void IRAM_ATTR countRain() {
static unsigned long last_micros = 0; // debaounce time
unsigned long interrupt_time = millis(); // get current time
console->print("."); // signal interrupt to console
if ( interrupt_time - last_micros > 50UL ) {
tiptime=interrupt_time; // bucket tip detected, store new tiptime in RAM
}
last_micros = interrupt_time;
}
La variable en RAM pouvant être modifiée à tout moment par une interruption, il y a lieux de lire la veleur en déshabilitant les interruptions pendant un temps le plus court possible.
unsigned long rain(){
// return the tiptime
noInterrupts(); // disable interrupts
int local = tiptime; // move value intolocal variable
interrupts(); // Enable interrupts
return local; // return the local variable
}
Lors d’un changement on détecte le flan montant (RISING) sur la pin d’entrée (RAININTRPT), l’ESP exécutera alors la routine (countRain).
void setrain() {
console->print("setting rain interupt pin :");
console->println(RAININTRPT);
pinMode(RAININTRPT,INPUT_PULLUP); // define the pin interrupt
attachInterrupt(digitalPinToInterrupt(RAININTRPT), countRain, RISING); // attach the interrupt to the routine
}
NOTE La routine d’interrupt doit maintenir une variable indiquant le changement, le temps ne peut être utilisé car cette variable doit impérativement être en 8 bits, le CPU lisant suelement un byte a la fois.
On peut maintenir un compteur (comme dans le cas de l’anémomètre) ou utiliser un flip-flop qui passe de 0 à 1 et vice versa à chaque interrupt.
ttip = rain(); //fetch last interrupt time only once.
rdeltat = ttip - oldtip; //compute time since last tip
if ((now - rain_long_t) >= HRS24) {
//compute the rain column = ctip count * 0.550053
rain_24hr = float(rcount) * 0.550053; // compute the column
rcount=0; //reset the tip counter
}
if ((now - rain_short_t) >= MIN10) {
//compute the rain column = ctip count * 0.550053
rain_10min = float(rcount) * 0.550053; // compute the column
r2count=0; //reset the tip counter
rain_short_t = now;
}
On peut dès lors comptabiliser les delta_t et obtenir ainsi le taux de pluie par unité de temps (24hrs ou 10 minutes) mais aussi l’intensité de la pluie inversément proportionelle au temps de remplissage.
ou içi
| Name | Measure (mm/hour) | type | Real-world example |
|---|---|---|---|
| Trace | < 0.25 mm/h | Barely measurable precipitation | Light mist that barely wets surfaces |
| Very Light | 0.25 - 1.0 mm/h | Light drizzle | Fine droplets, gentle pattering on leaves |
| Light | 1.0 - 2.5 mm/h | Light rain | Comfortable to walk in without umbrella for short periods |
| Moderate | 2.5 - 10 mm/h | Moderate rain | Umbrella recommended, puddles form slowly |
| Heavy | 10 - 50 mm/h | Heavy rain | Rapid puddle formation, reduced visibility while driving |
| Violent | 50+ mm/h | Extreme precipitation | Flash flooding possible, dangerous driving conditions ¬ |