Popelinę mi siał przekaźnik jednokanałowy. Rozłączał mi pompę. Był podłączony na 3v bo na 5 v nie da się go podłączyć-choć jest na 5v.
Zmiana w esp easy w hardware na LOW, HIGH nic nie daje. Gdy ma napięcie 5v cały czas trzyma i nie odbija. A na 3v jest za słabo- puszcza. Zastosowałem inny przekaźnik (czerwony ) jedno kanałowy, który ma opcję zmiany OL I OH. Na OL tez nie działał, działa na OH.
Natomiast czterokanałowy tez jest ok, działa na 5v choć jest OL ... . A ten mały pizdryk nie wiem, o co mu chodzi. Szmelc.
Cześć,
wróciłem do tematu bo nie było to dobrze zrobione i przekombinowane.
Zrobiłem stanowisko testowe działa to teraz w takiej postaci:
Jeśli przepływ spadnie poniżej 150 i ten stan trwa co najmniej 10 s ---> wyłącz pompę,
Jeśli przepływ znów wróci czyli będzie >150 i ten stan będzie trwał dłużej niż 3 s ------> włącz pompę.
Zamykam zawór na 5 s - nic się nie dzieje, zamykam zawór na 10 s --->> wyłącza pompę.
A teraz chciałbym to samo działanie żeby zrobiło samo ESP w rules.
Nie testowałem bo nie mam na czym
Rule1 ON system#boot DO var1 0 ENDON ON flow#Actual<150 DO if (var1!=1) RuleTimer1 3 endif ENDON ON Rules#Timer=1 DO backlog Power1 off; var1 1 ENDON ON flow#Actual>150 DO if (var1!=0) RuleTimer2 10 endif ENDON ON Rules#Timer=2 DO backlog Power1 on; var1 0 ENDON
działa pięknie-prawie idealnie, jest pewien mankament- układ musi startować ze zmienną 1. Jeśli zmienię zmienną ręcznie to już głupieje. Czyli jak zblokować zmianę zmiennej ręcznie, albo, żeby ona zawsze wróciła do właściwego stanu?
On System#Boot Do
TaskValueSet,4,1,0 //zmienna na 0
Endon
On ads#flow<150 Do // jeśli przepływ spadnie do poziomu krytycznego
If [dummy#var]=1 // jesli zmienna = 1
TimerSet,1,3 // t1 odlicza do 3 s
Endif
Endon
On Rules#Timer=1 Do // jesli przepływ jest normalny, powrócił na conajmniej 3 s
GPIO,2,0 // ON pompę obieg.
TaskValueSet,4,1,0 // zmienna na 0
Endon
On ads#flow>150 Do // jesli przepływ jest normalny
If [dummy#var]=0 //jeśli zmienna= 0
TimerSet,2,5 // t2 odlicza czas do 5 s
Endif
Endon
On Rules#Timer=2 Do // jeśli przepływ zaniknie na 5 s i więcej
GPIO,2,1 // OFF pompę obieg.
TaskValueSet,4,1,1 // zmienna na 1
Endon
Spróbuj bez zmiennej ale z histerezą
On System#Boot Do GPIO,2,1 // przekaźnik OFF po starcie Endon // ===== WYŁĄCZANIE (flow < 140) ===== On ads#flow<140 Do TimerSet,2,5 // niski przepływ musi trwać 5 s Endon On Rules#Timer=2 Do GPIO,2,1 // OFF przekaźnik Endon // ===== WŁĄCZANIE (flow >= 160) ===== On ads#flow>=160 Do TimerSet,1,3 // wysoki przepływ musi trwać 3 s Endon On Rules#Timer=1 Do GPIO,2,0 // ON przekaźnik Endon
Działa, też fajne - zmieniłem tylko z on na off bo było odwrotnie, czyli jak był mały przepływ to włączył się. Natomiast jak w trakcie pracy wyłączę ręcznie GPIO to trzeba zjechać z przepływem w dół, znów przepływ do góry i wtedy dopiero się załącza ponownie przekaźnik.
On System#Boot Do GPIO,2,1 // przekaźnik OFF po starcie Endon // ===== WŁĄCZANIE (flow < 140) ===== On ads#flow<140 Do TimerSet,2,5 // duży przepływ musi trwać 5 s Endon On Rules#Timer=2 Do GPIO,2,0 // ON przekaźnik Endon // ===== WYŁĄCZANIE (flow >= 160) ===== On ads#flow>=160 Do TimerSet,1,3 // mały przepływ musi trwać 3 s Endon On Rules#Timer=1 Do GPIO,2,1 // OFF przekaźnik Endon
Uzupełnij sobie kasowanie przeciwnych timerów tzn jak rusza pierwszy drugi ma się zerować i odwrotnie
On ads#flow>=160 Do TimerSet,1,3 TimerSet,2,0 // kasuje timer wyłączenia Endon On ads#flow<140 Do TimerSet,2,5 TimerSet,1,0 // kasuje timer włączenia Endon
Oczywiście pomiędzy stany GPIO mają być 🙂
tylko nie chce mi się już tego pisać
Nie wiem czy dobrze zrozumiałem, dodałem te timery zerowania, ale tak to nie działa
On System#Boot Do GPIO,2,1 // przekaźnik OFF po starcie Endon // ===== WŁĄCZANIE (flow < 140) ====== On ads#flow<140 Do TimerSet,1,0 // kasuje timer wyłączenia TimerSet,2,5 // wysoki przepływ musi trwać 5 s Endon On Rules#Timer=2 Do GPIO,2,0 // ON przekaźnik Endon // ===== WYŁĄCZANIE (flow >= 160) ====== On ads#flow>=160 Do TimerSet,2,0 // kasuje timer włączenia TimerSet,1,3 // niski przepływ musi trwać 3 s Endon On Rules#Timer=1 Do GPIO,2,1 // OFF przekaźnik Endon
Ten kod działa fajnie.
Przy resecie płytki działa prawidłowo, odliczy czas i włączy przekaźnik jeśli jest spełniony warunek przepływu.
Przy wyłączeniu płytki od zasilania, powrocie zasilania, wysoki przepływ- przekaźnik się nie włącza-ale włączy się jeśli choć na chwilę zjadę przepływem poniżej progu i znów dam wysoki przepływ, hmmm może coś pokombinuję z System#wake
Czyli rozwiązanie widzę np. takie: dołożyć upsa 5v do płytki i po herbacie, dodatkowo zrobić przycisk sterowania ręcznego - podać ręcznie 5v na przekaźnik, włączyć alarm do telegramu jeśli brak przepływu i wysoka temperatura.
Przy zaniku wifi też działało.
Zmiana stanu GPIO podczas pracy-wyłączenie ręczne- i tu problem na pewno, nie wraca do pracy-ale zjechanie -nawet krótkie- z przepływem w dół i powrót przepływu - powraca do normy. Ale kto będzie ręcznie wyłączał przekaźnik.
On System#Boot Do GPIO,2,1 // przekaźnik OFF po starcie Endon // ===== WŁĄCZANIE (flow < 140) ====== On ads#flow<140 Do TimerSet,2,10 // wysoki przepływ musi trwać 10 s Endon On Rules#Timer=2 Do GPIO,2,0 // ON przekaźnik Endon // ===== WYŁĄCZANIE (flow >= 160) ====== On ads#flow>=160 Do TimerSet,1,5 // niski przepływ musi trwać 5 s Endon On Rules#Timer=1 Do GPIO,2,1 // OFF przekaźnik Endon
Dziwne że kasowanie tych timerów nie działa, bo moim zdaniem powinno. Może w espeasy jest coś inaczej a ja nie korzystam.
na ręczne włączenie / wyłączenie, można zastosować watchdog co sekundę , czyli ja bym zrobił to tak
On System#Boot Do
GPIO,2,1 // przekaźnik OFF
Let,0,1 // wymagany stan = OFF
TimerSet,1,0
TimerSet,2,0
Endon
On ads#flow>=160 Do
TimerSet,1,3 // warunek musi trwać 3 s
TimerSet,2,0 // kasuje timer wyłączenia
Endon
On Rules#Timer=1 Do
GPIO,2,0 // ON
Let,0,0 // wymagany stan = ON
Endon
On ads#flow<140 Do
TimerSet,2,5 // warunek musi trwać 5 s
TimerSet,1,0 // kasuje timer włączenia
Endon
On Rules#Timer=2 Do
GPIO,2,1 // OFF
Let,0,1 // wymagany stan = OFF
Endon
On Clock#Second Do // Co sekundę sprawdza czy stan gpio odpowiada wartości Let i jesli nie to ją ustawia
If [GPIO#2] != [UserVar#0]
GPIO,2,[UserVar#0]
EndIf
Endon
Dostosuj sobie on i off bo każdy może interpretować inaczej
Jeśli chodzi o tego watch doga, czy muszę stworzyć dummy#var czy ten user var to jest wirtualna zmienna ?
On Clock#Second Do // Co sekundę sprawdza czy stan gpio odpowiada wartości Let i jesli nie to ją ustawia
If [GPIO#2] != [UserVar#0]
GPIO,2,[UserVar#0]
EndIf
Endon
Zrobiłem test kodu poniżej i zrobiłem tak:
- wyrzuciłem dwa timery kasuj pod flow- bo inaczej nie działało, zostawiłem timery pod boot i tak reaguje układ-ożył,
- zamieniłem GPIO ON na OFF miejscami
- przy resecie lub przy wyłączeniu zasilania żeby układ działał trzeba zjechać z przepływem w dół, potem przepływ na maxa i wtedy dalej działa prawidłowo -ale robiłem też test w domoticzu z blockly i tam podobna sytuacja,
- włączanie, wyłączanie GPIO ręcznie - jest możliwe, nie jest zblokowany pin
On System#Boot Do
GPIO,2,1 // przekaźnik OFF
Let,0,1 // wymagany stan = OFF
TimerSet,1,0
TimerSet,2,0
Endon
On ads#flow>=160 Do
TimerSet,1,3 // warunek musi trwać 3 s
Endon
On Rules#Timer=1 Do
GPIO,2,1 // OFF
Let,0,1 // wymagany stan = OFF
Endon
On ads#flow<140 Do
TimerSet,2,5 // warunek musi trwać 5 s
Endon
On Rules#Timer=2 Do
GPIO,2,0 // ON
Let,0,0 // wymagany stan = ON
Endon
On Clock#Second Do // Co sekundę sprawdza czy stan gpio odpowiada wartości Let i jesli nie to ją ustawia
If [GPIO#2] != [UserVar#0]
GPIO,2,[UserVar#0]
EndIf
Endon
włączanie, wyłączanie GPIO ręcznie - jest możliwe, nie jest zblokowany pin
Tu nie ma mowy o zablokowaniu ręcznego włączenia, nie da się tego zrobić, można i tak powinno być przywrócić prawidłowy stan po ręcznym przełączeniu.
Za przywrócenie stanu odpowiada zmienna Let, a raczej jej wartość , co sekundę jest sprawdzana jej wartość i jeśli zmieni się stan przekaźnika bez zmiany tej zmiennej ( ręcznie), reguła powinna przywrócić stan poprzedni max po sekundzie.
Po resecie lub zaniku zasilania wszystkie timery są na off i przekaźnik również, pierwszy odczyt przepływu jeśli jest poniżej 140 lub powyżej 160 powinien aktywować timer, a po nim przekaźnik.
Stan bezczynności może być tylko gdy przepływ jest w oknie histerezy np 145 i wtedy nic się nie wydarzy
To nie działa ten "LET" zatem - jak jest włączony przekaźnik, wyłączę go i nie włączy go sam.
Nie działa bo odwracasz logikę przekaźnika, masz tu wersję, która powinna działać.
Oczywiście uparcie twierdzę , że kasowanie liczników powinno działać 🙂
On System#Boot Do
GPIO,2,1 // OFF (active-LOW)
Let,0,1 // wymagany stan GPIO = OFF
TimerSet,1,0
TimerSet,2,0
Endon
//WŁĄCZANIE (flow ≥ 160)
On ads#flow>=160 Do
TimerSet,1,3 // warunek musi trwać 3 s
TimerSet,2,0
Endon
On Rules#Timer=1 Do
GPIO,2,0 // ON
Let,0,0
Endon
//WYŁĄCZANIE (flow < 140)
On ads#flow<140 Do
TimerSet,2,5 // warunek musi trwać 5 s
TimerSet,1,0
Endon
On Rules#Timer=2 Do
GPIO,2,1 // OFF
Let,0,1
Endon
//WATCHDOG (ochrona przed ręcznym sterowaniem)
On Clock#Second Do
If [GPIO#2] != [UserVar#0]
GPIO,2,[UserVar#0]
EndIf
Endon
NTP masz aktywne ? Potrzebne do watchdoga !
Bez NTP wywołanie clock#second będzie niemożliwe
Przykład z popularnym serwerem
Mam te niebieskie przekaźniki do tego testu
To nie ma wpływu na te testy, pokaż logi gdy ręcznie wymuszasz zmianę stanu przekaźnika









