Esp D1mini sterowanie fazowe problem z DS18B20

Witam, Na tytułowym Wemos D1mini zrobiłem w esphome sterownie fazowe promiennikiem podczerwieni 2000W. Sterownie odbywa się poprzez funkcję (platformę) ac_dimer z esphome (pin D5 D6), który poprzez optotriaka steruje triakiem. D1 obsługuje również odbiornik podczerwieni, gdzie można sobie ustawić pilotem moc (pin D8). Ponadto na pinie d4 podpoiłem początkowo jeden DS18B20 na krótko (badanie temperatury w środku) a następnie drugi na kablu 1m długości. Do D1 podpięty jest jeszcze wyświetlacz (D1, D2). I teraz problem: podczas uruchomienia modułu w czasie regulacji fazowej czujniki temperatury nie mierzą mi temperatury (pierwszy nigdy, drugi czasami mierzy). W czasie pomiaru, niezależnie od interwału ( 60s, 120s 15s) żarówka, która zastępuje na razie promiennik mignie (zgasi się na ułamek sekundy) dioda na wemosie mrugnie a w logach czujniki zapiszą brak sumy i zwrócą wartość “nan” (czujnik na kablu czasem zwróci temperaturę). Jeżeli ac_dimer ustawiony jest na 0% lub na 100% czujniki działają świetnie, dioda na wemosie mrugnie, ale żarówka już nie (oczywiśćie przy 100%). Co zrobiłem:

  • odpiąłem optotriaka i układ działał tylko na diodzie pomocniczej (sam PWM) - nic to nie poprawiło
  • zasiliłem niezależnie 3,3v wemosa (nie z 5V)

-zasiliłem DS18B20 z 5V (pin danych poprzez rezystor do 3,3v)
I dalej nic. Jakby działanie PWM w zakresie 1-99% zakłóca DS18B20 lub odwrotnie. Może macie jakieś porady?

text_sensor:
  - platform: template
    id: moc

  - platform: template
    id: poziom

dallas:
  - pin: D4
    update_interval: 15s

remote_receiver:
  pin:
    number: D7
    inverted: true
  dump : all  

sensor:
  - platform: dallas
    address: 0xd24070740e64ff28
    resolution: 9
    id: tempc
    name: "temp_promiennik zew_prototyp"
  - platform: dallas
    address: 0xb03cf9f649e94528
    filters:
    - filter_out: nan
    resolution: 9
    id: tempz
    name: "temp_promiennik_prototyp"


binary_sensor:
  - platform: remote_receiver
    name: "Promiennik dzieci moc1"
    lg:
      data: 0x00FFA25D
      nbits: 32
    on_press:
      then:
        - switch.turn_on: bib
        - light.turn_on:
            id: dimmer1
            brightness: 3%
        - lambda: |-
            id(moc).publish_state("200W");
            id(poziom).publish_state("1");

  - platform: remote_receiver
    name: "Promiennik dzieci moc2"
    lg:
      data: 0x00FF629D
      nbits: 32
    on_press:
      then:
        - switch.turn_on: bib
        - light.turn_on:
            id: dimmer1
            brightness: 25%
        - lambda: |-
            id(moc).publish_state("400W");
            id(poziom).publish_state("2");

  - platform: remote_receiver
    name: "Promiennik dzieci moc3"
    lg:
      data: 0x00FFE21D
      nbits: 32
    on_press:
      then:
        - switch.turn_on: bib
        - light.turn_on:
            id: dimmer1
            brightness: 40%
        - lambda: |-
            id(moc).publish_state("600W");
            id(poziom).publish_state("3");

  - platform: remote_receiver
    name: "Promiennik dzieci moc4"
    lg:
      data: 0x00FF22DD
      nbits: 32
    on_press:
      then:
        - switch.turn_on: bib
        - light.turn_on:
            id: dimmer1
            brightness: 50%
        - lambda: |-
            id(moc).publish_state("800W");
            id(poziom).publish_state("4");

  - platform: remote_receiver
    name: "Promiennik dzieci moc5"
    lg:
      data: 0x00FF02FD
      nbits: 32
    on_press:
      then:
        - switch.turn_on: bib
        - light.turn_on:
            id: dimmer1
            brightness: 60%
        - lambda: |-
            id(moc).publish_state("1000W");
            id(poziom).publish_state("5");

  - platform: remote_receiver
    name: "Promiennik dzieci moc6"
    lg:
      data: 0x00FFC23D
      nbits: 32
    on_press:
      then:
        - switch.turn_on: bib
        - light.turn_on:
            id: dimmer1
            brightness: 68%
        - lambda: |-
            id(moc).publish_state("1200W");
            id(poziom).publish_state("6");

  - platform: remote_receiver
    name: "Promiennik dzieci moc7"
    lg:
      data: 0x00FFE01F
      nbits: 32
    on_press:
      then:
        - switch.turn_on: bib
        - light.turn_on:
            id: dimmer1
            brightness: 74%
        - lambda: |-
            id(moc).publish_state("1400W");
            id(poziom).publish_state("7");

  - platform: remote_receiver
    name: "Promiennik dzieci moc8"
    lg:
      data: 0x00FFA857
      nbits: 32
    on_press:
      then:
        - switch.turn_on: bib
        - light.turn_on:
            id: dimmer1
            brightness: 84%
        - lambda: |-
            id(moc).publish_state("1600W");
            id(poziom).publish_state("8");

  - platform: remote_receiver
    name: "Promiennik dzieci moc9"
    lg:
      data: 0x00FF906F
      nbits: 32
    on_press:
      then:
        - switch.turn_on: bib
        - light.turn_on:
            id: dimmer1
            brightness: 100%
        - lambda: |-
            id(moc).publish_state("2000W");
            id(poziom).publish_state("9");

  - platform: remote_receiver
    name: "Promiennik kuchnia off"
    lg:
      data: 0x00FF9867
      nbits: 32
    on_press:
       then:
        - switch.turn_on: bib
        - light.turn_off: dimmer1
        - lambda: |-
            id(moc).publish_state("OFF");
            id(poziom).publish_state("OFF");
output:
  - platform: ac_dimmer
    id: out1
    gate_pin: D6
    min_power: 25% 
    method: leading 
    zero_cross_pin:
      number: D5
      mode: INPUT_PULLUP
      inverted: yes

light:
  - platform: monochromatic
    id: dimmer1
    output: out1
    name: Promiennik_prototyp


switch:
  - platform: gpio
    pin: D8
    id: bib
    on_turn_on:
    - delay: 100ms
    - switch.turn_off: bib

time:
  - platform: homeassistant
    id: esptime  

font: 
  - file: "arial.ttf"
    id: font1
    size: 20
  - file: "arial.ttf"
    id: font2
    size: 30   

i2c:
   sda: D2
   scl: D1
   frequency: 800kHz
   scan: false

display:
  - platform: ssd1306_i2c
    model: SSD1306_128X64
    address: 0x3C
    id: my_display
    pages:
      - id: page1
        lambda: |-

            it.print(20, 0, id(font1), "Temperatura:");
            it.printf(7, 64, id(font2), TextAlign::BASELINE_LEFT , "%.1f°C", id(tempz).state);

      - id: page2
        lambda: |-
            it.print(30, 0, id(font1), "Moc:");
            it.printf(30, 64, id(font2), TextAlign::BASELINE_LEFT , "%s", id(moc).state.c_str());
      - id: page3
        lambda: |-
            it.print(30, 0, id(font1), "Poziom:");
            it.printf(60, 64, id(font2), TextAlign::BASELINE_LEFT , "%s", id(poziom).state.c_str());
          
interval:
  - interval: 5s
    then:
      - display.page.show_next: my_display
      - component.update: my_display

Zrobiłem takie małe podsumowanie użytych GPIO

Spróbowałbym przenieść Dallasy z GPIO2 na GPIO0 (bo właściwie nie ma gdzie, a w tej płytce na GPIO2 jest wpięty LED na PCB).

Jeśli to nie pomoże, to prawdę mówiąc nie mam pomysłu gdzie szukać (skoro piszesz, że odłączyłeś obwód wyjściowy, który może generować zakłócenia), pewnie będzie trzeba przeanalizować jakie zasoby zabiera platforma ac_dimmer

Hipoteza - ponieważ w tych dwóch przypadkach nie jest wymagana obsługa PWM ( trwałe 0/1).
Procedura obsługi ac-dimmer wywoływana jest sprzętowo z częstotliwością 100Hz (przejścia przez 0 napięcia sieciowego) a 1-Wire jest również uzależniony ściśle od czasów impulsów, nawet stromość zboczy powoduje problemy.

To te dwie procedury są zapewne robione programowo i mogą się na wzajem zakłócać.
Nie wiem jak to jest realizowane w ESPHome ale zmiana na moduł ESP32 z 240MHz mogłaby sobie z tym poradzić. Ewentualnie poskładanie tego we własnym zakresie i użyciem sprzętowego UART do obsługi 1-wire.

…kolejne urządzenie z obsługą w “czasie rzeczywistym”.
W tym projekcie prawdopodobnie tylko wyświetlacz działa prawidłowo :slight_smile:

Tak myślę ,że zastosowany ESP8266 po prostu czasowo się nie wyrabia.

2 polubienia

Spróbowałem za radą Szopena przestawić dallasy na D3 (GPIO0 ) i nic to nie dało (poza tym że dioda na wemosie już nie miga).
Pomysł Robinl30 jest trudniejszy do wdrożenia po pcb już mam pod wemosa, ale natchnął mnie na inne rozwiązanie: jakbym wziął dodatkowo ESP01s i na nim w esphome podłączył dallasy i wysłał przewodowo (sekcje wifi chciałbym wyłączyć) do Wemosa D1 mini gotowe wartości temperatury. Tylko nie wiem jeszcze jak to zdrobić?
Co Wy na taki pomysł? Jakieś wskazówki jak to przesłać “po kablu”?

Ja napiszę moje spostrzeżenia z obsługi Dallasów. Mam 5szt czujników na ESP32. Jest na nim też 4 przekaźniki jako switch, przyciski jako binarny sensor, obsługa 2 wejść analogowych, I2C, Ledy sterowane pwm.
Też co jakiś czas któryś czujnik zgłasza błąd sumy kontrolnej CRC i wysyła wartość nan. Testowo próbowałem odfiltrować wartość nan przez filter out: nan. Wtedy częstotliwość błędnych odczytów znacznie się zwiększyła nawet do kilkuset na dobę. Bez filtra jest to kilka na dobę. Dla testu w HA mam złożony licznik i automatyzacja która zlicza mi ile razy była wartość nan. Z tym, że u mnie stawiam na zakłócenia na magistrali 1-wire. Bo dzieje się tak gdy załączone są przekaźniki i pracują pompy co i cwu. W planie jest zaekranowanie jakoś magistrali 1-wire.

Wg mnie jest ewidentny konflikt pomiędzy pwm na ac_dimmer a dallasami. W momencie odczytu czujników temperatury wskazanym interwałem następuje chwilowe wyłączenie pwm i z reguły brak odczytu dallasów (ten przy płytce zawsze, ten na kablu czasem coś pokaże). Przy wypełnieniu 0% i 100% wszystko działa ok (nie ma mrugnięcia przy odczycie czujników i są wartości temperatury dla dwóch dallasów). Po odpięciu urządzeń triaka i optotriaka nic się nie zmienia, więc wykluczyłem zakłócenia z zasilania oraz sterowania fazowego. Wydaje się jak to Robinl30 wspomniał, że Wemos nie daje rady.

Do przesyłania danych między dwoma MCU teoretycznie możesz wykorzystać UART, ale

  • po pierwsze taka konstrukcja to będzie jak wynajdywanie kola na nowo (szczególnie, że chcesz używać ESPHome)
  • po drugie prawdopodobnie będziesz musiał zmodyfikować płytkę D1 (bo jak znam życie to w komunikacji będzie przeszkadzał wlutowany mostek USB-UART)

No cóż więc zacząłeś projektować układ “od tyłka strony”, możliwe że kombinacja tych integracji przekracza możliwości ESP8266 (z tego co widzę ac_dimmer ma w dodatku status eksperymentalny) i pierwsze co mi przyszło do głowy, to to, co tak ładnie opisał @RobinI30 - ten komponent prawdopodobnie po prostu wcale nie pracuje przy ustawieniach 0% lub 100% dzięki czemu nie zakłóca pracy pozostałych (moim zdaniem do jego realizacji konieczne są przerwania, nie wiem jak to wygląda w przypadku pozostałych integracji wrażliwych czasowo - tu trzeba by kopać po kodzie źródłowym i jest to analiza, która by zajęła zapewne wiele dni - możesz spróbować pokopać po wygenerowanym kodzie, to się przekonasz jak to działa - tylko się licz z tym że kodu do poczytania będzie pewnie kilka MB - to ostrzeżenie przed syzyfową pracą :stuck_out_tongue: jeśli wiesz co mam na myśli).

Moja sugestia to budowa nowych prototypów na bazie ESP32 (w standardowej dwurdzeniowej wersji, czyli nie “solo1”) lub ESP32-S3. Bo to w tej rodzinie to jedyne konstrukcje na dwurdzeniowych prockach, ale nie tylko dlatego - obie zawierają znacznie bardziej rozbudowane kontrolery rozwiązane sprzętowo, z których mogą korzystać integracje (jeśli dobrze rozumiem, to nawet I2C jest w ESP82xx rozwiązanie programowo) - tabelka z fajnym podsumowaniem tego co ludzie wygrzebali ze specyfikacji różnych MCU Espressif’a:
https://espeasy.readthedocs.io/en/latest/ESPEasy/ESPchips.html

1 polubienie

W przypadku promiennika podczerwienie spokojnie można zastosować sterowanie grupowe.
Zależy co się nim ogrzewa (bezwładność termiczna obiektu) - polegałoby to m/w na tym aby załączyć np. dla 90% mocy, sterować cyklem: 9sek on i 1sek off.
Nie ma wtedy potrzeby wykrywania 0, obiekt i tak to “wycałkuje” do wartości średniej.
Nie wiem na ile można zejść z częstotliwością zwykłego PWM w ESPHome? … 0.1Hz.
Dla tego przypadku jest to prostsze i wystarczające rozwiązanie.
Masz stanowisko testowe to spróbuj zmienić na PWM i maksymalnie obniżyć (ile się da?) częstotliwość.
Ten sterownik tyrystorowy to jakaś własna konstrukcja? - zamiast tego można zastosować przekaźnik SSR.
P.S 0.1Hz to może trochę zbyt mało ale 1Hz, jeśli się uda będzie ok.

1 polubienie

Nie ma potrzeby stosowania zwykłego PWM, jest specjalizowana platforma do takich zastosowań

Niestety grupowe odpada. Próbowałem ten promiennik po prostu pulsuje czerwonym światłem nawet przy większej częstotliwości. Jest na widoku i jest to drażniące. Zachowuje się jak żarówka z trochę większą bezwładnością.
Mam takie trzy jeden już działa od kilku miesięcy na ac_dimmer i jest dobrze. Dopiero niedawno zauważyłem że wywala tą temperaturę.
Wieczorem spróbuję na esp32 dam znać.
Myślałem, że z tym ESP01 po urat będzie prosto poprzez dołączenie do Weosa (byłyby dwa procesory - oddzielny do dallasów).
Z racji mojej nikłej wiedzy ograniczającej się do kopiuj/dostosuj/wklej spróbuje połączyć dwa ESP01 po urat i coś przesłać.

Edit:

Hejka,
Zamontowałem układ na esp32s i działa za każdym razem pomiar temperatury na obu czujnikach. Dalej żarówka halogenowa mignie w czasie pomiaru, ale przy interwale ze 3 min i bezwładności promiennika nie powinno być problemu.
Chciałbym jeszcze spróbować poprzez ESP01 + dallas i tylko komunikat do D1 (uart czy i2c?) uprościłoby mi składanie tego.
Tak na marginesie jakość pwm zależy bardzo od jakości optotrika MOC3021 (przy niektórych mocno miga).

Jeszcze jedno na wemosie w logach mam cały czas taki zapis a częstotliwość ustawioną na 800kHz (na ESP32 komunikatu już nie ma)

[00:59:24][W][component:214]: Component interval took a long time for an operation (0.08 s).
[00:59:24][W][component:215]: Components should block for at most 20-30ms.

Dziękuję wszystkim za pomoc.