ESPHOME et ESP32 DAC

Bonjour.
Je cherche à utiliser le DAC de mon Lolin32 mais je bloque dans le code.
Le but premier me parait pourtant simple :

  • Faire varier la tension de sortie du GPIO25 en fonction d’un switch sur GPIO15
    Par la suite, j’aimerais pouvoir :
  • Faire varier cette tension en fonction de la distance retournée par un capteur à Ultra-Son de type SR04. Par exemple 50cm = 50%, 25cm = 25%, 10cm = 10%…

Voici mon code (Je passe le début qui ne pose aucun problème) :

…/…
output:
- platform: esp32_dac
pin: GPIO25
id: tension_de_sortie

binary_sensor:
  - platform: gpio
    id: switch
    pin: 
      number: GPIO15
      mode: INPUT_PULLUP
      inverted: True
    on_press:
      then:
        - output.set_level:
          id: tension_de_sortie
          level: 50%

sensor:
  - platform: ultrasonic
    trigger_pin: GPIO16
    echo_pin: GPIO17
    name: "Ultrasonic Sensor"
    on_???:
      then:
        - output.set_level:
          id: tension_de_sortie
          level: distance calculée par le capteur

Merci aux bonnes âme qui sauront m’épauler.

Bonsoir ,
, par exemple
avec esphome tu vas pouvoir intégré un automation dans l’esp ou sous ha, ça me semble plus simple
Là c’est un choix

Et il vas donc falloir faire un peut de math si tu veux quelque choses de proportionnelle
Ou une longue automation si tu veux faire des paliers.
Pour t’aider,
Liens pour une variation de vitesse par palier qui est devenu proportionnelle

Stefan

Merci Stefan pour ces pistes de réflexion.
Je regarde ça au plus vite.

Les pistes explorées s’avèrent très fructueuses.
Merci encore.

1 « J'aime »

Oui je pense que tu dois pouvoir faire un automation

Trigger
......
Condition
.......
Action
Appeller service
Switch turn_on
Entité : Switch ( bon vas peu être falloir le rénome🙄)
Data:
Level: {{states.('ultrasonic')| float }}

Mmmm… :thinking:
Voici ce que j’ai codé mais qui me donne une erreur :

sensor:
  - platform: ultrasonic
    trigger_pin: GPIO13
    echo_pin: GPIO15
    name: "Capteur US"
    id: capteur_us
    unit_of_measurement: "cm"
    accuracy_decimals: 2
    update_interval: 1s
    filters:
      - lambda: return x*100;
    on_value:
      then:
        - output.set_level:
            id: tension_de_sortie_gpio25
            level: {{states.('capteur_us')| float }}

Je vais y arriver… :rofl:

et bien sur, il y a cela aussi :

output:

  • platform: esp32_dac
    pin: GPIO25
    id: tension_de_sortie_gpio25

Bonsoir, as tu testé le retour de ton template dans l’outil de développement.
Avec ou sans le float? As tu un résultat?

J’ai fait le choix d’ESPHome…

Oui, mais tu peux faire des tests sur l’outil de développement.
Tu as bien la ligne api dans ton fichier esp. Donc hassio voie t’es capteurs

Bonsoir.

Bon, j’essaye d’intégrer ça en lambda mais ca ne marche pas…
Je ne maitrise pas la syntaxe de l’output.

on_value:
  then:
    - if:
        condition:
          switch.is_on: onoff
        then:
          - lambda: |-
              if ((id(capteur_us).state <= 5.00)) {
                id(tension_de_sortie).output(45%);
              }
              else if ((id(capteur_us).state > 5.00) & (id(capteur_us).state <= 10.00)){
                id(tension_de_sortie).output(55%);
              }
              else if ((id(capteur_us).state > 10.00) & (id(capteur_us).state <= 20.00)){
                id(tension_de_sortie).output(55%);
              }

              etc...

Je pense que si j’arrive à faire fonctionner ‹ output › en lambda, j’aurais ce que je veux.
A savoir une tension variable en fonction de plusieurs conditions.
Ce sera pas vraiment proportionnel mais des paliers me suffiront.

J’ai aussi testé la fonction ‹ on_value_range › qui fonctionne parfaitement pour une seule condition mais comment faire pour avoir plusieurs conditions à la suite ?

Pour ce qui est de tester dans l’outil de développement, pour le moment je ne peux pas car le module n’est pas intégré à Home Assistant et je ne souhaite pas l’intégrer tant que je ne sais pas encore ce que je vais vraiment envoyer dans HA.
Ce module doit fonctionner en autonome, ensuite je le connecterai.

Dans tous les cas, je te remercie bien de prendre du temps pour répondre à mes interrogations.

Ayé !
Je pense avoir trouvé :

on_value:
  then:
    - if:
        condition:
          switch.is_on: onoff
        then:
          - lambda: |-
              if ((id(capteur_us).state <= 5.00)) {
                id(tension_de_sortie).set_level(0.45);
              }
              else if ((id(capteur_us).state > 10.00) & (id(capteur_us).state <= 20.00)) {
                id(tension_de_sortie).set_level(0.55);
              }
              ...

En cours de test…

1 « J'aime »

bonsoir je voie que tu passe par deux paliers
et c’est une solution,
<5, tension 0.45
>10 et <20 tension 0.45
as tu essayé: pour être proportionnel

on_value:
  then:
    - if:
        condition:
          switch.is_on: onoff
        then:
          - lambda: |-
               {id(tension_de_sortie).set_level((id(capteur_us).state )/100);}

          
          ...

J’avoue ne pas connaître le language.
Mais bon tout ce tente

j’ai regarder aussi et les capteurs ultrasonic sont par default a 60 sec.
update_interval ( facultatif , heure ): l’intervalle de vérification du capteur. La valeur par défaut est 60s

est ce pas un frein a ton automations?

Tout est paramétrable :

unit_of_measurement: "cm"
accuracy_decimals: 2
update_interval: 1s

Pour la tension de sortie, ‹ id(tension_de_sortie).set_level(0.xx) ›, le chiffre entre () indique un pourcentage de la tension de sortie du gpio, soit x% de 3,3v

Avec cette solution, je fais autant de palier que je le souhaite et je termine par :

         else {
            id(tension_de_sortie).set_level(x.xx);
          }

Ainsi, je peux fixer la tension max de sortie.

Ta solution fonctionne aussi parfaitement et fait une réelle proportionnalité. :wink:

C’est cool.

1 « J'aime »

Résolu alors?
C’est cool


PS: peux tu donner le code complet de ton esp. Ça pourrait servir d’explample a quelqu’un
Merci

Bonjour.
Je confirme après tous mes tests, que la solution à la question posée dans ce post correspond au code déjà diffusé plus haut.
Ca marche nickel.
L’ensemble des plus de 1000 lignes de mon code ne serait pas opportun dans cette discussion…
Je clos donc ce sujet mais en ouvre un autre sur l’utilisation de l’UART avec ESPHome. :wink:
A de suite…

1 « J'aime »