Esphome przełączanie stron wyswietlacza Lcd2004

Witam wszystkich.
Mam zrobiony czytnik liczników wody Wmbus autorstwa SzczepanLeon w obudowie z zasilaniem ups, aktualnie podaje on mi dane na wyswietlaczu lcd1602 ( przerabiam na lcd2004 , aktualizuje wersje Wmbus do 4) i przez interval: zmienia strony co ustalony czas co przy kilku zdefiniowanych stronach trwa to dlugo ( wiem mozna zmienic czas wyswietlania ale niechce aby znowy zmienialy sie za szybko bo trzeba pokazać stan licznika spisać). Czy jest możliwość przerobienia funkcji aby zmiana nastepowala po zwarciu np. GPIO15 do 3.3v . ( Jedno zwarcie przełacznikiem chwilowym nowa strona) Męcze się z tym już jakiś czas i nic z tego nie wynika - zmieniłem wg. tego poradnika ale wyszło że pages: nie obsługuje lcd_pcf8574. https://www.youtube.com/watch?v=vwn-FuW4tfc&t=34s

i2c:
  sda: 21
  scl: 22
  scan: True
  frequency: 400kHz

web_server:
  port: 80
  auth:
    username: !secret web_server_username
    password: !secret web_server_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  use_address: 192.168.0.144
  
  manual_ip:
    # Set this to the IP of the ESP
    static_ip: 192.168.0.144
    # Set this to the IP address of the router. Often ends with .1
    gateway: 192.168.0.1
    # The subnet of the network. 255.255.255.0 works for most home networks.
    subnet: 255.255.255.0
    # Set this to the IP address of the router. Often ends with .1
    
  
  ap:
    ssid: !secret wifi_ap_ssid
    password: !secret wifi_ap_password

captive_portal:
    
external_components:
#  - source: github://SzczepanLeon/esphome-components@main
#  - source: github://SzczepanLeon/esphome-components@3.2.3
#    components: [ wmbus ]
  - source: github://SzczepanLeon/esphome-components@2.4.10

    refresh: 3d
    components: [ wmbus ]


wmbus:
  frequency: 868.950
  mosi_pin: GPIO23
  miso_pin: GPIO19
  clk_pin:  GPIO18
  cs_pin:   GPIO5
  gdo0_pin: GPIO16
  gdo2_pin: GPIO17

  clients:
    - name: "wmbusmeters"
      ip_address: "192.168.0.129"
      port: 7227

# Pobieranie czasu z HA
#time:
#  - platform: homeassistant
#    id: ha_time
time:
  - platform: sntp
    id: time_sntp
    timezone: Europe/Berlin


# Dioda LED Informacyjna o stanie połącznia.
status_led:
  pin: 
    number: GPIO2 # PIN D4
    inverted: yes # "yes" - Dioda mryga gdy nie można nawiązać połączenie.
                  # "no"  - Dioda świeci gdy połączenie jest nawiązane.

# Przyscisk Restartu Urządzenia  
switch:
  - platform: restart
    name: "${device_name} Reset"

sensor:
  - platform: wmbus
    meter_id: 0x04888630
    type: apator162
    lqi:
      name: "My lqi"
    rssi:
      name: "My RSSI"
    total_water_m3:
      name: "Woda1"
      id: woda1

  - platform: wmbus
    meter_id: 0x04729449
    key: "00000000000000000000000000000000"
    type: apator162
    lqi:
      name: "My lqi"
    rssi:
      name: "My RSSI"
    total_water_m3:
      name: "Woda2"
      id: woda2

 

display:
  - platform: lcd_pcf8574
    dimensions: 16x2
    address: 0x27
    id: lcd
    lambda: |-
          switch (id(page)){
            case 1:
              it.printf(0, 0, "Woda1 :%.1f m3", id(woda1).state);
              it.printf(0, 1, "Woda2 :%.1f m3", id(woda2).state);
              break;
            case 2:
              it.printf(0, 0, "Woda3 :%.1f m3", id(woda1).state);
              it.printf(0, 1, "Woda4 :%.1f m3", id(woda2).state);
              break;
            case 3:
              it.strftime(5, 0, "%H:%M ", id(time_sntp).now());
              it.strftime(3, 1, "%d.%m.%Y", id(time_sntp).now());
              break;
          }

globals:
- id: page
  type: int
  initial_value: "1"

interval:
- interval: 10s
  then:
    - lambda: |-
        id(page) = (id(page) + 1);
        if (id(page) > 3) {
          id(page) = 1;
        }

#binary_sensor:
#  - platform: gpio
#    pin: D2
#    id: "button"
#    on_press:
#      then:
#        - display.page.show_next: lcd
#        - component.update: lcd 

Na samym dole pliku odznaczone binary sensor co próbowałem użyc ale nie działa z tym wyswietlaczem.

Sformatuj swój kod bo w tej formie jest nieczytelny.
https://forum.arturhome.pl/t/jak-prawidlowo-zamieszczac-yaml-inny-kod-lub-logi-w-postach-na-forum/11455

Ten wyświetlacz nie obsługuje pages. Strony zmieniasz przez zmianę zmiennej globalnej. Zamiast w intervale przenieś akcję do binary sensor.

binary_sensor:
  - platform: gpio
    pin: D2
    id: "button"
    on_press:
      then:
        - lambda: |-
            id(page) = (id(page) + 1);
            if (id(page) > 3) {
            id(page) = 1;
            }

I usuń albo zakomentuj sekcję interval.

1 polubienie

Działa
Musiałem dodać rezystor pomiedzy pin: (przełącznik) u mnie GPIO15 a mase 10k Ohm bo inaczej samoistnie zmienial stan i przełączał on-off kilka razy na sekunde. Aktualnie zmienia jak zewre GPIO do 3,3v - czasami jak zadługo przytrzymam to przełaczy kilka stron ale to bajka. Najważniejsze że działa.
Stawiam DUZE PIWO…Dziekuje Bardzo.

Pod spodem cała działająca konfiguracja dla zainteresowanych - przełączania stron na wyswietlaczu 1602 /2004 , - pamietac dodac rezystor 10k ohm.
Oraz fajny test połączen wifi i homeassiatnt sygnalizowany diodą na ESP32 odrazu wiadomo czy cos jest nie tak z połączeniami lub jak ESP wpadnie w pętle restartów.

substitutions:
  name: esphome-web-de7470
  friendly_name: ESPHome Web de7470

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  min_version: 2024.6.0
  name_add_mac_suffix: false
  project:
    name: esphome.web
    version: dev

esp32:
  board: esp32dev
  framework:
    type: arduino
    
packages:
  esphome.bluetooth-proxy: github://esphome/bluetooth-proxies/esp32-generic.yaml@main

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# Allow Over-The-Air updates
ota:
  - platform: esphome
    password: !secret ota_password

# Allow provisioning Wi-Fi via serial
improv_serial:

wifi:
  networks:
  - ssid: !secret wifi_ssid
    password: !secret wifi_password
    priority: 0.0
  - ssid: !secret wifi_ssid2
    password: !secret wifi_password2
    priority: 5.0
  - ssid: !secret wifi_ssid3
    password: !secret wifi_password3
    priority: 4.0
  use_address: 192.168.0.147
  
  manual_ip:
    # Set this to the IP of the ESP
    static_ip: 192.168.0.147
    # Set this to the IP address of the router. Often ends with .1
    gateway: 192.168.0.1
    # The subnet of the network. 255.255.255.0 works for most home networks.
    subnet: 255.255.255.0
    # Set this to the IP address of the router. Often ends with .1
    dns1: 192.168.0.1
    dns2: 8.8.8.8
  
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: !secret wifi_ap_ssid
    password: !secret wifi_ap_password

web_server:
  port: 80
  version: 2
  auth:
    username: !secret web_server_username
    password: !secret web_server_password
# Pobieranie czasu z HA
#time:
#  - platform: homeassistant
#    id: ha_time
time:
  - platform: sntp
    id: time_sntp
    timezone: Europe/Berlin


# Dioda LED Informacyjna o stanie połącznia.
#status_led:
#  pin: 
#    number: GPIO2 # PIN D4
#    inverted: yes # "yes" - Dioda mryga gdy nie można nawiązać połączenie.
#                  # "no"  - Dioda świeci gdy połączenie jest nawiązane.

# In combination with the `ap` this allows the user
# to provision wifi credentials to the device via WiFi AP.
captive_portal:

dashboard_import:
  package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main
  import_full_config: true

# Sets up Bluetooth LE (Only on ESP32) to allow the user
# to provision wifi credentials to the device.
esp32_improv:
  authorizer: none

# To have a "next url" for improv serial
binary_sensor:
# Tekst sensor do zmiany stron wyswietlacza dziala tylko z oled nie z 1602 i 2004
  - platform: gpio
    pin: GPIO15
    id: "przelacznik"
    on_press:
      then:
        - lambda: |-
            id(page) = (id(page) + 1);
            if (id(page) > 4) {
            id(page) = 1;
            }
#      then:
#        - display.page.show_next: lcd
#        - component.update: lcd
button:
  - platform: restart
    name: "Restart ESP"
    icon: mdi:restart

switch:
  - platform: gpio
    id: led_wifi
    pin: GPIO2
    inverted: False

i2c:
  sda: 21
  scl: 22
  scan: True
  frequency: 400kHz

display:
  - platform: lcd_pcf8574
    dimensions: 20x4
    address: 0x27
    id: lcd
    lambda: |-
          switch (id(page)){
            case 1:
              it.print(0, 0, "Licznik1");
              it.strftime(10, 0, "%d.%m.%Y", id(time_sntp).now());
              it.print(0, 2, "Woda Zimna  :%.1f m3");
              it.print(0, 3, "Woda Ciepla :%.1f m3");
              break;
            case 2:
              it.print(0, 0, "Licznik2");
              it.strftime(10, 0, "%d.%m.%Y", id(time_sntp).now());
              it.print(0, 2, "Woda Zimna  :%.1f m3");
              it.print(0, 3, "Woda Ciepla :%.1f m3");
              break;
            case 3:
              it.print(0, 0, "Licznik3");
              it.strftime(10, 0, "%d.%m.%Y", id(time_sntp).now());
              it.print(0, 2, "Woda Zimna  :%.1f m3");
              it.print(0, 3, "Woda Ciepla :%.1f m3");
              break;
            case 4:
              it.print(0, 0, "Termin Odczytu");
              it.strftime(0, 1, "Czas     "  "%H:%M ", id(time_sntp).now());
              it.strftime(0, 2, "Data   "  "%d.%m.%Y", id(time_sntp).now());
              it.printf(0, 3, "Ip :%s", id(esp_ip_address).state.c_str());
              break;
          }

globals:
- id: page
  type: int
  initial_value: "1"

interval:
  - interval: 5s                                        # wykonaj co 1 sekundę
    then:
      if:                                               # jeżeli
        condition:
          wifi.connected:                               # połączenie z Wi-Fi
        then:                                           
          - if:
              condition:
                api.connected:                          
              then:                                     # jeżeli połączono z Wi-Fi
                - switch.turn_on: led_wifi              # to włącz LED Wi-Fi
              else:                                     # jeśli nie ma połączenia z HA to mrugaj LED Wi-Fi
                - switch.turn_on: led_wifi              # włącz LED Wi-Fi
                - delay: 500ms                          # odczekaj
                - switch.turn_off: led_wifi             # wyłącz LED Wi-Fi
                - delay: 500ms                          # odczekaj
        else:                                           # jeżeli nie połączono z Wi-Fi (automatycznie z HA również nie)
          - switch.turn_off: led_wifi
#  - interval: 5s
#    then:
#      - lambda: |-
#          id(page) = (id(page) + 1);
#          if (id(page) > 4) {
#            id(page) = 1;
#          }

text_sensor:
  - platform: wifi_info
    ip_address:
      id: esp_ip_address
      icon: mdi:ip-network
      name: ESP IP Address
      address_0:
        name: ESP IP Address 0
    ssid:
      name: ESP Connected SSID
    bssid:
      name: ESP Connected BSSID
    mac_address:
      name: ESP Mac Wifi Address
    scan_results:
      name: ESP Latest Scan Results
    dns_address:
      name: ESP DNS Address

Pozdrawiam

W ogóle to sugeruję zwieranie do masy, a nie do zasilania (wtedy GPIO musi mieć włączony pullup lub fizyczny zewnętrzny rezystor). Oczywiście w specyfikacji MCU trzeba sprawdzić co może dany pin.

Zakomentuj lub wywal to

dashboard_import:
  package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main
  import_full_config: true

Dzięki za informacje dashboard_import wywalony, Sprawdze z rezystorem pomiedzy GPIO i 3,3v , i przyciskiem pomiedzy masą i GPIO. ( aktualnie rezystor pomiedzy GPIO - masa, przycisk GPIO - 3,3v)

Mieszkasz w Niemczech? - jeśli nie to berlińska strefa czasowa jest nie na miejscu (mamy unię i zmiany czasu pewnie będą wprowadzane w miarę synchronicznie, ale kto powiedział, że Polska będzie nadal w identycznej strefie co Niemcy?).

Jeśli kable są bardzo krótkie można wykorzystać opcję wbudowanego pullupu.

Tu to zagadnienie jest fajnie opisane