http://viid.me/qyTqNeZapraszam do zabawy.

Pozdrawiam i wesołych świąt.
Projekt sterowania oświetleniem świątecznym
1. Założenia
→ Umożliwienie sterowania poszczególnymi lampkami (4 kanały) przed domem za pośrednictwem sieci.
→ Zabezpieczenie przed przeciążeniem sterownika ilością operacji.
→ Pewne odizolowanie modułu sterownika od wysokiego napięcia prądu zmiennego 230V.
→ Udostępnienie streama obrazu z kamery.
→ Budżet max: 150zł
2. Ogólna zasada działania
Klient łączy się do serwera http (zwykły hosting), na którym postawiona jest aplikacja klienta. Wczytywana jest zawartość strony, w której znajduje się kod JS łączący się z moim routerem za pośrednictwem protokołu ws. Adres mojego routera znajduje się na serwerze dynDNS. Do aktualizacji rekordów DNS wykorzystałem narzędzie ddclient.
W moim LAN znajdują się dwa urządzenia: Laptop o adresie 192.168.1.170 i Sterownik o adresie 192.168.1.171. Przekierowanie portów w routerze wyglądają następująco:
WAN 80 ←→ LAN 11221 (192.168.1.170)
Laptop wystawia serwer, do którego łączy się klient po protokole ws. Jest tam zainstalowany interpreter PHP w wersji 7. Oprogramowanie serwera wykorzystuje bibliotekę Ratchet. Odpowiada za przechowywanie stanów każdego kanału.
Sterownik wystawia serwer, do którego łączy się laptop na porcie 11222. Laptop wysyła do sterownika za pomocą protokołu TCP liczbę stanów kanałów w formacie dziesiętnym z zakresu 0-15. Liczba odpowiada każdej możliwej kombinacji stanów na kanałach. Po zamianie na liczbę binarną otrzymujemy stan dla każdego z kanałów, np. 0011, gdzie 0 oznacza wyłączony.
Stream obrazu obsługiwany jest przez serwer youtube. Laptop streamuje obraz za pomocą ffmpeg do serwera youtube.
3. Sterownik
Sterownik złożony jest na płytce prototypowej z elementów przewlekanych. Wszystkie elementy kosztowały łącznie 70zł nie licząc kosztów starej ładowarki do tableta, która służy jak zasilanie.
Elementy wykorzystane w układzie:
→ Mikrokontroler AtMega8 zasilany z 5V, taktowany 16MHz z programem odbierającym liczbę stanów kanałów za pomocą protokołu rs232 od modułu WiFi i wysyłający odpowiedź po poprawnym przełączeniu stanu rejestru. Liczba stanów jest odwracana (ze względu na budowę modułu przekaźnikowego). Rejestr podłączony jest do modułu przekaźnikowego. Podczas inicjalizacji wysyła do modułu niezbędne komendy AT służące do połączenia się z siecią i uruchomienie serwera TCP.
→ Moduł Wifi ESP8266 zasilany napięciem 3.3V razem z konwerterem poziomów logicznych interfejsu rs232 do mikrokontrolera. Komunikacja rs232 obydwa się z prędkością 115200bps.
→ 4-kanałowy moduł przekaźnikowy zasilany z 5V z przekaźnikami SRD-05VDC-SL-C oraz transoptorami EL817. Stan niski na wejściu każdego z kanałów załącza transoptor, który z kolei załącza przekaźnik. Do każdego z przekaźników podłączone są lampki zasilanie ~230V.
→ Kondensatory 4x100nF, 2x47uF; Stabilizator napięcia LD1117T w obudowie TO220; 8 diod LED (różne kolory) do sygnalizacji stanów na modułach.
4. Laptop
Na laptopie uruchomiona jest usługa która nasłuchuje na porcie 11221 za pomocą protokołu ws. Klienci wysyłają i odbierają dane w postaci JSONa. Przy każdej zmianie stanu wysyłana jest do sterownika liczba stanów kanałów.
Oczekiwanie na odpowiedź sterownika sygnalizującą wprowadzenie liczby stanów do rejestru. W trakcie oczekiwania odpowiada innym klientom na rządania zmiany stanu sygnałem busy oznaczającym zajętość. Jeśli klient zbyt często powoduje sygnał busy zostaje odłączony (połączenie zostaje zerwane i wyświetla się mu stosowny komunikat).
Stream odbywa się za pomocą narzędzia ffmpeg i protokołu rtmp oraz serwerów youtube.
Na streamie obrazu występuje ok. 10s. opóźnienie.
Jest to spowodowane przetwarzaniem strumienia przez serwer youtube. Jednak same zmiany stanów wprowadzane są ze średnio 300ms. opóźnieniem.