HA- Mesure UV

Intro

Dans cet article, je vous propose la réalisation d’un système de mesure d’Ultra Violet à base d’ESP. Il s’agit d’une réalisation personnelle, elle peut être largement optimisée surtout dans sa réalisation: Alimentation 5V extérieure, cablage en fil volant, etc..

Initialement développé pour compléter les données transmises par ma station météorologique Davis Instrument Vantage Pro2, j’ai exploité quelques temps les relevés UV transmis par l’ESP avant de mettre en oeuvre un capteur UV directement raccordé à la VP2, voir mon article sur le sujet.

En quoi cela est utile de mesurer les UV, et bien c’est avant tout pour être alerté des effets néfastes de ces rayons sur la peau.

Un article Wikipédia décrit très bien ce sujet, mais Google est votre ami.

Partie Matérielle

Liste de course:

La liste de course est plutot réduite:

  • Un Esp D1 mini,
  • Un capteur UV ML8511, acheté chez Gotronic plus fiable et performant que les clones chinois.
  • Une alimentation 220VCA-5VCC courant continu. Peut être remplacée par une alimentation exterieur,
  • Une led et sa résistance (Facultatifs)
  • Divers composants et accessoires

Caractéristiques techniques du ML8511

Extrait issu de la documentation disponible sur Gotronic.

Schéma Electronique:

Schéma développé sous Eagle.

Le capteur UV délivre 2.8 VCC max donc compatible avec l’entrée analogique de l’ESP limitée à 3.3V.

On y retrouve, outre la liste de course, un connecteur pour un reset extérieur mais en fin compte je ne l’utilise jamais donc pas vraiment utile.

Circuit Imprimé:

Le CI est facultatif, vous pouvez vous en passer, personnellement, je préfère un CI, c’est plus fiable dans le temps (avis perso).

Routage du circuit réalisé avec Eagle, là encore il peut être largement optimisé en dimension.

Mise en oeuvre

J’ai intégré l’ensemble dans une boite étanche. Il est important de laisser la cellule de mesure du capteur à l’air libre, si on la mets derrière un couvercle transparent, les mesures peuvent être faussées. Pour éviter les oxydations de contact, j’ai soudé les fils du capteur directement sur le CI et pulvérisé du vernis pour circuit imprimé (attention de ne pas en mettre sur la cellule de mesure). A l’extérieur, le matériel est soumis à rude épreuve, le miens est resté 6 mois dehors.

Pour info, j’avais au début raccordé également un capteur BME280 (bus I2c) qui devait mesurer l’humidité et la température, il n’a pas résisté longtemps aux fortes chaleurs, plus de 70° dans le boitier. L’ESP et l’alimentation ont tenus le choc.

Partie Logicielle

Diagramme du ML8511:

Ci dessous vous trouverez la courbe du ML8511. C’est une droite avec un décalage en Y, rien de bien sorcier d’autant plus que EspHome gère parfaitement cette mise à l’échelle.

Programme de l’ESP:

Le capteur est connecté à l’entrée analogique de l’ESP. Après la mise à l’échelle, je moyenne sur 5 mn pour lisser la mesure.

Le programme à jour est disponible ici:

substitutions:
  device_name: esp134-mesure-uv
  adress_ip: "192.168.0.134"
  friendly_name: esp124
  time_timezone: "Europe/Paris"
  
esphome:
  name: ${device_name}
  platform: ESP8266
  board: d1_mini

wifi:
  ssid: !secret wifi
  password: !secret mdpwifi

  manual_ip:
    static_ip: ${adress_ip}
    gateway: 192.168.0.1
    subnet: 255.255.255.0
  reboot_timeout: 5min
  fast_connect: true

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:

web_server:
  port: 80

sensor:
#ML8511 Mesure UV en mW/Cm²
  - platform: adc
    pin: A0
    name: "${friendly_name}_uv"
    unit_of_measurement: "UV"
    update_interval: 60s
    accuracy_decimals: 1
    filters:
      - calibrate_linear:
        - 0.31 -> 0.0
        - 0.88 -> 15.0
# moyenne sur 5 mn
      - sliding_window_moving_average:
          window_size: 5
          send_every: 5  

# Puissance du signal WIFI
  - platform: wifi_signal
    id: wif
    name: "${friendly_name} WiFi Signal Sensor"
    update_interval: 60s
    
# Temps de fonctionnement de l'ESP    
  - platform: uptime
    id: uptime_seconds
    name: "${friendly_name} Uptime"
    update_interval: 60s
    unit_of_measurement: s
    accuracy_decimals: 0
    force_update: false
    icon: mdi:timer


#Etat de la connection
binary_sensor:
  - platform: status
    name: "${friendly_name} Status"
    
# Restart de l'ESP
switch:   
  - platform: restart
    name: "${friendly_name} Restart"
    
text_sensor:
# Affichage du temps de fonctionnement
  - platform: template
    name: "${friendly_name} Uptime"
    update_interval: 60s
    icon: mdi:clock-start
    lambda: |-
      int seconds = (id(uptime_seconds).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600);
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      if ( days ) {
        return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else if ( hours ) {
        return { (String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else if ( minutes ) {
        return { (String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else {
        return { (String(seconds) +"s").c_str() };
      }

Étalonnage? Et bien n’ayant pas de générateur d’UV pour l’etalonner, j’ai fait confiance aux données constructeur. j’ai quand même pu régler le Zéro, et pour les valeurs en haut d’échelle, j’ai vérifié par rapport aux relevés disponibles sur les Web, cela restait cohérent.

Une copie d’écran du serveur Web embarqué dans l’ESP.

Conclusion

Un capteur UV pour pas cher, il fait le taf et donne un ordre d’idée des rayonnements UV.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *