niedziela, 7 stycznia 2018

router 433 - silnik napędowy czyll tabela funkcji w akcji

Ja tu widzę niezły burdel! Siostry...

Tablice, struktury, tablice struktur, struktury tablic .....  Wszystko to dla segregowania danych w programie routera tak by łatwo było je odszukać i wykorzystać. Dziś czas na porządkowanie stajni - przypisanie funkcji routera właściwym sygnałom wejściowym i odwzorowanie ich w sygnał wyjściowy. Coś tu pachnie poważną bazą danych a może i kolejnym automatem skończonym.

Wymyślanie "na sucho" funkcji nowego urządzenia zawsze kończy się porażką. Przynajmniej w moim przypadku. Tylko spełnienie rzeczywistej potrzeby daje wystarczający impuls do ukończenia projektu a i to nie zawsze. Natomiast standardem jest, iż w miarę gotowe urządzenie okazuje się za ciasne do pojawiających się z nagła nowych oczekiwań już po krótkim okresie użytkowania. I wtedy pojawia się dylemat - niedorobione dzieło czy jednak wiecznie nie skończone. Lepsze wrogiem dobrego sugeruje pozostawienie rzeczy takimi jakimi są. Wirus pedanterii pcha do nieustannego poprawiania.  Nie znam złotego środka. Ale już na wstępie zakładam jakąś potrzebę przyszłej rozbudowy. Pewną nadmiarowość portów procesora, ciut większą obudowę, trochę bardziej uniwersalny program. Natomiast funkcje programuję dokładnie takie jak potrzebuję. Program można zmienić zawsze choć dobrze by odbyło się to najmniejszym możliwym kosztem.

A czego oczekuję od routera 433MHz?
Zacznijmy od adrema. Jakie moduły mogę wysterować  routerem i jakie sygnały będą do tych urządzeń potrzebne?


Podstawa to gniazda lub przekaźniki sterowane radiowo. Stan On i OFF załączane są dwoma różnymi kodami. Ściemniacze są różne - jedne potrzebują sterowania dwoma kodami inne jednym ale oba typy wymagają ciągłej transmisji kodu  by uruchomić funkcję ściemniania. Inteligentny Przekaźnik jest po prostu inteligentny. Ma w sobie mikroprocesor i część funkcji sterujących można ustawić w nim programowo.

Jakie działania ma umożliwić router - kilka przykładów.
  • podstawowa sprawa - umożliwić współdziałanie urządzenia różnych producentów (o różnych typach kodów transmitowanych w paśmie 433 MHz)
  • trywialne załącz / wyłącz - jeden kod zamieniany jest na inny dla każdej z funkcji
  • przełącz - zał/wył tym samym kodem - nadajnik wysyła ten sam kod odbiornik sterowny jest naprzemiennie kodem zał/wył - jednym przyciskiem załączam/wyłączam światło
  • jeden kod steruje wieloma odbiornikami - wyłączam wszystkie światła jednym przyciskiem
  • jeden odbiornik sterowany jest kilkoma nadajnikami z różnymi funkcjami - czujka załącza światło na pewien czas a przycisk na stałe. 
  • trzymaj - router wysyła kod tak długo jak długo nadawany jest kod z nadajnika - typowe sterowanie  np. ściemniacza. Może da się zaimplementować opcje rozjaśniaj - pojedynczy kod nadawczy uruchamia procedurę sterowania ściemniaczem
  • Wyłącz z opóźnieniem - kod załącza układ a po nastawionym czasie układ zostaje wyłączony - sterowanie światła czujką
  • Załączenie / wyłączenie o określonej porze (godzinie) - oświetlenie ogrodu, podlewanie

Czy wszystkie te rodzaje sterowań zostaną zaimplementowane nie mam bladego pojęcia. Ważne jest by określić maksymalną ilość rodzajów sterowań tak by w przyszłości dodanie następnego nie wiązało się z koniecznością wymiany połowy oprogramowania.

Kolejne założenia
  1. Jedno urządzenie nadawcze wysyła dokładnie jeden i ten sam kod. Jeśli urządzenie ma możliwość wysyłania kilku kodów (pilot) każdy z klawiszy traktowany jest jako osobne urządzenie nadawcze.
  2. Jeden element wykonawczy może być połączony z wieloma nadajnikami
  3. Jeden nadajnik może sterować wieloma elementami wykonawczymi przy czym każdym z nich może być ustawiony na inną funkcję.
Powyższe założenia zakładają, iż czujniki (elementy nadawcze) i wykonawcze (odbiorcze) są mało inteligentne i realizują w zasadzie pojedyncze proste funkcje. Nie jest to prawdą bo taki np. inteligentny przekaźnik zawiera w sobie większość zakładanych dla routera funkcji. To założenie jest znowu "maksymalne" na potrzeby doboru parametrów granicznych routera.

Ogólny schemat przepływu informacji pomiędzy nadajnikami kodów a odbiornikami z pośrednictwem routera 433 można przedstawić tak


Z powyższego grafu można przyjąć dwojaką logikę struktury wewnętrznej routera. Albo dowiązać do danego kodu wejściowego ( z nadajnika) pary złożone z funkcji i kodu wyjściowego (do odbiornika) lub do każdego kodu wyjściowego dołączyć od 1 do N par <kod nadawczy + funkcja>.

Na logikę pierwszy sposób wydaje się lepszy gdyż odbierając konkretny kod nadajnika router łatwiej  wygeneruje odpowiednie funkcje i związane z nimi kody wyjściowe. Sposób drugi po odebraniu kodu wymagałby przejrzenia wszystkich powiązań dla odnalezienia tych,  w których zaszyty jest dany kod wejściowy. Choć nie jest to takie oczywiste.

Tak więc dla każdego kodu nadajnika  trzeba dowiązać bazę kilku rekordów złożonych z pól określanych jako <kod wyjściowy>  i  <funkcja>. Liczba rekordów dla każdego kodu wejściowego odpowiada liczbie kodów wyjściowych doń przypisanych. Trzeba jakoś wstępnie ograniczyć maksymalną liczbę kodów wyjściowych dowiązanych do jednego kodu wejściowego np. do trzech.  Musimy więc stworzyć strukturę powiązań pomiędzy zbiorem kodów wejściowych a trzykrotnie większym zbiorem funkcji i połączonych z nimi kodów wyjściowych.



Postać kodów wejściowych i wyjściowych już znamy. To tablice struktur zawierające uporządkowane informacje określające jednoznacznie adresy urządzeń bezprzewodowych. Natomiast nie mam pojęcia jaką postać ma mieć informacja definiująca funkcje poszczególnych urządzeń wyjściowych.

Najsampierw przyporządkujmy znaczniki funkcjom routera
  1. Załącz - Jeden kod wej generuje jeden kod wyjściowy
  2. Przełącz - jeden kod wejściowy generuje dwa ( a może więcej) naprzemienne kody wyjściowe
  3. Trzymaj - przychodzący ciągle kod wejściowy potrzymuje transmisję kodu wyjściowego (może to da się zrobić w pkt. 1
  4. Wyłącz z opóźnieniem
  5. Załącz z opóźnieniem 
  6. Załącz zegarem
  7. ..... inne kolejne nienazwane funkcje
Do zapamiętania kodów funkcji wystarczy 1 bajt. Problem jest tylko z funkcjami czasowymi - tu trzeba zapisać dodatkowo interwał czasu. Pożądane by czasy załączenia obejmowały przedział od pojedynczych sekund do kilkudziesięciu godzin. Upakowanie takiego zakresu w jednej zmiennej będzie wymagało skomplikowanych przeliczeń  godzin na sekundy. Ponad to nie ma sensu dokładność sekundowa przy czasach rzędu kilku godzin. Zmodyfikujmy więc nieco opis pól funkcji rozdzielając zakresy dla funkcji czasu
  1. Załącz / Wyłącz 
  2. Przełącz 
  3. Trzymaj 
  4. Wyłącz z opóźnieniem [sek]
  5. Wyłącz z opóźnieniem [min]
  6. Wyłącz z opóźnieniem [godz]
  7. Załącz z opóźnieniem [sek]
  8. Załącz z opóźnieniem [min]
  9. Załącz z opóźnieniem [godz]
  10. Załącz zegarem
  11. ..... inne kolejne nienazwane funkcje
 W takim przypadku wystarczy jeszcze jeden bajt określający ilość jednostek czasu dla danego podzakresu. Nasz pojedynczy rekord funkcji programu  przybierze postać:
<nr funkcji> <czas>  - wymiar obu pól to 1 bajt. Dostępny zakres nastaw dla każdego z podzakresów czasowych to 0 - 255 [sek], [min] lub [godz]. Jak na mój gust to całkiem nieźle.
Mamy więc do dyspozycji trzy bazy danych (tablice struktur) - tablicę adresów wejściowych, tablicę adresów wyjściowych i tablicę funkcji. Możemy operować na trzech tablicach równolegle. Można też te trzy tablice połączyć w jedną. A może jeszcze inaczej. Zobaczymy

Wariant I - tablice rozdzielone połączone jednakowym indeksem

Można trzy tablice połączyć indeksami. Ten sam nr indeksu łączyłby adres wejściowy, wyjściowy i funkcję. Nie ma też problemu z połączeniami wielokrotnymi - każdy kolejny indeks może kolejną  kombinację tych samych adresów.


Powyżej przykładowa zawartość tablic gdzie wejścia, wyjścia i funkcje połączone są za pomocą identycznych indeksów tablic. Odpowiada temu taki to graf działania routera


Wszystko pięknie działa. Procedura wydaje się wprost idealna gdy tworzymy graf połączeń na etapie pisania programu. Wszystko dostępne jest w czytelnej formie i banalnie proste do edycji i zmian. Co jednak gdy kody urządzeń wejścia i wyjścia zostały zapisane wcześniej niż funkcje je łączące. Jeszcze gorzej gdy przyjdzie nam zmienić przyporządkowania poszczególnych kodów miedzy sobą. Jak to skutecznie zrobić z poziomu BLYNKa by nie trzeba za każdą pierdołą przeprogramowywać całego routera.
Może trzeba inaczej

Wariant II - dwie tablice kodów połączone tablicą funkcji

W tym wariancie tablica funkcji zawiera zarówno oznaczenie funkcji i czasu jak i nr indeksu adresu wejściowego i wyjściowego.



Tabela funkcji realizuje dokładnie ten sam graf działania routera ale tworzenie i zmiana jej elementów może być dokonana w dowolnym momencie bez naruszania zawartości tabel adresów wejściowych i wyjściowych.  Podoba mi to. W takiej strukturze nie ma też żadnych ograniczeń co do ilości odbiorników sterowanych jednym kodem wejściowym (wstępnie chciałem ograniczyć do 3 by nie rozbudowywać bez potrzeby tablicy funkcji). Jedyny problem to ten, iż po odbiorze kodu z nadajnika trzeba przejrzeć zawartość tablicy wszystkich funkcji by odnaleźć wszystkie sterowania z odebranym właśnie kodem. Ale co tam. 80 MHz procesor musi dać radę.

Policzmy jeszcze wymaganą przestrzeń pamięci dla obu przypadków (wielkość EEPROM jest jednak ograniczona)
Wariant I  >> 5x6 + 5x6 + 5x2 = 70 bajtów
Wariant II >> 4x6 + 3x6 +5x4 = 62 bajty
No proszę i nawet nie zajmuje to więcej miejsca w pamięci.

Pozostaje sprawdzić czy wariant ten da się przyjaźnie zrealizować dostępnymi w BLYNKu widgetami i na ile cała operacja będzie czytelna dla "zwykłego" użytkownika naszego routera.

Automat skończony do dekodowania kodów 
Zapisywanie kodów do EEPROMu  
typ struktura i zapis tablicy struktur do  EEPROMu  
baza danych i operacje na tablicy struktur  
tabela funkcji i dowiązanie jej do adresów wejściowych i wyjściowych  

Ciąg dalszy tym razem z udziałem BLYNKa już niebawem..

Wcześniejsze odcinki serialu
http://100-x-arduino.blogspot.com/2017/11/router-433-mhz-aczymy-rozne-systemy.html
http://100-x-arduino.blogspot.com/2017/11/router-433-mhz-nauka-czytania-i-pisania.html
http://100-x-arduino.blogspot.com/2017/12/router433-jak-programowac-schematy.html
http://100-x-arduino.blogspot.com/2017/12/esp8266-zapis-do-pamieci-eeprom-kodow.html
http://100-x-arduino.blogspot.com/2017/12/zapis-tablicy-struktur-do-eeproma-nauka.html
http://100-x-arduino.blogspot.com/2018/01/operacje-na-tablicy-struktur-czyli-mini.html
110

1 komentarz: