Mesure voltage

Mon problème

Je bute sur la programmation d’un ESP32 Wroom avec OLED implanté, je veux faire des mesures de tension, le datasheep du module comprends plusieurs Pin s avec ADC incorporé et il n’y en a que deux acceptés par ESPHOME. Pouvez vous m’aider et m’expliquer ce qui bloque, il y a plusieurs options dans le choix du type d’ESP32 à la création du device, y a til une difference dans la compilation ?

Ma configuration


version core-2023.3.6
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.10.10
os_name Linux
os_version 5.15.84-v8
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 1006
Installed Version 1.31.0
Stage running
Available Repositories 1248
Downloaded Repositories 5
Disabled rate_limit
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 9.5
update_channel stable
supervisor_version supervisor-2023.03.2
agent_version 1.4.1
docker_version 20.10.22
disk_total 112.9 GB
disk_used 10.3 GB
healthy true
supported true
board rpi4-64
supervisor_api ok
version_api ok
installed_addons Duck DNS (1.15.0), File editor (5.5.0), Samba share (10.0.0), motionEye (0.18.0), Terminal & SSH (9.6.1), ESPHome (2023.3.2)
Dashboards
dashboards 1
resources 2
views 9
mode storage
Recorder
oldest_recorder_run 21 mars 2023 à 10:12
current_recorder_run 23 mars 2023 à 22:53
estimated_db_size 75.66 MiB
database_engine sqlite
database_version 3.38.5
Sonoff
version 3.4.0 (5406fa7)
cloud_online 1 / 6
local_online 0 / 0
captive_portal:

dallas:
  - pin: GPIO1

sensor:

  - platform: adc
    pin: GPIO36
    name: “Voltage 1"
    id: voltage_1
    update_interval: 15s
    accuracy_decimals: 4
    attenuation: auto    
    filters:
      - multiply: 1.485

  - platform: wifi_signal
    name: "Wi-Fi Signal Strength"
    update_interval: 60s


  - platform: adc
    pin: GPIO39
    name: “Voltage 2"
    id: voltage_2
    update_interval: 15s
    accuracy_decimals: 4
    attenuation: auto    
    filters:
      - multiply: 1.485

#######

  - platform: dallas
    address: 0xc503089794005428
    resolution: 12
    name: "Temp1"
    id: temp1
  - platform: dallas
    address: 0xac0319977924a428
    resolution: 12
    name: "Temp2"
    id: temp2
  - platform: dallas
    address: 0xc2011929d3fbf528
    resolution: 12
    name: "Temp3"
    id: temp3
  - platform: dallas
    address: 0x460821c011ae8028
    resolution: 12
    name: "Temp4"
    id: temp4
    
font:
  - file: "/config/tts/Comic Sans MS.ttf"   # Comic Sans MS Roboto-Light
    id: font1
    size: 12  #14
    
i2c:
  sda: GPIO5
  scl: GPIO4
      

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    lambda: |-
      it.printf(0, 0, id(font1), "T1: ");  //affichage de la Temp
      it.printf(0, 15, id(font1), "T2: "); //affichage de la Temp
      it.printf(0, 30, id(font1), "T3: "); //affichage de la Temp
      it.printf(0, 45, id(font1), "T4:"); //affichage de la Temp
      it.printf(20, 0, id(font1), "%.1f°C", id(temp1).state); //affichage de la Température
      it.printf(20, 15, id(font1), "%.1f°C", id(temp2).state); //affichage de la Température
      it.printf(20, 30, id(font1), "%.1f°C", id(temp3).state); //affichage de la Température
      it.printf(20, 45, id(font1), "%.lf°C", id(temp4).state); //affichage de la Température
      it.printf(70, 0, id(font1), "V1: ");  //affichage Voltage 1
      it.printf(70, 15, id(font1), "V2: "); //affichage voltage 2
      it.printf(70, 30, id(font1), "V1: ");  //affichage Voltage 3
      it.printf(70, 45, id(font1), "V2: "); //affichage voltage 4
      it.printf(90, 0, id(font1), "%.2f", id(voltage_1).state); //affichage  voltage 1
      it.printf(90, 15, id(font1), "%.2f", id(voltage_2).state); //affichage  voltage 2
      it.printf(120, 0, id(font1), "v");  
      it.printf(120, 15, id(font1), "v");
      it.printf(120, 30, id(font1), "v");  
      it.printf(120, 45, id(font1), "v");

Les deux seuls GPIO qui fonctionnent sont le 36 et le 39, Pourquoi ??

Merci pour votre aide

captive_portal:

dallas:
  - pin: GPIO1

sensor:

  - platform: adc
    pin: GPIO36
    name: “Voltage 1"
    id: voltage_1
    update_interval: 15s
    accuracy_decimals: 4
    attenuation: auto    
    filters:
      - multiply: 1.485

  - platform: wifi_signal
    name: "Wi-Fi Signal Strength"
    update_interval: 60s


  - platform: adc
    pin: GPIO39
    name: “Voltage 2"
    id: voltage_2
    update_interval: 15s
    accuracy_decimals: 4
    attenuation: auto    
    filters:
      - multiply: 1.485

#######

  - platform: dallas
    address: 0xc503089794005428
    resolution: 12
    name: "Temp1"
    id: temp1
  - platform: dallas
    address: 0xac0319977924a428
    resolution: 12
    name: "Temp2"
    id: temp2
  - platform: dallas
    address: 0xc2011929d3fbf528
    resolution: 12
    name: "Temp3"
    id: temp3
  - platform: dallas
    address: 0x460821c011ae8028
    resolution: 12
    name: "Temp4"
    id: temp4
    
font:
  - file: "/config/tts/Comic Sans MS.ttf"   # Comic Sans MS Roboto-Light
    id: font1
    size: 12  #14
    
i2c:
  sda: GPIO5
  scl: GPIO4
      

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    lambda: |-
      it.printf(0, 0, id(font1), "T1: ");  //affichage de la Temp
      it.printf(0, 15, id(font1), "T2: "); //affichage de la Temp
      it.printf(0, 30, id(font1), "T3: "); //affichage de la Temp
      it.printf(0, 45, id(font1), "T4:"); //affichage de la Temp
      it.printf(20, 0, id(font1), "%.1f°C", id(temp1).state); //affichage de la Température
      it.printf(20, 15, id(font1), "%.1f°C", id(temp2).state); //affichage de la Température
      it.printf(20, 30, id(font1), "%.1f°C", id(temp3).state); //affichage de la Température
      it.printf(20, 45, id(font1), "%.lf°C", id(temp4).state); //affichage de la Température
      it.printf(70, 0, id(font1), "V1: ");  //affichage Voltage 1
      it.printf(70, 15, id(font1), "V2: "); //affichage voltage 2
      it.printf(70, 30, id(font1), "V1: ");  //affichage Voltage 3
      it.printf(70, 45, id(font1), "V2: "); //affichage voltage 4
      it.printf(90, 0, id(font1), "%.2f", id(voltage_1).state); //affichage  voltage 1
      it.printf(90, 15, id(font1), "%.2f", id(voltage_2).state); //affichage  voltage 2
      it.printf(120, 0, id(font1), "v");  
      it.printf(120, 15, id(font1), "v");
      it.printf(120, 30, id(font1), "v");  
      it.printf(120, 45, id(font1), "v");

Salut
il y a plusieurs options dans le choix du type d’ESP32 à la création du device, y a til une difference dans la compilation ?

je dirais oui car je crois savoir qu’il y a des prédefinition des affectations des broches de l’ESP en fonction du modele de la carte

c’est surtout flagrant pour les cartes avec une camera
mais il est indispensable a ma connaissance de definir au minimum un type generique d’ESP32 pour lancer la compilation

Merci pour votre réponse, je pense que ce soit la bonne piste.
Je n’ai pas d’indication pour les types référencés par Esphome, il y a : WeMos au dos et Expressif

ESP32-WROOM-32

2AC7Z
gravé sur lr processeur

Y at il un moyen de compiler en changeant: "- platform: adc " par une fonction de mesure analogique ? pour contourner ce blocage ?

En introduction de ton code

esphome:
  name: esp-test
  platform: ESP32
  board: esp-wrover-kit

# Enable Home Assistant API
api:
# Enable OTA
ota:

# Enable WEB SERVER
web_server:
  port: 80

# WIFI CONFIGURATION

wifi:
  ssid: "ssid"  # a remplacer par le SSID de ton WIFI
  password: "password" # a remplacer par le password de ton WIFI

attention de memoire pour les ESP32 wroom
les port i²c sont affectés de telle sorte

# definition i²c
i2c:
  sda: 21
  scl: 22
  scan: true
  id: bus_a`

Ensuite idealement

donne ton code complet
et surtout les logs lors de la compilation

Mille excuse Ce n’est pas le bon code
Voici le bon:


esphome:
  name: esphome-web-0bc6b0
  friendly_name: ESP-OLED

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "skdnvzvX7LQqWpYh5ptgDk9CJZA2rFoiYuEkzgMxZEw="

ota:


wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esphome-Web-0Bc6B0"
    password: "am0ildMO48Tj"

captive_portal:

dallas:
  - pin: GPIO1

sensor:

  - platform: adc
    pin: GPIO36
    name: “Voltage 1"
    id: voltage_1
    update_interval: 15s
    accuracy_decimals: 4
    attenuation: auto    
    filters:
      - multiply: 1.485

  - platform: wifi_signal
    name: "Wi-Fi Signal Strength"
    update_interval: 60s


  - platform: adc
    pin: GPIO39
    name: “Voltage 2"
    id: voltage_2
    update_interval: 15s
    accuracy_decimals: 4
    attenuation: auto    
    filters:
      - multiply: 1.485

#######

  - platform: dallas
    address: 0xc503089794005428
    resolution: 12
    name: "Temp1"
    id: temp1
  - platform: dallas
    address: 0xac0319977924a428
    resolution: 12
    name: "Temp2"
    id: temp2
  - platform: dallas
    address: 0xc2011929d3fbf528
    resolution: 12
    name: "Temp3"
    id: temp3
  - platform: dallas
    address: 0x460821c011ae8028
    resolution: 12
    name: "Temp4"
    id: temp4
    
font:
  - file: "/config/tts/Comic Sans MS.ttf"   # Comic Sans MS Roboto-Light
    id: font1
    size: 12  #14
    
i2c:
  sda: GPIO5
  scl: GPIO4
      

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    lambda: |-
      it.printf(0, 0, id(font1), "T1: ");  //affichage de la Temp
      it.printf(0, 15, id(font1), "T2: "); //affichage de la Temp
      it.printf(0, 30, id(font1), "T3: "); //affichage de la Temp
      it.printf(0, 45, id(font1), "T4:"); //affichage de la Temp
      it.printf(20, 0, id(font1), "%.1f°C", id(temp1).state); //affichage de la Température
      it.printf(20, 15, id(font1), "%.1f°C", id(temp2).state); //affichage de la Température
      it.printf(20, 30, id(font1), "%.1f°C", id(temp3).state); //affichage de la Température
      it.printf(20, 45, id(font1), "%.lf°C", id(temp4).state); //affichage de la Température
      it.printf(70, 0, id(font1), "V1: ");  //affichage Voltage 1
      it.printf(70, 15, id(font1), "V2: "); //affichage voltage 2
      it.printf(70, 30, id(font1), "V1: ");  //affichage Voltage 3
      it.printf(70, 45, id(font1), "V2: "); //affichage voltage 4
      it.printf(90, 0, id(font1), "%.2f", id(voltage_1).state); //affichage  voltage 1
      it.printf(90, 15, id(font1), "%.2f", id(voltage_2).state); //affichage  voltage 2
      it.printf(120, 0, id(font1), "v");  
      it.printf(120, 15, id(font1), "v");
      it.printf(120, 30, id(font1), "v");  
      it.printf(120, 45, id(font1), "v");



Si je remplace GPIO39 par GPIO25 ça ne prend pa la complilation, et j’ai ce message

INFO Reading configuration /config/esphome/esphome-web-0bc6b0.yaml…
WARNING GPIO4 is a Strapping PIN and should be avoided.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See Frequently Asked Questions — ESPHome
WARNING GPIO4 is a Strapping PIN and should be avoided.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See Frequently Asked Questions — ESPHome
Failed config

sensor.adc: [source /config/esphome/esphome-web-0bc6b0.yaml:40]
platform: adc

ESP32 doesn’t support ADC on this pin.
pin: GPIO25
name: “Voltage 1"
id: voltage_1
update_interval: 15s
accuracy_decimals: 4
attenuation: auto
filters:
- multiply: 1.485

/

Excuses moi j’avais saisi que ton ecran etait integré

ton truc ressemble a cela ??

essaye avec ça comme

esp32:
  board: lolin32

OUI
A quelques choses prés

Non même message avec lolin32

bon je regarde partout mais j’ai bien peur que cette carte ne soit que partiellement supportée.

et en essayant avec les gpio 0 ,2,14,12,13,15 ?

J’ai essayé tous les GPIOs Même punition
Y a t il un moyen de contourner ce blocage ?

Avec des ACS712 externe par exemple ?

a/ ouvrir une issue sur le github de ESPHOME en donnant le modèle exact de ta carte

b/ heu, pour pour les ACS712, si j’ai bien compris c’est un convertisseur courant tension.
donc cela ne te donnera pas de valeur numerique

pour utiliser un ADC les ADS1115 sont des ADC I²C

tout dépend ensuite ce que tu cherches a digitaliser
si c’est pour mesurer une tension secteur
i faut conditionner ton signal
soit un transfo 220V->6V
soit un ZMPT101B

ou un courant, tu aura besoin effectivement de ton ACS712 ou alors de CTLAMP SCT013-xx
avec les interfaces qui vont bien

tu peux aussi regarder cela

mais cela ne fonctionne qu’avec les ADC internes

essaye avec

esp32:
board: briki_abc_esp32

ou
esp32:
board: briki_mbc-wb_esp32

ou pour finir
esp32:
board: d-duino-32

Je vais voir tout ça, et je reviens vers vous,
Le projet c’est suivre la tension aux éléments d’une batterie lithium de 4,2V par élément en passant par un pont diviseur pour être inférieur à 3,3v

bon j’ai trouvé cela

mais j’ai bien peur que tu veuilles utiliser ton ESP32

Oui Tout ceci ferait le travail mais je voudrai une connection Wifi ou zigbee pour surveiller avec homeassistant