Czujniki zmierzchu - problem z integracją ESP32

Witam,

Witam,
Mam problem z ciągle rozłączającym się czujnikiem zmierzchu, który sam wykonałem na płytce stykowej i podłączyłem go do ESP32. Podczas załadowania programu w Home Assistancie na nowo czujnik uruchamia się na chwilę, ale zaraz po tym znów się wyłącza.
Natomiast w logach czujnika ciągle zapętlają mi się te same wartości odcztane z czujnika, pomimo zmiany warunków świetlnych.
Zapomniałem dodać, że system postawiony jest na Raspberry Pi 4
Kod czujnika

esphome:
  name: esp
  friendly_name: Esp

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
 encryption:
  
  key: "xxxxx"

ota:
  - platform: esphome
    password: "xxxxx"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp Fallback Hotspot"
    password: "xxxxx"

captive_portal:
 
  
sensor:
  - platform: resistance
    sensor: source_sensor
    configuration: DOWNSTREAM
    resistor: 100kOhm
    name: Resistance sensor
    
    unit_of_measurement: "lx"
    device_class: "illuminance"
    state_class: "measurement"
    accuracy_decimals: 1
    
    filters:
      - calibrate_linear:
         method: exact
         datapoints:
          - 2325.6 -> 462.5
          - 10000.0 -> 100.0
          - 50000.0 -> 10.0

  - platform: adc
    id: source_sensor
    pin: GPIO36
    update_interval: 20s

Logi z czujnika

[20:44:15][W][component:170]: Component api cleared Warning flag
[20:44:15][D][api.connection:1389]: Home Assistant 2024.6.1 (192.168.100.108): Connected successfully
[20:44:15][D][sensor:094]: 'source_sensor': Sending state 0.07500 V with 2 decimals of accuracy
[20:44:15][D][resistance:039]: 'Resistance sensor' - Resistance 2325.6Ω
[20:44:15][D][sensor:094]: 'Resistance sensor': Sending state 462.50085 lx with 1 decimals of accuracy
[20:44:35][D][sensor:094]: 'source_sensor': Sending state 0.07500 V with 2 decimals of accuracy
[20:44:35][D][resistance:039]: 'Resistance sensor' - Resistance 2325.6Ω
[20:44:35][D][sensor:094]: 'Resistance sensor': Sending state 462.50085 lx with 1 decimals of accuracy

tu jest prawdopodobna przyczyna:

zlutuj układ to unikniesz problemu niepewnych połączeń.

ALE zanim to zrobisz czytaj dalej.

YAMLa nie analizowałem, na pierwszy rzut oka nie wygląda źle, ale bez schematu i tak trudno ocenić (przykładowo standardowym napięciem odniesienia jest 3.3V za stabilizatorem na płytce).
Aha i nie wyobrażam sobie zmiennych warunków oświetleniowych w zerowym czasie, loga za mało nam dostarczyłeś, skoro masz

Jakkolwiek mam też drugie podejrzenie - projekt elektroniki jest skopany na wstępie, ale tu też bez konkretnych danych (datasheet fotorezystora) kwestia jest tak naprawdę nie do oceny.

Takie mam podejrzenie, bo na wejściu ADC masz śmiesznie małe napięcie 75mV, a projekt powinien zapewniać wykorzystanie niemal całego zakresu przetwornika ADC (zależnie od modelu płytki prototypowej ten zakres to zwykle 0-3.3V lub 0-1V).

Przy założeniu, że zasilasz dzielnik z 3.3V, w górnej gałęzi masz 100kΩ, a na wyjściu dzielnika jest takie napięcie (75mV), to w warunkach idealnych w dolnej gałęzi masz zaledwie 2325.6Ω więc się wszystko zgadza (ale taka rezystancja stanowi niemal zwarcie w stosunku do tych 100kΩ z górnej gałęzi).
A teraz weź pod uwagę błąd digitalizacji.- może napięcie się zmienia, tyle że w granicach błędu pomiarowego, no ale tego bez danych fotorezystora się nie dowiemy.


Jeszcze jedno - umieściłeś wątek w dziale integracje HA, z czego wnoszę, że uważasz że firmware działa OK, więc standardowym posunięciem przy przejściu od projektowania do użytku sprzętu na bazie ESPHome jest usunięcie Integracji tego sprzętu, restart HA i ponowne dodanie Integracji (jeśli jest wszystko wykonane poprawnie, to HA wykryje sprzęt samodzielnie i tylko trzeba zatwierdzić).
Działanie to ma na celu usunięcie z HA nieaktualnych, zbędnych encji powstałych w czasie pierwszych prób.

Bardzo dziękuję za podpowiedzi, zrobiłem tak jak podpowiedziałeś. Usunąłem ESPHome oraz wszystkie pliki z nim powiązane. Wgrałem nowy czujnik, który został wykryty automatycznie. Wpisałem ten sam kod i aktualnie czujnik działa bez żadnego przerwania. Zmieniłem także pin czujnika z GPIO 36 na GPIO 34. Sprawdziłem też połączenia na płytce stykowej. Natomiast nadal mam problem z odczytami z czujnika, tak jak wspomniałeś, napięcie jest bardzo niskie. Świecenie na niego nie daje rezultatu tzn. rezystancja nie spada, a napięcie cały czas jest takie samo. Opiszę swój układ: Fotorezystor 5-10kΩ GL5616, rezystor 100k Ohm, przewód pomiędzy rezystorem a LDR’em wchodzi na pin GPIO 34.

Układ zbudowałem na podstawie tego układu.

A tak to wygląda na płytce stykowej.


Zastanawiam się czy nie zmienić rezystora na mniejszy.

Patrząc po charakterystyce w HA, czujnik już nie przerywa, ale zastanawiają mnie te nagłe spadki wartości, ponieważ czujnik aktualnie leży zamknięty w ciemnej szafie.

Wiesz chociaż jaki to fotorezystor? - od tego zależy projekt układu.

Tu masz świetny datasheet - po rezyststancji ciemnej i rozmiarach obudowy poznasz prawdopodobny model

jest też opis jak się liczy gammę, więc zamiast aproksymacji liniowej (która jest tu całkiem do bani, szczególnie że użyłeś method: exact która to metoda tu pasuje jak pięść do nosa) możesz wykorzystać bardziej zaawansowany wzór.
Z takich gotowych funkcji lepszy będzie filtr calibrate_polynomial - zauważ, że fotorezystor ma charakterystykę nieliniową (konkretniej odwrotnie logarytmiczną), jeszcze jeden datasheet, gdzie to ładnie widać

A w kwestii zasadniczej spytam inaczej - masz multimetr?
To zmierz rezystancję fotorezystora w różnych warunkach, możesz też bezpośrednio mierzyć napięcie na wejściu ADC albo w innym miejscu (rezystancja wewnętrzna najtańszego cyfrowego multimetru jest wystarczająco duża by nie zakłócać działania tego układu).

No i jeśli będą jakieś wnioski z tych pomiarów, to pewnie będziesz wiedział jak dobrać optymalnie rezystancję w drugiej gałęzi dzielnika.


Aha i obejrzałem zdjęcie - na nim używasz GPIO34, a w YAMLu masz GPIO36…

UWAGA nie korzystaj z 5V bo ryzykujesz spaleniem MCU, podbierz sobie napięcie zasilania dzielnika za stabilizatorem 3.3V - to nóżka opisana 3V3

PS Przenoszę wątek, bo główne problemy to jednak elektronika.

Udało mi się poradzić z problemem. Spędziłem nad tym pół dnia próbując uwzględnić wszystkie z Twoich porad. Kilka z nich mi pomogło, między innymi zresetowanie całego układu i pozbycie się starych plików. Dzięki usunieciu wszystkich plików ze starego czujnika i instalacja wszystkiego na nowo pomogła w automatycznym wykryciu czujnika. Później miałem problem z tym, że czujnik w ogóle nie reagował na to czy włączę lub też wyłączę światło. Cały czas te same wartości. Mierzyłem również multimetrem rezystancje, a także sprawdzałem cały układ, oraz wejścia do ESP. Wszystko wydawało się okej. Finalnie zdecydowałem się rozebrać cały układ i zmontować go trochę inaczej. Mianowicie jedną nóżkę LDR zasiliłem z ESP 3.3V, drugą podłączyłem do rezystora oraz z tej samej linii pociągnąłem przewód do portu wejściowego na ESP. Drugą nogę rezystora uziemiłem. Po wykonaniu tego w końcu czujnik zaczął zauważać zmienność natężenia światła. Dosyć dużo czasu natomiast zajęło mi jeszcze ustawienie datapoints:. Wrzucę cały swój kod, może ktoś będzie miał ten sam problem. Dziękuję za pomoc!

Dodam jeszcze, że zamiast zasilania 3.3v oraz uziemienia z Raspbbery, podpiąłem wszystko pod ESP

esphome:
  name: swa
  friendly_name: swa

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxx"

ota:
  - platform: esphome
    password: "xxx"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Swa Fallback Hotspot"
    password: "lxxxxx"

captive_portal:
sensor:
  - platform: adc
    id: source_sensor
    pin: GPIO34
    update_interval: 5s

  - platform: resistance
    sensor: source_sensor
    configuration: DOWNSTREAM
    resistor: 10kOhm
    name: czujnik zmierzchu
    unit_of_measurement: lx
    device_class: illuminance
    state_class: measurement
    accuracy_decimals: 1

    filters:
      - calibrate_linear:
         - 232.6 -> 60     
         - 300.0 -> 100
         - 400.0 -> 450
         - 500.0 -> 750
         - 600.0 -> 950

Skoro mierzyłeś rezystancję samego LDR to pochwal się wynikami, w szczególności interesujące są 3-4 wartości, rezystancja w stanie ciemnym, w stanie maksymalnej spodziewanej jasności oraz ze 2 pośrednie w punktach gdzie będziesz chciał jakoś reagować na jasność.
Na tej podstawie można obliczyć jakąś sensowną wartość rezystora w drugiej gałęzi dzielnika.

W takim razie ta konfiguracja jest zła

bo górna gałąź dzielnika tam gdzie jest rezystor zmienny wymaga konfiguracji UPSTREAM (obecnie masz jako wyniki nic nie znaczące liczby, bo konfiguracja nie pasuje do użytego algorytmu! który ma za zadanie obliczać rzeczywiste wartości)

Zamiast tak kombinować powinieneś dobrać wartość rezystora do parametrów LDR…

A kalibracja wielomianowa powinna dać lepiej zaokrągloną charakterystykę (tzn. mam nadzieję, że bliższą realnych wartości) niż kalibracja liniowa z wygładzaniem (jak masz teraz, bo poprzednio miałeś po prostu wykres tej kalibracji w postaci linii łamanej).

Rezystancja w stanie ciemnym 0.6M Ohm
W stanie maksymalnej jasności 0.09k Ohm
W miejscu gdzie będę montował czujnik ± 2.9 / 3.1k Ohm

Patrząc na datasheet LDR to będzie jeden z tych dwóch


Zmieniłem także filtr na calibrate_polynomial , oraz zmieniłem konfigurację na UPSTREAM. Chciałem dopytać w jaki sposób dobrać wartości, żeby były jak najbardziej rzeczywiste wyniki

Znalazłem specyfikację tego fotorezystora

  • Fotorezystor - Symbol: GL5616
  • Rezystancja jasna: od 5 do 10 kΩ
  • Rezystancja ciemna: 800 kΩ
  • Napięcie maksymalne (DC): 150 V
  • Moc maksymalna: 100 mW
  • Fotoopornik - Rozmiar: 5 x 2 mm
  • Temperatura pracy: od -30°C do +70°C

Nie mam go w ręce, ale porównaj wymiary obudowy, ze zdjęcia sądzę że jeden z 3 pierwszych.
To jest przykładowy datasheet fotorezystorów, producent (nie wiemy jaki) mógł wyprodukować coś o innych parametrach niż w tej nocie katalogowej, bo pewnie nie jest to producent, którego notę wrzuciłem (a wrzuciłem właśnie taką, bo na zdjęciu konstrukcja jest moim zdaniem pasująca).

ALE zasada działania wszystkich jest jednakowa.

Rezystancja w stanie ciemnym dotyczy absolutnej ciemności (0 lux).
Przy pomiarze dużych rezystancji należy zadbać o brak upływności (wystarczy, że trzymasz palec na końcówkach i pomiar jest zafałszowany).

Chodzi o jasność progową, a nie miejsce… więc nie wiem, czy to dotyczy jasności progowej czy najwyższej spodziewanej.

Jeśli to progowa to rezystor rzędu 2k7, 3k0 czy 3k3 będzie odpowiedni (maksymalne zmiany napięcia będą w połowie zakresu ADC).

Jeśli to najwyższa jasność, to proponuję 10k do 33k lub po prostu ustal jaką LDR ma rezystancję przy progowej jasności i rezystor dobierz o podobnej wartości do tej zmierzonej.

Najlepiej byłoby użyć przyrządu odniesienia.

Natomiast w kwestii obliczeń spodziewam się wartości gamma w okolicach 0.5 (ale bez pomiarów lub datasheeta pasującego do tego konkretnie fotorezystora - musiałbyś znać jego model i producenta - tego się nie da zgadnąć) znając wartość gamma można obliczyć faktyczne wartości natężenia światła dość dokładnie (to myślę że ±10%) i to bez stosowania przybliżenia z punktów kalibracji, oczywiście po jakiejś wstępnej kalibracji można napisać funkcję - równanie matematyczne, które umożliwi dokładne obliczenia.
Mając przyrząd wzorcowy można samodzielnie zmierzyć wartość gamma.

Zauważ, że fabrycznie produkowane czujniki zmierzchu (no wiadomo - nie wszystkie, bo są już takie “inteligentne” gdzie to się reguluje właśnie programowo) mają po prostu potencjometr do regulacji progu wyzwalania, a tutaj zastępujesz go porównywaniem wartości.