
Artykuł o tym, jak stworzyć programowalny kontroler logiczny z taniego chińskiego urządzenia. Takie urządzenie znajdzie zastosowanie zarówno w automatyzacji domowej, jak i jako materiały do zajęć praktycznych na lekcjach informatyki w szkołach.
Dla informacji, domyślnie program Sonoff Basic działa z aplikacją mobilną przez chińską usługę chmurową, po proponowanej przeróbce, wszystkie dalsze interakcje z tym urządzeniem będą możliwe w przeglądarce.
Sekcja I. Podłączenie Sonoff do usługi MGT24
Krok 1. Tworzenie panelu sterowania
Zarejestruj się na stronie (jeśli jeszcze się nie zarejestrowałeś) i zaloguj się na swoje konto.
Logowanie
Aby stworzyć panel sterowania dla nowego urządzenia, kliknij przycisk „+”.
Przykład tworzenia panelu
Po utworzeniu panelu, pojawi się on na liście twoich paneli.
W zakładce „Instalacja” utworzonego panelu znajdź pola „ID urządzenia” oraz „Klucz autoryzacji”, ta informacja będzie potrzebna do konfiguracji urządzenia Sonoff.
Przykład zakładki
Krok 2. Flashowanie urządzenia
Za pomocą narzędzia wgraj firmware na urządzenie, do tego potrzebny będzie konwerter USB-TTL. Tutaj i .
Krok 3. Konfiguracja urządzenia
Podłącz zasilanie do urządzenia, po zapaleniu diody LED, naciśnij przycisk i trzymaj go wciśniętego, aż dioda zacznie migać w regularnych odstępach.
W tym momencie pojawi się nowa sieć Wi-Fi o nazwie „PLC Sonoff Basic”, połącz swój komputer z tą siecią.
Rozszyfrowanie wskazań diody LED
Wskazania diody LED
Stan urządzenia
okresowe podwójne mignięcie
brak połączenia z routerem
ciągle świeci
połączenie z routerem nawiązane
okresowe równomierne miganie
tryb punktu dostępu Wi-Fi
wyłączone
brak zasilania
Otwórz przeglądarkę internetową i wprowadź w pasku adresu tekst „192.168.4.1”, przejdź do strony ustawień parametrów sieci urządzenia.
Wypełnij pola w następujący sposób:
- „Nazwa sieci” i „Hasło” (do połączenia urządzenia z domowym routerem Wi-Fi).
- „ID urządzenia” i „Klucz autoryzacji” (do autoryzacji urządzenia w usłudze MGT24).
Przykład ustawień parametrów sieci urządzenia
Zapisz ustawienia i zrestartuj urządzenie.
Tutaj .
Krok 4. Podłączenie czujników (opcjonalnie)
Aktualne oprogramowanie obsługuje do czterech czujników temperatury ds18b20. Tutaj znajdziesz instrukcje montażu czujników. Wygląda na to, że ten krok będzie najtrudniejszy, ponieważ wymagać będzie od Ciebie wprawnych rąk i lutownicy.
Rozdział II. Programowanie wizualne
Krok 1. Tworzenie skryptów
Jako środowisko programistyczne używana jest , środowisko jest łatwe w obsłudze, dzięki czemu do tworzenia prostych skryptów nie musisz być programistą.
Dodałem specjalizowane bloki do zapisu i odczytu parametrów urządzenia. Dostęp do każdego parametru odbywa się za pomocą nazwy. Dla parametrów urządzeń zdalnych stosowane są złożone nazwy: „parametr@urządzenie”.
Rozwijana lista parametrów
Przykład skryptu cyklicznego włączania i wyłączania obciążenia (1Hz):

Przykład skryptu synchronizującego pracę dwóch oddzielnych urządzeń. Mianowicie, przekaźnik urządzenia docelowego powtarza działanie przekaźnika urządzenia zdalnego.

Skrypt dla termostatu (bez histerezy):

Aby tworzyć bardziej skomplikowane skrypty, można używać zmiennych, pętli, funkcji (z argumentami) i innych konstrukcji. Nie będę opisywać tego szczegółowo, w sieci już jest sporo .
Krok 2. Kolejność wykonania skryptów
Skrypt działa w trybie ciągłym, a gdy osiągnie koniec, uruchamia się ponownie. Istnieją dwa bloki, które mogą tymczasowo wstrzymać działanie skryptu: „delay” i „pause”.
Blok „delay” jest używany do milisekundowych lub mikrosekundowych opóźnień. Ten blok ściśle przestrzega interwału czasowego, blokując działanie całego urządzenia.
Blok „pause” jest używany do opóźnień w sekundach (może być mniej) i nie blokuje wykonania innych procesów w urządzeniu.
Jeśli skrypt zawiera wewnętrzną pętlę nieskończoną, w której nie ma bloku „pause”, interpreter samodzielnie inicjuje małą pauzę.
W przypadku wyczerpania przydzielonego stosu pamięci, interpreter zatrzyma wykonywanie takiego żarłocznego skryptu (bądź ostrożny z funkcjami rekurencyjnymi).
Krok 3. Debugowanie skryptów
Aby debugować już załadowany do urządzenia skrypt, można uruchomić krokową analizę programu. Jest to niezwykle pomocne, gdy zachowanie skryptu okazało się inne, niż zamierzał autor. W takim przypadku analiza pozwala autorowi szybko znaleźć przyczynę problemu i poprawić błąd w skrypcie.
Skrypt obliczenia silni w trybie debugowania:

Narzędzie debugowania jest bardzo proste i składa się z trzech głównych przycisków: «start», «krok do przodu» i «stop» (nie zapominajmy także o «wejściu» i «wyjściu» z trybu debugowania). Oprócz krokowej analizy można ustawić punkt przerwania w dowolnym bloku (klikając myszką na blok).
Aby wyświetlić bieżące wartości parametrów (czujniki, przekaźniki), użyj bloku «print».
Tutaj o używaniu debuggera.
Sekcja dla ciekawskich. Co kryje się pod maską?
Aby skrypty działały na docelowym urządzeniu, stworzono interpreter bajtowego kodu oraz assembler z 38 instrukcjami. W kodzie źródłowym blockly wbudowano specjalizowany generator kodu, który konwertuje wizualne bloki na instrukcje assemblera. Następnie ten program assemblerowy jest przekształcany w bajtowy kod i przekazywany do urządzenia do wykonania.
Architektura tej maszyny wirtualnej jest dosyć prosta i nie ma sensu jej szczegółowo opisywać, w sieci znajdziesz wiele artykułów na temat projektowania najprostszych maszyn wirtualnych.
Pod stos swojej maszyny wirtualnej zazwyczaj przydzielam 1000 bajtów, co jest wystarczające. Oczywiście, głębokie rekurencje mogą wyczerpać każdy stos, ale raczej nie znajdą praktycznego zastosowania.
Końcowy bajtowy kod jest dość zwarty. Na przykład, bajtowy kod obliczenia tej samej silni wynosi zaledwie 49 bajtów. Oto jego wizualna forma przedstawienia:

A oto jego program assemblerowy:
shift -1
ldi 10
call factorial, 1
print
exit
:factorial
ld_arg 0
ldi 1
gt
je 8
ld_arg 0
ld_arg 0
ldi 1
sub
call factorial, 1
mul
ret
ldi 1
ret
Jeśli forma reprezentacji assemblerowej nie ma żadnej praktycznej wartości, to zakładka «javascript» wręcz przeciwnie, daje bardziej znajomy widok niż wizualne bloki:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
Jeśli chodzi o wydajność. Podczas uruchamiania najprostszego skryptu migającego, na ekranie oscyloskopu uzyskałem meander 47 kHz (przy częstotliwości taktowania procesora 80 MHz).


Uważam, że to niezły wynik, przynajmniej ta prędkość jest prawie dziesięć razy szybsza niż u i .
Część końcowa
Podsumowując, powiem, że zastosowanie skryptów pozwala nam nie tylko zaprogramować logikę działania pojedynczego urządzenia, ale także daje możliwość powiązania kilku urządzeń w jeden mechanizm, gdzie jedne urządzenia wpływają na zachowanie innych.
Zauważę również, że wybrany sposób przechowywania skryptów (bezpośrednio w urządzeniach, a nie na serwerze) ułatwia przełączanie już działających urządzeń na inny serwer, na przykład na domowy Raspberry, tutaj .
Na tym wszystko, będę wdzięczny za wszelkie porady i konstruktywną krytykę.
Źródło: habr.com
