Miał być ukraiński budzik a wyszedł stacyjny zegar. Tak to już jest z tym programowaniem - wspaniałe ale teoretyczne pomysły rozbijają sobie łeb o twardą rzeczywistość. W programie routera powodów do zmian było aż nadto. Ważne, że przyjęta na początku koncepcja tablic i struktur sprawdziła się znakomicie. Dzięki niej przeprowadzone rewolucja działania programu nie wiązała się z jego całkowitą dewastacją a jedynie z dodaniem kolejnych pól struktury czy kolejnych pól rekordów tablicy. A w kolejce na poznanie czekają inne ciekawe konstrukcje programistyczne ot chociażby KLASY.
Ale na razie zostańmy na etapie programistycznego przedszkola którego efektem jest pierwsza finalna wersja tworzonego właśnie routera 433 MHz.
Hardware
Program programem ale tak naprawdę to mikroprocesor będzie rządził routerem. Coś trzeba było wybrać c całego wachlarza dostępnych modułów. Tym razem postawiłem na absolutne minimum.Po pierwsze - gotowa płytka projektu BRAMA została obsadzona tylko trzema modułami: mikrokontrolerem ESP-01, nadajnikiem 433 MHz CYT1 i odbiornikiem CY-07. A jest jeszcze stabilizator 3V3.
Po drugie - ESP-01 to absolutne minimum wśród mikrokontrolerów ESP8266. I o dziwo ten mikrus udostępnia aż 4 porty (z 8 pinów) dla wykorzystania. Choć z pewnymi ograniczeniami. Do sterowania modułami 433 w sposób naturalny wykorzystałem porty 1 i 3 tz. Tx i Rx. Pozwala to zachować właściwe naturalne kierunki transmisji przez te porty. Czy to jest ważne? Bardzo. W trakcie uruchamiania mikrokontrolera na porcie Tx transmitowane są jakieś wewnętrzne komunikaty procesora. Dołączenie tego wyjścia do wyjścia odbiornika mogłoby zakończyć żywot jednego lub drugiego modułu. A więc Tx łączę z wejściem nadajnika CYT1. Port Rx ESP jest dużo mniej wrażliwy gdyż standardowo pracuje jako wejście. Należy jednak pamiętać o zachowaniu na nim poziomu napięcia 3V3. W układzie pozostawiłem więc dzielnik rezystorowy pomiędzy wyjściem odbiornika CY-07 a wejściem Rx procesora.
Po trzecie. W literaturze "fachowej" jest mocno NIE zalecane wykorzystywanie portów GPIO0 i GPIO2. Porty te wykorzystywane są w procedurze ładowania programu do pamięci. Ale można je również wykorzystać ale inteligentnie. Bez problemu można przyłączyć tam diodę lub buzzer. Warunkiem jest podawanie stanu 1 w momencie resetu mikrokontrolera co oznacza, że aktywnym stanem wyjściowym na tym porcie może być tylko stan niski.
Poskładana na prędce płytka wygląda całkiem przyzwoicie i zawiera wszystko co niezbędne dla uruchomienia testowej wersji programu routera 433.
Software
Pogram się "nieco" rozrósł i ciężko go umieścić bezpośrednio na blogu. Odpada również pastebin.com gdyż podzieliłem cały kod na pięć osobnych plików. Pozostaje więc github.com i właśnie tu pod adresem https://github.com/krzyspx/router433 umieszczony został komplet plików programu. Tu też pojawiać się będą jego kolejne wersje. Pliki programu dołączane są jako prywatne biblioteki tzn #include "coś_tam.h". Ta metoda znakomicie sprawdza się dla podziału kodu programu na mniejsze, funkcjonalnie spójne bloki. Przez taki podział cały program staje się łatwiejszy do ogarnięcia i lepiej zabezpieczony przed "przypadkowymi" zmianami.Obecna wersja programu to r2_1.1. Plik główny .ino zawiera jedynie podstawową strukturę Arduino IDE - procedury setup() i loop() wypełnione odwołaniami do konkretnych funkcji routera. Nic tu ciekawego po za tym, że całość programu pracuje w klasycznym poolingu przemiatając kolejno wszystkie procedury programu.
blynk.h
Tu również nic ciekawego nie ma - ot standardowa procedura obsługi BLYNKa w wersji niezawieszającej działania systemu przy braku połączenia z serwerem. Skuteczna, sprawdzona i już.
Tu też znajduje się spis wszystkich użytych w programie pinów wirtualnych - no trochę tego się nazbierało tak na oko za około 7 tys pkt. Ale pracować to będzie w oparciu o serwer lokalny więc nie boli nic.
NO433.h
To także standardowa moja procedura obsługi transmisji 433 MHz w oparciu o najlepszą moim zdaniem bibliotekę <RCSwitch.h>. Odebranie kodu ładuje zmienne z parametrami odbioru i uruchamia procedurę główną routera gogo(0). Jest jeszcze standardowa procedura wysyłania kodu przez nadajnik zerżnięta w prost z przykładu w bibliotece.
funkcje.h
No zaczyna się prawdziwy program routera. W stosunku do wersji poprzedniej sporo się zmieniło. Przede wszystkim zmianie uległy struktury danych dla kodów wejściowych i wyjściowych. Dla kodów wejściowych pozostawiłem jedynie pole nr kodu. Inne dane transmisji okazały się bez znaczenia w procesie działania routera. Dodalem też pole opisu - już po godzinie zapominałem co który kod oznacza i musiałem to zapisywać na kartce - teraz jest dużo bardziej czytelnie.
Natomiast znacznie powiększyła się struktura kodów wyjściowych. Tu musiałem dać komplet parametrów ustawianych podczas transmisji kodu. Okazało się, iż posiadam urządzenia pracujące z bardzo dziwnymi nastawami transmisji. Tu też dodałem pole opisu dla każdego kodu.
Struktura dla tabeli funkcji pozostała bez zmian. Każda z tabel może mieć swój własny rozmiar ale łącznie nie mogą przekroczyć 4 kB pamięci EEPROM (a w zasadzie flash) co po dodaniu opisów znacznie zmniejszyło maksymalną liczbę możliwych do zapamiętania w routerze kodów.
Trochę gimnastyki wymagało wyświetlenie tak wielu zmiennych w dwu dostępnych polach tablicy aplikacji BLYNK (linie 77-99). Ale zrobienie z całości informacji jednego stringu rozwiązało problem. Do łask powróciły procedury zamiany stringu na łańcuch char[] (101-113) inaczej nie dałoby się tego zapisać do struktury.
Do programu wskoczyły dwa widgety terminali (V36 i V33), którymi ręcznie mogę wprowadzić dowolne parametry kodów wejściowych i wyjściowych. Bardzo duże ułatwienie w obsłudze routera a samo procedura jest bardzo przejrzysta i czytelna a to dzięki zastosowaniu kolejnego automatu skończonego. Fajna rzecz te automaty (115-217) choć zawierają sporo kodu.
Procedura KOD_do_eeprom() została uproszczona - nie ma już automatyki zapisu do pamięci. Program się sypał gdy nadajniki siały różnymi kodami. Teraz zapis do pamięci odebranego kodu następuje po zwolnieniu przycisku ZAPIS.
Najbardziej zadowolony jestem z funkcjonalności tablic aplikacji BLYNK. Możliwość wykorzystania rzędów tablicy jak przycisków niesamowicie usprawniło cały proces obsługi rutera. Wszystko to dzieje się w liniach 298-356.
Dodałem też przycisk resetujący zawartość wszystkich tablic (391-409).
Na końcu pliku są procedury wywoływane z poziomu programu głównego Arduino IDE - routersetup() i router().
router_gogo.h
Ten plik zawiera komplet procedur obsługi normalnej pracy routera tzn. sposób jego zachowania po odebraniu kodu z urządzenia bezprzewodowego.Odebrany kod porównywany jest ze wszystkimi kodami zapisanymi w tablicy kodów wejściowych. Jeśli taki kod istnieje w tablicy zamieniany jest na numer pozycji (indeks) tablicy (10-14). Następnie indeks ten poszukiwany jest w tablicy funkcji (62-76). Jeli tablica funkcji zawiera ten indeks oznacza to że router ma do wykonania jakąś funkcję sterującą powiązaną z tym kodem wejściowym. Jaką ? A tego dowiadujemy się już w liniach 78, 80 i 86. Na razie zaimplementowane są trzy podstawowe funkcje routera: zał/wył, przełącz i przekaźnik czasowy.
Przekaźnik czasowy ma swój własny 10 sekundowy licznik (47-61) i to najmniejsza wartość czasu możliwa do ustawienia w parametrach opóźnienia. Maksymalny czas to 65536 x 10 sek = ok 7,5 dnia.
Tu też znajduje się procedur powtórzeń wysyłania kodów gdyby pierwsza transmisja nie załączyła poprawnie odbiornika. Następne kody wysyłane są co 2 sek.
I to by było na tyle na dziś. W następnym poście o ile ciąg dalszy następi pojawi się kilka filmików z działania rutera.
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
http://100-x-arduino.blogspot.com/2018/01/router-433-silnik-napedowy-czyll-tabela.html
http://100-x-arduino.blogspot.com/2018/01/widget-table-proste-bazy-danych-w-blynku.html
http://100-x-arduino.blogspot.com/2018/01/router-433-mhz-pierwsze-uruchomienie.html
114
Brak komentarzy:
Prześlij komentarz