Pracę nad systemem zaczniemy od podłączenia przekaźnika do Arduino i sterowania światłem w domu .
Macie wszystko co opisane we wstępie? zaczynamy. W tej części kursu stworzymy część 'webową’ dla arduino oraz obsłużymy żądania http, dzięki którym możemy sterować pinami (idąć dalej – przekaźnikiem). W kolejnej części obsłużymy fizyczne przyciski na ścianach.
Uwaga! Kurs jest pisany przez amatora-początkującego hobbystę. Zapewne wiele rzeczy da się zrobić lepiej/taniej/szybciej itd.. wszelkie uwagi mile widziane.
Uwaga! Przy podłączaniu przekaźnika pracujemy na napięciu 230V. Pamiętaj, aby je skutecznie odciąć! Probówka będzie niezbędna aby uzyskać taką pewność.
Na początek połączmy elementy układu w całość tj. Arduino + Ethernet shield z domoticzem. Może być bezpośrednio skrętką, najlepiej jednak użyć jakiegoś switcha.
Na obrazku powyżej widać ogólną ideę działania systemu. W dużym skrócie – co dzieje się gdy chcemy włączyć światło:
1. przycisk dzwonkowy zwiera masę i pin X w arduino
2. arduino sprawdza stan pinu X. Po wciśnięciu wysyła sygnał do Domoticza, że „przełącznik ścienny Y” został wciśnięty.
3. W przypadku wciśnięcia przełącznika Y domoticz wyzwala akcję (każdy przycisk ma opcję akcji http/url po wciśnięciu lub po wyłaczeniu).
W naszym przypadku będzie to odwołanie do arduino, aby włączył światło Z np. http://iparduino/swiatloZon
4. Arduino parsuje komendy wysyłane na jego własny serwer http. Jeśli znajdzie „swiatloZon” załącza PIN A (przykładowy) który steruje przekaźnikiem 230v. Światło się zapala. Dodatkowo wysyła do domoticza informację, że „żarówka” jest zapalona.
Podłączenie
Nieco bardziej szczegółowy schemat:
Przekaźnik
W przekaźniku od strony logiki przełączającej układu mamy 3 piny: Vcc (+5V), masę GND, sterowanie IN (działa na podanie zasilania). Pin sterujący podłączamy do dowolnego pinu cyfrowego arduino (np. jak w poniższym przykładzie do pinu 22)
Z drugiej strony podłączamy środkowy zacisk z zaciskiem NO (normalnie otwarty). Czyli – przekaźnik jest w stanie rozłączonym dla tego zacisku gdy nie podajemy mu sygnału sterującego wysokiego. Dla domu inteligentnego raczej słuszna opcja.
Sytuacja odwrotna to taka w której jakieś urządzenie ma być rzadko WYŁĄCZANE. Przykład: pompa wody . Kiedy nas zaleje, podajemy sygnał wysoki na przekaźnik pompy wody i rozłączamy zasilanie pompy.
Kilka zdjęć:
przekaźnik pojedynczy
przekaźnik podwójny
Podłączenie przełącznika
Zaczniemy od kodu dla Arduino, który pozwoli na utworzenie serwera HTTP odbierającego dane od Domoticza.
Kod dla Arduino
Wpinamy ethernet shielda w Arduino, dodajemy odpowiednie biblioteki aby komunikacja ethernetowa działała poprawnie.
#include <SPI.h> #include <Ethernet.h>
Definiujemy zmienne globalne które określą parametry naszego serwera http
#define swiatloSalon 22 //definiujemy pod ktory pin w arduino podpięliśmy przekaźnik
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address IPAddress ip(192,168,1,201); // ARDUINO IP W SIECI IPAddress gateway(192,168,1,2); // internet access via router IPAddress subnet(255,255,255,0); //subnet mask IPAddress myserver(192,168,1,200); // DOMOTICZ IP EthernetServer server(84); //PORT ARDUINO EthernetClient client; String readString;
W sekcji setup ustawiamy nasz pin swiatlo salon jako wyjscie (output)
pinMode(swiatloSALON, OUTPUT);
a także uruchamiamy moduł ethernet shield
Ethernet.begin(mac, ip, subnet, gateway); server.begin();
W sekcji loop uruchamiamy nasłuch na porcie 84:
// check for serial input EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read();
//read char by char HTTP request if (readString.length() < 100) {
//store characters to string readString += c; //Serial.print(c); }
//if HTTP request has ended if (c == '\n') {
/////////////// Serial.println(readString); //print to serial monitor for debuging
//now output HTML data header if(readString.indexOf('?') >=0) { //don't send new page client.println("HTTP/1.1 204 pybomatik"); client.println(); // client.println(); } else { client.println("HTTP/1.1 200 OK"); //send new page client.println("Content-Type: text/html"); client.println();
client.println("<HTML>"); client.println("<HEAD>"); client.println("<TITLE>Arduino GET test page</TITLE>"); client.println("</HEAD>"); client.println("<BODY>"); client.stop(); }
delay(1); //stopping client // client.stop();
SprawdzPrzycisk();
} } } }
SprawdzPrzycisk() to funkcja która reaguje na polecenia wysyłane z Domoticza (uwaga! Tu nie chodzi o przełączniki fizyczne na ścianie). Funkcja ta pozwala tylko (lub „aż”) na sterowanie miękkie przez protokół http.
Kod funkcji sprawdzPrzycisk()
void SprawdzPrzycisk(){ ///////// ---------- ODBIERANIE POLECEŃ Z DOMOTICZA VIA URL ///////////////////////////////////--------------------------------------- SWIATLO SALON if(readString.indexOf("swSALONon") >0)//checks for off { digitalWrite(swiatloSALON, LOW); //załącza Pin zdefiniowany jako swiatlo salon (w naszym przypadku pin nr 22) Serial.println("+ WLACZAM SWIATLO W SALONIE!!"); sendGET("/json.htm?type=command¶m=switchlight&idx=3&switchcmd=On"); //w tym przypadku wysyłamy dodatkową informację do domoticza, że zapalamy wybraną "żarówkę". Zapalanie światła będzie działać bez tego kroku. } if(readString.indexOf("swSALONoff") >0)//checks for off { digitalWrite(swiatloSALON, HIGH); Serial.println("- WYLACZAM SWIATLO W SALONIE"); sendGET("/json.htm?type=command¶m=switchlight&idx=3&switchcmd=Off"); } ///////////////////////////////-------------------------------------------- KONIEC SWIATLO SALON
readstring=""; // czyścimy zmienną globalną dla kolejnych odczytów
}
Zadaniem funkcji sendGET jest przesłanie żądania do domoticza.
void sendGET(String url) //client function to send/receie GET request data. { if (client.connect(myserver, 8080)) { // zwroc uwagę na port; jest to domyslny port domoticza, ale mozesz miec inny Serial.println("connected"); client.print("GET "); client.print(url); client.println(" HTTP/1.0"); client.println(); } else { Serial.println("connection failed"); Serial.println(); } Serial.println("stop."); client.stop();
}
Jeśli wszystko poszło dobrze, wystarczy że podłączymy się do tej samej sieci w której działa Arduino i wywołamy adres w przeglądarce:
http://iparduino/swSALONon
np.
http://192.168.1.201:84/swSALONon
W kolejnej części poruszę temat jak reagujemy na przyciski fizyczne (przełączniki na ścianie).
Uwaga! Jeszcze raz przypominam, że napięcie 230V jest niebezpieczne dla zdrowia i życia. Jeśli nie masz pewności tego co robisz – albo odpuść, albo poproś kogoś kto zrobi to bezpiecznie.
Pytania mile widziane.