7-1 tester gleby w ESPHome

Witam. Próbuję uruchomić tester gleby 7 w 1 w ESPHome na esp32 ale za nic nie chce ruszyć.


Na module rs485 TX do RX (GPIO 03), RX do TX (GPIO 01 NA ESP32).
Na module rs485 vcc i gnd do zasilacza 5v.
Sam tester 7-1 to wiadomo A do A, B do B i + z - do zasialcza 5v.

captive_portal:

output:
  - platform: ledc
    pin: GPIO33
    frequency: 25000 Hz
    id: mieszanie
    min_power: 35%
fan:
  - platform: speed
    output: mieszanie
    name: Wentylatory Mieszające

esp32_ble_tracker:

binary_sensor:
  - platform: ble_presence
    mac_address: C4:7C:8D:6C:2C:8F
    name: "Xiaomi Mi Flower Care"

sensor:
  - platform: xiaomi_hhccjcy01
    mac_address: C4:7C:8D:6C:2C:8F
    temperature:
      name: "D Temperatura"
      device_class: "temperature"
    moisture:
      name: "Wilgotność gleby"
      device_class: "moisture"
    illuminance:
      name: "D Naświetlenie"
      device_class: "illuminance"
    conductivity:
      name: "Żyzność"
      device_class: "conductivity"
  - platform: bme280_i2c
    i2c_id: bus_a
    address: 0x76
    temperature:
      name: "BME280 Temperature"
    pressure:
      name: "BME280 Pressure"
    humidity:
      name: "BME280 Humidity"
  - platform: modbus_controller
    modbus_controller_id: con_modbus_1
    id: soil_moisture
    name: "Soil Humidity"
    address: 0
    unit_of_measurement: "RH"
    register_type: holding
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - lambda: |-
          float raw_value = x; // Raw sensor value
          float correction_factor = 2.44; // Correction factor based on observed values
          float adjusted_value = (raw_value * correction_factor) / 10;
          return adjusted_value;  // Return without clamping to observe behavior
  - platform: modbus_controller
    modbus_controller_id: con_modbus_1
    id: soil_temp
    name: "Soil Temperature"
    address: 1
    unit_of_measurement: "°C"
    register_type: holding
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: con_modbus_1
    id: soil_conductivity
    name: "Soil Conductivity"
    address: 2
    unit_of_measurement: "us/cm"
    register_type: holding
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: con_modbus_1
    id: soil_ph
    name: "Soil pH"
    address: 3
    unit_of_measurement: "pH"
    register_type: holding
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
    lambda: |-
      float value = (x * 0.1) + 0.0;  // Apply the offset
      return (value < 0) ? 0 : value; // Ensure value doesn't go below 0

  - platform: modbus_controller
    modbus_controller_id: con_modbus_1
    id: soil_nitrogen
    name: "Soil Nitrogen"
    address: 4 
    unit_of_measurement: "mg/Kg"
    register_type: holding
    value_type: U_WORD
    lambda: |-
      float value = x - 27;  // Apply the offset
      return (value < 0) ? 0 : value; // Ensure value doesn't go below 0

  - platform: modbus_controller
    modbus_controller_id: con_modbus_1
    id: soil_phosphorus
    name: "Soil Phosphorus"
    address: 5 
    unit_of_measurement: "mg/Kg"
    register_type: holding
    value_type: U_WORD
    lambda: |-
      float value = x - 109;  // Apply the offset
      return (value < 0) ? 0 : value; // Ensure value doesn't go below 0

  - platform: modbus_controller
    modbus_controller_id: con_modbus_1
    id: soil_potassium
    name: "Soil Potassium"
    address: 6 
    unit_of_measurement: "mg/Kg"
    register_type: holding
    value_type: U_WORD
    lambda: |-
      float value = x - 102;  // Apply the offset
      return (value < 0) ? 0 : value; // Ensure value doesn't go below 0

i2c:
  sda: GPIO21
  scl: GPIO22
  scan: true
  id: bus_a
    
uart:
  id: uart_1
  tx_pin: GPIO1
  rx_pin: GPIO3
  baud_rate: 9600
  stop_bits: 1

modbus:
  - id: modbus1
    uart_id: uart_1

modbus_controller:
  - id: con_modbus_1
    modbus_id: modbus1
    update_interval: 3600s
    address: 0x01 
    command_throttle: 150ms
    setup_priority: -10

Gdzieś musi być źle. Kod wziąłem z jakiegoś projektu na githubie no ale nie chodzi. Tu więcej informacji odnośnie samego czujnika.
NPK-71-RS485/THCPH-S (RS485 type)_5PIN.pdf at main · microrobotics/NPK-71-RS485 · GitHub

GitHub - myduino/Industrial-Soil-Sensor-RS485: Arduino Sketch for Industrial Soil Temperature, Moisture, EC, pH & NPK Sensor using ESP32

Liczę, ze ktoś pomoże to ogarnąć. na module rs485 RX świeci ciągle TX czasami zamruga. W HA nie pokazuje żadnych wartości.

TX do TX i RX do RX jeśli łączysz z UART jakiś konwerter mediów.
Jeśli zamieniasz miejscami to nie wywoła to uszkodzenia, więc to pierwszy test jeśli nie wiadomo jak podłączyć…

ESP32, więc skorzystaj z innego UARTa niż UART0 (nie używaj tego na pinach 1 i 3)

a w ogóle jaka płytka, bo YAML jest niekompletny i jest w nim taki lekki chaos, że się trudno połapać

w/g drugiego linka fabryczna prędkość połączenia to 4800bodów, a nie 9600, prawdopodobnie reszta to 8N1, bo się autor nie określił w kwestii kontroli parzystości, więc zakładam, że bez.

Kolega Szopen. Chyba czas postawić te herbatkę. :slight_smile: Więc tak. Wcześniej użyłem pinów 16 i 17. Płytka jest identyczna jak ta tutaj DOIT ESP32 DEV KIT v1: high resolution pinout and specs – Renzo Mischianti rezultat ten sam. Żaden. Odwrotnie nie podłączałem bo jak i tu nie działa i tu, błędne oznaczenia się zdarzają wiem ale żeby po całości? Dodatkowo widzę ponout identycznej płytki więc nawet nie sugerując się oznaczeniami ciężko było by źle podłączyć. Moment. Czyli powinno być tx połączone z tx? Czy mam tak podłączyć tylko do sprawdzenia?

Nie chodzi o błędne oznaczenia, tylko o to, że reguły co z czym łączyć zależą od tego CO z CZYM łączysz

  1. jeśli łączysz UART z innym UARTem, to łączysz wtedy nadajnik jednego z odbiornikiem drugiego (Rx z Tx czyli na krzyż) i UARTa nie da się opisać źle
  2. jeśli łączysz UART z jakimś media konwerterem, to tradycyjnie jego przyłącze do nadajnika UART = Tx, jest opisane… Tx (mimo, że nie nadaje tylko odbiera, ale nie jest to de facto żaden odbiornik tylko konwerter) więc tu się łączy 1:1 (ale właśnie to takie tradycyjne oznaczenie i czasem jest opisane w ten sposób, a czasem tak jak logika nakazuje, czyli odwrotnie), zazwyczaj można sprawdzić właściwy schemat w nocie katalogowej

To tak w kwestii łączenia Tx z Rx (lub z Tx), a ponieważ zarówno UART jest odporny na odwrotne połączenie z innym UARTem jak i media konwerterem (i wzajemnie), o ile tylko mają dopasowane poziomy logiki !!! (tj. np. TTL łączysz z TTL, czy lvCMOS z LVCMOS) to nic się nie może stać (ale skoro w ogóle łączysz jakieś komponenty, to MUSZĄ one pracować w zgodnych poziomach logiki, więc zakładam w ciemno, że tak jest).

A dążyłem do tego, że można zamienić piny na krzyż bez ryzyka (dla testu, bo ostatecznie podłączyć powinieneś albo zgodnie z dokumentacją, a jak jej nie ma, to zgodnie z tym połączeniem, które działa)


A teraz wrócę do płytki prototypowej.
UART0 (akurat dla ESP32 jest to zawsze i bezwzględnie - tu też musi być gwiazdka, że chyba nie tak do końca bezwzględnie… para GPIO1 i GPIO3) na jakichś 95% konstrukcji jest fizycznie połączony z mostkiem UART-USB, więc tam już nie należy podpinać NICZEGO INNEGO, i tu jest chyba clou - z obrazka

nie wynika co jest na tej płytce podłączone do GPIO1 i GPIO3, do tego trzeba mieć jej schemat elektryczny, ale te połączenia są dość standardowe, na tyle standardowe, że aż nudne - tam jest podłączony mostek do USB (ten kwadratowy scalak nad przyciskiem BOOT) i on często przeszkadza w jakiejkolwiek innej komunikacji (zależy jaki model tego mostka, a tu to już wolna amerykanka), więc tych pinów się unika jak ognia.

Takie kombinacje to z czasów ESP8266 nam zostały bo tam był wyprowadzony tylko 1 kompletny UART, ale ESP32 ma 3 UARTy, tylko ich umiejscowienie jest opisane w pozornie dziwnym miejscu dokumentacji (swoją drogą to nie jest dokumentacja dotycząca kontrolerów UART tylko ich wykorzystania z loggerem stąd takie miejsce)

w ogóle w zależności od MCU kontrolery UART czasem mogą być krosowane na “wędrujące piny” tj. możesz wysłać port UART na niedomyślne piny i tam też będzie działał (ale jeśli chodzi o UART0 to jest to zazwyczaj albo niemożliwe, albo ma tylko jedną alternatywną lokalizację)

Dlatego użyj UART2 (domyślnie GPIO17 i GPIO16, ale chyba jest też wędrujący - trzeba by pokopać po dokumentacji, a ostatnio siedziałem nad S3, który ma jeszcze inne rozwiązania i szczerze już nie pamiętam jak jest w najzwyklejszym ESP32) lub UART1, który jest domyślnie na niewyprowadzonych GPIO i jest wędrujący (można go wysłać na dowolne uniwersalne GPIO - w wypadku ESP32 na obrazku, który podlinkowałeś są oznaczone falką (tj. mają obsługę PWM i są “wejściowo-wyjściowe”, jak drzwi w pewnym skeczu KMN)

(UWAGA to dotyczy TYLKO ESP32, dla innych modeli MCU jak ESP32-S3, ESP32-C3 itd. NIE bo ich konstrukcje są inne! jest podobnie, ale inaczej)

4800 bodów nic nie zmienia. Zamiana tx z RX nic nie zmienia. Nie działa. Swoją drogą fajnie, że tak tłumaczysz. Parę razy już się zdarzyło, że coś skojarzyłem i problem się rozwiązywał.

Konwerter zasil z 3.3V z płytki ESP - nie z 5V.

Tak z innej beczki ta płytka to raczej taka (tzn. nie jest identyczna, ale rozkład wyprowadzeń raczej bardziej tu pasuje)

niby bardzo się nie różni, ale jednak nie pasuje do poprzedniego rysunku, a zaintrygowało mnie co jest podłączone do GPIO36 i nieuwzględnione w YAMLu (to tak poza tematem)

Radzę na niej nie używać pinów oznaczonych na fioletowo (Flash…).

Do 36 nic nie mam podłączone. Do kolejnego, 4 pinu (39) coś jest. Albo bme 280 albo temt6000. Nie wiem bo użyłem całego przewodu domofonowego, w środku akurat tyle kabelków ile potrzebowałem i jeszcze izolacja fabryczna. :blush: Płytka ma tylko 4MB pamieci aktualnie zapełnione w 92,9% więc już raczej nic nie będe podłączał. A na pewno nie teraz. Czekam aż jeden z domowych trutni się wyprowadzi a to już niedlugo i od razu zajmuje pokój na roślinki więc projekt będzie rozbudowany.

Rozumiem, że zasilanie płyki rs485 pociągnąć z 3,3v esp32?