[DefiDIY25] Anémomètre solaire

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:
8 « J'aime »