Projet Station Météo Pro : nouvel abri construit
Depuis le démarrage de la station, j’avais constaté une légère surestimation des températures en comparaison avec les stations météo environnantes. Le fait que la sonde soit sur le toit était un problème. J’ai donc installé un nouvel abri météo dans le jardin.
Fabrication de l’abri
Je suis reparti sur un abri à coupelle imprimé en 3D (merci chérie) (sources stl ici) dont l’intérieur des coupelles a été peint en noir pour absorber la chaleur. Le reste des coupelles est peint en blanc.
L’abri est composé d’une coupelle chapeau plus large que les autres (pour protéger des intempéries), d’une coupelle pleine, de 4 coupelles creuses, et d’un support bas.
Puis l’ensemble a été assemblé à l’aide de tiges filetées de 5mm. J’ai rajouté des écrous aux entretoises existantes pour une meilleure circulation d’air.
L’ensemble a été fixé sur un mat de 2m de haut pour être au dessus de la haie côté ouest. L’abri est à 10m d’un grand sapin, seul obstacle près. Je n’ai pas pu faire autrement.
Depuis la maison, j’ai tiré environ 70m de câble pour aller jusqu’à la sonde !
La sonde
J’ai d’abord testé avec un SHT31, via le protocole i2c. Bien mal m’en a pris, le protocole i2c ne supporte pas la longueur et ne fonctionne plus au bout de quelques mètres …
Dans mon stock, j’avais encore des sondes 1wire DS18B20, que j’affectionne particulièrement. Après avoir checké la datasheet, la longueur n’était pas un problème. Me voilà parti pour câbler la sonde.
Code source
Pour fiabiliser les mesures, j’ai fait comme avec le BME280 : j’ai fait une moyenne sur 1 min. Mais attention, le DS18B20 a quelques variations à la mesure. J’ai donc enregistré les valeurs dans un tableau (20 valeurs en 1 min), puis trier le tableau par valeurs croissantes (cf. la librairie ArduinoSort) puis j’ai écarté les extrêmes (3 à chaque fois). J’ai fait la moyenne des valeurs restantes pour être au plus près de la réalité. Voici ci dessous le code de test :
#include <DallasTemperature.h>
#include <ArduinoSort.h>
unsigned long previousMillis= 0;
unsigned long previousMillis2= 0;
unsigned long delaiAnemometre = 3000L; //3 secondes
unsigned long delaiProgramme = 60000L; //60 sec
int tab_index = 0;
int tab_indexMin = 0;
int tab_indexMax = 0;
int nbValeur = 0;
float tempFinale(0);
float cumul(0);
float temp(0);
static float tab[20];
void setup()
{
Serial.begin(9600);
Serial.println("starting ...");
}
void loop()
{
unsigned long currentMillis = millis(); // read time passed
if (currentMillis - previousMillis > delaiAnemometre){
previousMillis = millis();
OneWire oneWire(8);
DallasTemperature sensors(&oneWire);
sensors.begin();
sensors.setResolution(11); //0,125°C
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.print("Temp");
Serial.print(":");
temp = sensors.getTempCByIndex(0);
if((temp == -127) or (temp > 70)){
Serial.println("N/A");
}
else{
// Serial.println(temp);
tab[tab_index] = temp; //remplir tableau avec 10 valeurs du capteur qui se suivent
Serial.print(tab_index);
Serial.print(" : ");
Serial.println(tab[tab_index]);
tab_index++;
}
}
//Toutes les minutes, compilation des valeurs et envoi au serveur
if (currentMillis - previousMillis2 > delaiProgramme){
previousMillis2 = millis();
sortArray(tab, tab_index);
tab_indexMin = 3;
tab_indexMax = tab_index - 4;
for (int i = tab_indexMin ; i < tab_indexMax ; i++){
cumul += tab[i] ; //somme des valeurs du tableau
nbValeur++;
}
Serial.println("----------------");
Serial.print("Temp moy : ");
tempFinale = cumul/nbValeur;
Serial.println(tempFinale);
Serial.println("----------------");
cumul = 0;
nbValeur = 0;
tab_index = 0;
}
}
Conclusion
Après quelques péripéties de code, tout s’est bien passé. La valeur de la température est désormais beaucoup plus proche de la réalité grâce à cet abri.