Bonjour à toutes et à tous,
Un petit projet d’anémomètre avec une réception des données via le wifi et surtout autonome en énergie. Difficile de remplacer les piles d’un équipement à plusieurs mètres de haut.
Alors j’ai commencé par chercher un anémomètre de base, au début, j’en cherchais un avec un anémomètre à effet hall mais finalement j’en ai trouvé un avec un petit moteur intégré (je ne connais pas le nom). Donc dans le principe, il suffit de mesurer la tension qui en sort, le plus dur étant de l’étalonner (voiture, vitre ouverte et voltmètre). Coup de bol j’ai mesuré 1V pour 100Km/h et les valeurs sont linéaires.
Après un Wemos, un chargeur de pile lithium et un petit panneau solaire.

Le but est d’économiser de l’énergie, donc mettre le wemos en économie d’énergie (le wifi consomme trop), stocker les données (valeur max, moyenne sur 10 min, etc…) et les envoyer toutes les 10 minutes.
Les relevés me semblent cohérents avec les relevés Météo France, et habitant dans l’Aude il tourne souvent, mais il faudrait un vrai anémomètre pour le valider et surtout étalonner l’anémomètre.
Après 6 mois d’utilisation, je n’ai pas eu à recharger la pile.
Bon maintenant le code, n’étant pas doué la dessus je suis très ouvert à toute amélioration.
esphome:
name: anemometre-wemos
esp8266:
board: d1_mini
# Connexion WiFi optimisée
wifi:
ssid: "Wifi"
password: "password"
manual_ip:
static_ip: 192.168.3.52
gateway: 192.168.3.1
subnet: 255.255.255.0
power_save_mode: LIGHT # Active le modem-sleep pour économiser de l'énergie
fast_connect: true
reboot_timeout: 60s
# Configuration MQTT
mqtt:
broker: 192.168.3.31
username: "mqtt"
password: "mqtt"
topic_prefix: "anemometer"
discovery: true
discovery_prefix: homeassistant
# Stockage des valeurs en mémoire
globals:
- id: wind_values
type: std::vector<int16_t>
restore_value: no
initial_value: "std::vector<int16_t>(300, 0)"
- id: wind_index
type: int
restore_value: no
initial_value: '0'
# Lecture du signal de l'anémomètre
sensor:
- platform: adc
pin: A0
name: "Tension Anémomètre"
unit_of_measurement: "V"
accuracy_decimals: 3
update_interval: 2s
id: wind_voltage
filters:
- multiply: 3.3
# Vitesse instantanée
- platform: template
name: "Vitesse Instantanée"
unit_of_measurement: "km/h"
accuracy_decimals: 2
state_class: measurement
lambda: |-
float voltage = id(wind_voltage).state;
if (voltage < 0.03) return 0.0;
return voltage * 100.0;
update_interval: 2s
id: wind_speed
on_value:
then:
- lambda: |-
id(wind_values)[id(wind_index)] = int16_t(id(wind_speed).state * 100);
id(wind_index) = (id(wind_index) + 1) % 300;
# Rafale max sur 10 min
- platform: template
name: "Rafale Max 3s"
unit_of_measurement: "km/h"
accuracy_decimals: 2
state_class: measurement
lambda: |-
int16_t max_wind = 0;
for (int i = 0; i < id(wind_values).size(); i++) {
if (id(wind_values)[i] > max_wind) max_wind = id(wind_values)[i];
}
return max_wind / 100.0;
update_interval: 10min
id: wind_gust_10min
# Vitesse moyenne sur 10 min
- platform: template
name: "Vitesse Moyenne"
unit_of_measurement: "km/h"
accuracy_decimals: 2
state_class: measurement
lambda: |-
int32_t sum = 0;
for (int i = 0; i < id(wind_values).size(); i++) {
sum += id(wind_values)[i];
}
return (sum / float(id(wind_values).size())) / 100.0;
update_interval: 10min
id: wind_avg_10min
# Script pour envoyer les données périodiquement
script:
- id: send_data
mode: restart
then:
- wifi.enable # Réactive le WiFi avant d'envoyer les données
- delay: 5s # Donne le temps au WiFi de se reconnecter
- if:
condition:
wifi.connected:
then:
- mqtt.publish:
topic: "anemometer/wind_gust_10min"
payload: !lambda |-
return to_string(id(wind_gust_10min).state).c_str();
- mqtt.publish:
topic: "anemometer/wind_avg_10min"
payload: !lambda |-
return to_string(id(wind_avg_10min).state).c_str();
- delay: 2s # Laisser le temps à MQTT d'envoyer les messages
- wifi.disable # Désactive le WiFi pour économiser l'énergie
- delay: 10min # Attente avant la prochaine activation
interval:
- interval: 10min
then:
- script.execute: send_data
esphome:
