niedziela, 21 stycznia 2018

Router 433 MHz - pierwsze uruchomienie - zaczyna robić się poważnie

Do tej pory sprzątałem bałagan jaki czyni w programie nadmierna ilość obrabianych danych. A wszystko jest winą urządzeń pracujących w paśmie 433 MHz. Pełen chaos komunikacyjny i swoboda dostępu do pasma dają w sumie niezły kociokwik. Czas jednak na poważne poukładanie wewnętrznych procedur routera tak by uzyskać działające i miarę przewidywalne urządzenie nawet w tak nieprzewidywalnym środowisku. No może nie będzie to jeszcze  szwajcarski zegarek ale radziecki pardon ukraiński budzik da się z tego chyba wykroić. Zobaczymy


Testowy program funkcji routera potwierdził moje podejrzenia o skuteczności zarządzania dużą ilością danych za pomocą tablic. A sformatowanie tych tablic danymi mającymi postać struktur niebywale ułatwiło wszelkie poszukiwania i manipulacje zmiennymi o różnych typach danych. Nie mówię już o takim drobiazgu jak zapisywanie i odczytywanie hurtem tablic w pamięci nieulotnej naszego (nie)drogiego ESP8266. Co ważne ten niewielki procesorek jak na razie świetnie sobie radzi z obróbką znacznej ilości bajtów mielonych bez opamiętania przez procedury routera.

Czas na wydzielenie całego programu związanego z routerem do osobnego pliku <funkcje.h>. Dzięki takiemu rozwiązaniu funkcje routingu będą mogły być dodawane do innych urządzeń budowanych w oparciu o ESP. Po co? By w prosty sposób móc dołączać dowolne urządzenia bezprzewodowe do nowych projektów. Lub dla poszerzenia zasięgu pracy urządzeń bezprzewodowych dzięki funkcji "repeatera" dostępnej w układach znajdujących się na drodze komunikacji odległych urządzeń. Albo ..... nie mam jeszcze dziś najmniejszego pojęcie PO CO. Sie zobaczy

Na tą chwilę część programu odpowiedzialnego za funkcje routera wygląda tak

https://pastebin.com/Z45weqCU

Krótka wycieczka po kodzie

- linia 8 i 19 to struktury do tablic
- a 31-33 deklaracje samych tablic złożonych ze struktur (a dokładnie ze zmiennych o typie struktura)
Zwiększenie rodzajów danych w tablicy to tylko dopisanie kolejnego pola w strukturze. Zwiększenie rozmiaru tablic to zmiana w liniach 27-29. Błyskawiczne i bezproblemowe.
> Zadanie na przyszłość - zrobić mechanizm automatycznego powiększania rozmiaru tablicy przy dodawaniu kolejnych urządzeń.

- linia  56 to główna procedura routera - tu odbywa się wszystko w czasie normalnej jego pracy. Funkcja wywoływana jest w poolingu przez procedurę obsługi odbieranych przez bibliotekę  <RCSwitch.h> kodów

void no433akcja()  { // procedyra obsługi odebranego z 433MHz
  if (mySwitch.available()) {
    Blynk.virtualWrite(V103, mySwitch.getReceivedValue());
    o_kod = mySwitch.getReceivedValue();
    o_impuls = mySwitch.getReceivedDelay();
 
   gogo(mySwitch.getReceivedValue());
    mySwitch.resetAvailable();
  }
}

Odebrany kod poszukiwany jest w tablicy kodów wejściowych  procedurą szukaj_indeks_we(kod);  (linia 58). Jeśli kod istnieje w tablicy nadawczej (kod == tablica_adres_nad[i].kod)  indeks będzie większy od zera i można szukać go w tablicy funkcji (linia 65). Do kodu wejściowego może być dowiązana (ale nie musi) jedna lub więcej funkcji routera. Trzeba więc przeszukać całą tablicę funkcji w poszukiwaniu indeksów kodów wejściowych (63).
Odnalezienie choćby jednego właściwego indeksu kieruje program do części wykonawczej routera. Sprawdzany jest rodzaj funkcji jaki ma być wykonany (zaimplementowane jest na razie tylko ZAŁĄCZENIE czyli prosta zamiana kodu wej na kod wyj) i wysyłany jest właściwy kod wyjściowy o indeksie pobranym z tabeli funkcji.(linia 67-69). Procedura send_indeks(byte ind)
przygotowuje kod do wysłania oraz uruchamia procedurę powtarzania wysyłania kodu co 1 sek. ESP8266 jest naprawdę szybkim mikrokontrolerem i zaczynał wysyłanie danych już w momencie gdy były one jeszcze nadawane przez urządzenie (urządzenia powtarzają wysyłanie kodu od 2 do 4 razy). Trzeba było więc dodatkowo opóźnić router by kody wejściowe i wyjściowe nie nakładały się na siebie w eterze.

I to już cała zasadnicza część programu routera. Reszta to konfiguracyjne dodatki.
I tak linia 146 to opisywana wcześniej procedura zapisz_kod_wy()  odbierająca i zapisująca kody  nadawcze i odbiorcze do tablic  tablica_adres_nad  i  tablica_adres_odb a następnie do do EEPROMu.
Linie 241-252 to wyświetlanie zawartości tablic w widgetach TABLE BLYNKa.
Linia 280 - 289 to czytanie tablic z EEPROPMu po uruchomieniu programu
Procedura routersetup() ląduje w sekcji głównej setup() programu z ustawieniami początkowymi routera a router()  to umieszczona w pętli loop() procedura poolingu obsługi routera

Ot i wsio na ten temat   

I na deser trochę widoków z pierwszych podrygów routera
Tu sposób wprowadzania kodów do tablic. Pierwsza jest tablica kodów wejściowych potem wyjściowych. Procedura wprowadzania uruchamiana jest przyciskiem. Dwukrotny odbiór tego samego kodu powoduje jego zapisanie do pamięci EEPROM na wybranej wcześniej pozycji. Ustawianie tablicy funkcji przebiega inaczej. Na początek musimy wybrać kod wejściowy i wyjściowy. Po przełączeniu się na drugą stronę aplikacji widać wybrane indeksy kodów na dole ekranu (We i Wy). Teraz czas na dowiązanie funkcji routera do pary tych kodów. Z widgetu MENU wybieramy właściwą funkcję a po jej zaakceptowaniu numer funkcji dołącza do indeksów kodów. Teraz już można zapisać ten rekord do tablicy funkcji. Wystarczy nacisnąć wybrany rząd tablicy i po chwili pozycja jest uaktualniona i co ważne zapisana również do EEPROMu.

       
Po resecie procesora następuje czyszczenie tablic w BLYNKu. Stąd ekrany są puste. Pierwsze dane tablic wprowadzone są na sztywno w procedurze setup() (dla celów testowych) a następnie zamienione są na dane odczytane z EEPROM (to efekt skrolowania tablic).

Drugi film to pokaz normalnej pracy routera.


Dla jasności zaprogramowałem funkcje routera początkowo dwoma takimi samymi rekordami a następnie czterema.   Kod <5522769> zamieniany jest na kod <5525844> i w pierwszym przypadku wysyłany jest dwukrotnie a w drugim czterokrotnie. Fajnie się koduje tablicę funkcji widgetem TABLE. Chyba polubimy się na dłużej.

Pozostaje mi złożyć w miarę elegancki układ testowy i rozpocząć testowanie bojem.
Ale to już w następnym dalszym ciągu

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
113

Brak komentarzy:

Publikowanie komentarza