Automatyka domowa z wykorzystaniem Domoticz i Arduino [cz.1]

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.

schemat ukladu

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:podlaczenie swiatla pod system inteligentny

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

przelacznik

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&param=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&param=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.

część 2

Skomentuj wpis

komentarzy

Comments
  1. Fabian
  2. ami
  3. ami
  4. Marcin Przybysz
  5. Rafal
  6. Rafal
  7. Marcin Przybysz
  8. Rafał
  9. Marcin Przybysz
  10. Marcin Przybysz
  11. Rafal
  12. Marcin
  13. Sylwek
  14. Sylwester Durkiewicz
  15. Marcin Przybysz
  16. Marcin Przybysz
  17. Natalia Kotowicz


maltepe escort