Autres articles / Other articles

Programmer un analyseur d'ensoleillement

publication: 4 novembre 2022 / mis à jour 5 novembre 2022

Read this page in english

 

Appel à collaboration

Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.

Partagez-les ici sur ce site.

ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.

Vos montages peuvent aider d'autres développeurs.

Les montages des autres développeurs peuvent vous aider.

Pour proposer un article ou un montage, cliquez ici


Préambule

Dans le cadre d'un projet solaire utilisant plusieurs panneaux solaires et leur micro-onduleur, il apparait quelques soucis de gestion de l'énergie électrique produite. Lien vers le projet solaire:
Montage de mon kit en autoconsommation 600W pas à pas

Le principal souci est d'activer des appareils gros consommateurs seulement si les panneaux solaires produisent par plein soleil. Un appareil en particulier est concerné, le cumulus eau chaude:

Les micro-onduleurs injectent du courant dans le réseau électrique général. Si un appareil gros consommateur d'électricité est actif quand passent des nuages, cet appareil sera alimenté en priorité par le réseau général.

Dans cet article, nous présentons une solution permettant la détection des nuages grâce à un panneau solaire miniature et une carte ESP32.

Code complet disponible ici:

ESP32forth/blob/main/ADC/solarLightAnalyzer.txt

Le panneau solaire miniature

Pour réaliser notre détecteur de nuages, on va utiliser un panneau solaire de très petite taille, ici un panneau de 25mm x 25mm.

Récupération d'un panneau solaire miniature

Ce panneau solaire miniature est récupéré sur une lampe de jardin qui est hors d'usage:

Voici notre mini panneau solaire sorti de cette lampe de jardin:

On sacrifie deux connecteurs dupont pour permettre d'effectuer diverses mesures sur notre plaque de prototype. Ces connecteurs sont soudés sur les deux fils rouge et bleu sortant du mini panneau solaire.

Mesure de la tension du panneau solaire

On commence par relever la tension à vide de notre mini panneau solaire, ici avec un oscilloscope. Cette mesure de tension peut aussi s'effectuer avec un voltmètre:

En pleine lumière, la tension mesurée s'élève à 14,2 Volts!

Sous une lumière diffuse, la tension descend à 5,8 Volts.

En couvrant de la main le mini panneau solaire, la tension chute à quasiment 0 Volt.

Mesure du courant du panneau solaire

Le courant, c'est à dire l'intensité, doit être relevée à l'aide d'un ampèremètre. La fonction ampèremètre d'un contrôleur universel conviendra. La mise en court-circuit du mini panneau solaire en pleine lumière permet de mesurer un courant de 10 mA.

Notre mini panneau solaire a donc une puissance approximative de 0,2 Watt.

Avant de connecter notre mini panneau solaire à la carte ESP32, il faut impérativement procéder à un abaissement de la tension de sortie. Il est hors de question d'injecter cette tension de 14,2 Volts dans une entrée de la carte ESP32. Une telle tension détruirait les circuits internes de la carte ESP32.

Abaissement de la tension du panneau solaire

L'idée est d'abaisser la tension aux bornes de notre mini panneau solaire. Après quelques tests, on choisit deux résistances, une de 220 Ohms, l'autre de 1K Ohms. Montage de ces résistances:

La mesure de tension est relevée entre les deux résistances et la borne positive du panneau solaire.

Le voltmètre indique maintenant une tension maximale de 3,2V en pleine lumière, une tension de 0,35V en lumière diffuse.

Programmation de l'analyseur solaire

La carte ESP32 dispose de 18 canaux 12 bits permettant la conversion analogique numérique (ADC). Pour analyser la tension de notre mini panneau solaire, un seul canal ADC est nécessaire et suffisant.

Seuls 15 canaux ADC sont disponibles:

Nous allons en utiliser un, le canal ADC1_CH6 qui est rattaché au pin G34:

34 constant SOLAR_CELL 
 
: init-solar-cell ( -- ) 
    SOLAR_CELL input pinMode 
  ; 
 
init-solar-cell 

Pour lire la tension au point situé entre les deux résistances, il suffit d'exécuter SOLAR_CELL analogRead. Cette séquence dépose une valeur comprise entre 0 et 4095. La valeur la plus basse correspond à une tension nulle. La valeur la plus élevée correspond à une tension de 3,3 Volts.

Voici la définition solar-cell-read pour récupérer cette tension:

: solar-cell-read ( -- n ) 
    SOLAR_CELL analogRead 
  ; 

Testons cette définition dans une boucle:

: solar-cell-loop ( --) 
    init-solar-cell 
    begin 
        solar-cell-read cr . 
        200 ms 
    key? until 
  ; 

A l'exécution de solar-cell-loop, toutes les 200 millisecondes, la valeur de la conversion de tension ADC est affichée:

...
322
331
290
172
39
0
0
0
0
19
79
86
...

Ici les valeurs ont été obtenues en éclairant le mini panneau solaire avec une lampe de forte puissance. Les valeurs nulles correspondent à l'absence d'éclairage.

Des essais avec le vrai soleil font remonter des mesures dépassant 300.

Gestion activation et désactivation d'un appareil

Pour commencer, nous allons définir deux pins, un pin réservé à la gestion d'un signal d'activation, l'autre à un signal de désactivation:

17 constant DEVICE_ON      \ green LED 
16 constant DEVICE_OFF     \   red LED 
 
: init-device-state ( -- ) 
    DEVICE_ON  output pinMode 
    DEVICE_OFF output pinMode 
  ; 

On aurait pu utiliser un seul pin pour gérer l'appareil distant. Mais certains appareils, comme les relais bistables ont deux bobines:

Pour cette raison, notre programmation va tenir compte de ce type d'appareil.

\ define trigger high state delay 
500 value DEVICE_DELAY 
 
\ set HIGH level of trigger 
: device-activation { trigger -- } 
    trigger HIGH digitalWrite 
    DEVICE_DELAY ?dup 
    if 
        ms 
        trigger LOW  digitalWrite 
    then 
  ; 

Ici, la pseudo-constante DEVICE_DELAY sert à indiquer le délai pendant lequel le signal de commande doit être conservé à l'état haut. Passé ce délai, le signal de commande repasse à l'état bas.

Si la valeur de DEVICE_DELAY est nulle, le signal de commande reste à l'état haut.

C'est le mot trigger-activation qui gère l'activation du pin correspondant:

On définit maintenant deux mots, device-ON et device-OFF, respectivement chargés d'activer et désactiver l'appareil destiné à être commandé par les pins G16 et G17:

\ define device state: 0=LOW, -1=HIGH 
0 value DEVICE_STATE 
 
: enable-device ( -- ) 
    DEVICE_STATE invert 
    if 
        DEVICE_OFF LOW  digitalWrite 
        DEVICE_ON  device-activation 
        -1 to DEVICE_STATE 
    then 
  ; 
 
: disable-device ( -- ) 
    DEVICE_STATE 
    if 
        DEVICE_ON  LOW  digitalWrite 
        DEVICE_OFF device-activation 
         0 to DEVICE_STATE 
    then 
  ; 

L'état de l'appareil est mémorisé dans DEVICE_STATE. Cet état est testé avant une tentative de changement d'état. Si l'appareil est actif, il ne sera pas réactivé de manière répétée. Idem si l'appareil est inactif.

\ define trigger value for sunny or cloudy sky 
300 value SOLAR_TRIGGER 
 
\ if solar light > SOLAR_TRIGGER, activate action 
: action-light-level ( -- ) 
    solar-cell-read SOLAR_TRIGGER >= 
    if 
        enable-device 
    else 
        disable-device 
    then 
  ; 

Déclenchement par interruption timer

La manière la plus élégante consiste à exploiter une interruption par timer. On va utiliser le timer 0:

  0 to DEVICE_DELAY 
200 to SOLAR_TRIGGER 
init-solar-cell 
init-device-state 
 
timers 
: action ( -- ) 
    action-light-level 
    0 rerun 
  ; 
 
' action 1000000 0 interval 

A partir de maintenant, le timer va analyser le flux lumineux chaque seconde et agir en conséquence:

Pour cette vidéo, on agit sur deux paramètres:

Le mot action fonctionne par interruption timer. Il n'est donc pas nécessaire d'avoir une boucle générale pour que le détecteur fonctionne.

Les appareils pouvant être commandés par le capteur d'ensoleillement

En résumé, nous disposons de deux fils de commande, un fil correspondant à la LED verte sur la vidéo, l'autre fil correspondant à la LED rouge. Le programme est conçu pour que les deux fils de commande ne peuvent être actifs en même temps.

Pour avoir un signal continu sur l'un ou l'autre fil de commande, il suffit que la valeur DEVICE_DELAY soit nulle. Voici comment initialiser ce scénario:

\ start with Constant Command Signal 
: start-CCS ( -- ) 
      0 to DEVICE_DELAY 
    200 to SOLAR_TRIGGER 
    init-solar-cell 
    init-device-state 
    disable-device 
    [ timers ] ['] action 1000000 0 interval 
  ;  

Et pour avoir des commandes temporisées, on affectera à DEVICE_DELAY qui indique le délai du niveau de la commande d'activation ou de désactivation de l'appareil.

\ start with Temporized Command Signal 
: start-TCS ( -- ) 
    300 to DEVICE_DELAY 
    200 to SOLAR_TRIGGER 
    init-solar-cell 
    init-device-state 
    disable-device 
    [ timers ] ['] action 1000000 0 interval 
  ;  

Le scénario start-TCS est typique d'une commande de relais bistable à commande par impulsion. Le relais s'active s'il reçoit une commande d'activation. Même si le signal d'activation retombe, le relais bistable reste actif. Pour désactiver le relais bistable, il faut lui transmettre une commande de déasctivation sur la ligne de désactivation.

En conclusion, notre analyseur de lumière solaire peut commander une grande variété d'appareils. Il suffit d'adapter les interfaces de commande de ces appareils aux caractéristiques des ports GPIO de la carte ESP32.


Legal: site web personnel sans commerce / personal site without seling