Po używaniu co prawda jeszcze niepełnego systemu kilka rzeczy wyszło w trakcie eksploatacji, pomysły na usprawnienia. Zamieszczam poprawiony plik Arduino wgrany do mojej płytki (MEGA2560).
Obsługa czujników DHT
Przede wszystkim polecam alternatywną bilbliotekę do obsługi czujników temperatury i wilgotności DHT. Niestety nie pamiętam skąd ją pobrałem oryginalnie więc zamieszczam tutaj.
Sposób deklaracji czujników podejrzycie sobie w moim sketchu (różni się bodajże tym, że zamiast 'begin’ używany 'setup’). Przy oryginalnej bibliotece i 2 czujnikach DHT miewałem częste błędy typu
dht11 start condition 1 not met
Tutaj nie mam tego problemu (być może większe timeout’y w bibliotece?).
Dodano komunikaty do LOG’a domoticz
W łatwy sposób korzystając z Domoticz API dodałem opcję wysyłania tekstów loga gdy np. włączymy Arduino lub zaczytamy temperaturę.
Fotorezystor
Dodano fotorezystor z wysyłaniem zdarzeń do Domoticza. W planach mam sterowanie oświetleniem w podbitce dzięki tej informacji.
A oto sketch wraz z komentarzami:
//vsx.plus // kurs domoticz + arduino #include <SPI.h> // do komunikacji z modułem ethernet #include <Ethernet.h> // moduł ethernet #include <OneWire.h> // do komunikacji z termometrem dallas #include <DallasTemperature.h> // biblioteka termometrów dallas #include <VirtualWire.h> // do komunikacji radiowej (w przyszlosci) #define ONE_WIRE_BUS 5 // bialo pomarancz od T1 #include "DHT.h" // biblioteka sensorów DHTxx #define DHTPIN 9 // SALON wyjście danych sensora jest dołączone Bialo pomarancz // do linii 2 Arduino #define DHTPIN_STRYCH 3 // niebieski #define FOTOREZYSTOR 8 // zielony // deklaracja typu czujnika // #define DHTTYPE DHT22 // DHT22 //#define DHTTYPE DHT11 // DHT11 //#define DHTTYPE_STRYCH DHT11 DHT dht; DHT dhtstrych; ///////////////////// 433 mhz //////////////////////// #define transmit_pin 2 // MAPOWANIE PRZYCISKÓW (PRZEŁĄCZNIKÓW) I INNE INPUTY #define przelacznikBAREK 39 #define przelacznikSALON 40 #define przelacznikJADALNIA 41 #define przelacznikHOL 42 #define przelacznikWIATROLAP 43 #define przelacznikWEJSCIE 44 #define przelacznikTARAS 45 #define przelacznikLEDSALON 46 #define przelacznikCZAJNIK 47 #define pirSCHODYdol 48 #define pirSCHODYgora 49 #define termometrDOL 50 #define termometrDWOR 51 #define termometrSTRYCH 52 #define termometrGORA 53 //MAPOWANIE PRZEKAZNIKOW (swiatla,kontakty) #define swiatloSALON 22 #define swiatloJADALNIA 23 #define swiatloBAREK 24 #define swiatloHOL 25 #define swiatloWIATROLAP 26 #define swiatloWEJSCIE 27 #define roleta1 28 #define roleta2 29 #define roleta3 30 #define swiatloKORYTARZGORA 31 #define swiatloSYPIALNIA 32 #define swiatloLEDSALON 33 #define swiatloTARAS 34 #define swiatloDRZWI 35 #define podlewanie 36 #define swiatloPODBITKA 37 #define gniazdkaKUCHNIA 38 //v OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); 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; bool BprzelacznikSALON=false; bool BprzelacznikJADALNIA=false; bool BprzelacznikBAREK=false; bool BprzelacznikWIATROLAP=true; bool BprzelacznikWEJSCIE=false; bool BprzelacznikHOL=false; bool BprzelacznikTARAS=false; bool bCIEMNO=true; bool prevCIEMNO=false; bool cosWcisniete=false; ////////////////////// unsigned long Timer1 = 0; unsigned long teraz; bool Timer1Active=false; unsigned long termometryTime = 600000; long previousMillis = 0; void setup(){ dht.setup(DHTPIN); dhtstrych.setup(DHTPIN_STRYCH); BprzelacznikSALON=false; // 1. USTAWIENIE ABY PINY STERUJĄCE PRZEKAZNIKAMI BYŁY "WYJŚCIOWYMI" pinMode(swiatloSALON, OUTPUT); //pin selected to control pinMode(gniazdkaKUCHNIA, OUTPUT); pinMode(swiatloJADALNIA,OUTPUT); pinMode(swiatloBAREK,OUTPUT); pinMode(swiatloWIATROLAP, OUTPUT); pinMode(swiatloWEJSCIE,OUTPUT); pinMode(swiatloHOL,OUTPUT); pinMode(swiatloTARAS, OUTPUT); // 2. USTAWIENIE PINÓW WEJSCIOWYCH DLA PRZEŁĄCZNIKÓW FIZYCZNYCH NA ŚCIANACH pinMode(przelacznikSALON ,INPUT_PULLUP); pinMode(przelacznikJADALNIA ,INPUT_PULLUP); pinMode(przelacznikBAREK ,INPUT_PULLUP); pinMode(przelacznikWIATROLAP,INPUT_PULLUP); pinMode(przelacznikWEJSCIE,INPUT_PULLUP); pinMode(przelacznikHOL,INPUT_PULLUP); pinMode(przelacznikTARAS,INPUT_PULLUP); pinMode(FOTOREZYSTOR,INPUT); pinMode(53, OUTPUT); // set the SS pin as an output (necessary!) digitalWrite(53, LOW); // ? (not sure) pinMode(4, OUTPUT); // SD select pin digitalWrite(4, HIGH); // Explicitly disable SD pinMode(10, OUTPUT); // Ethernet select pin digitalWrite(10, LOW); // Explicitly enable Network Ethernet.begin(mac, ip, subnet, gateway); server.begin(); Serial.begin(9600); Serial.println("server/client 1.0 test 2016-10-10"); // keep track of what is loaded // Serial.println("Send an g in serial monitor to test client"); // what to do to test client sensors.begin(); digitalWrite(swiatloSALON, HIGH);delay(200); digitalWrite(swiatloJADALNIA, HIGH);delay(200); digitalWrite(swiatloBAREK, HIGH);delay(200); digitalWrite(gniazdkaKUCHNIA, HIGH);delay(200); digitalWrite(swiatloWIATROLAP, HIGH);delay(200); digitalWrite(swiatloWEJSCIE, HIGH);delay(200); digitalWrite(swiatloHOL, HIGH);delay(200); digitalWrite(swiatloTARAS, HIGH);delay(200); digitalWrite(swiatloWIATROLAP, HIGH);delay(200); digitalWrite(swiatloWEJSCIE, HIGH);delay(500); digitalWrite(swiatloWEJSCIE, LOW); ////////////////// RADIO 433mhz vw_set_tx_pin(transmit_pin); vw_setup(2000); sendGET("/json.htm?type=command¶m=addlogmessage&message=wlaczono_arduino"); } void loop(){ teraz = millis(); unsigned long currentMillis = millis(); // thetime = millis()/1000; if (currentMillis - previousMillis > termometryTime) { sendLOG("ARDU_WEJSCIE_PETLA_TERMOMETRY"); // save the last time you blinked the LED previousMillis = currentMillis; // Serial.print("Od uruchomienia: "); // Serial.print(millis()/1000/60); // Serial.println(" min."); Termometry(); delay(200); sendLOG("tempOK_dht_strych"); delay(500); sprDHT11(dhtstrych,25); delay(200); sendLOG("strychOK_dht_salon"); delay(500); sprDHT11(dht,4); delay(100); if (digitalRead(FOTOREZYSTOR)==LOW) { bCIEMNO=false; if (bCIEMNO!=prevCIEMNO) sendGET("/json.htm?type=command¶m=switchlight&idx=26&switchcmd=Off"); Serial.println("Jasno"); sendLOG("WIDNO"); } else { bCIEMNO=true; if (bCIEMNO!=prevCIEMNO) sendGET("/json.htm?type=command¶m=switchlight&idx=26&switchcmd=On"); Serial.println("Zmrok"); sendLOG("ZMROK");} delay(200); prevCIEMNO=bCIEMNO; sendLOG("SALON_OK_ARDU_WYJSCIE_PETLA_TERMOMETRY"); currentMillis=0; } // check for serial input EthernetClient client = server.available(); int connectLoop =0; 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>Dziala</TITLE>"); client.println("</HEAD>"); client.println("<BODY>Sve dobro!</BODY></HTML>"); client.stop(); } delay(1); ParsujPolecenia(); } } connectLoop++; if(connectLoop > 10000) { Serial.println(); Serial.println(F("Timeout")); client.stop(); } } } SprawdzPrzelacznikiFizyczne(); delay(1); } void Termometry(){ sensors.requestTemperatures(); Serial.println(""); Serial.print("Sensor 1: "); Serial.println(sensors.getTempCByIndex(1)); if (sensors.getTempCByIndex(1)>-40) { String a; a="/json.htm?type=command¶m=udevice&idx=27&nvalue=0&svalue="; a+=sensors.getTempCByIndex(1); sendGET(a); Serial.println("get: "); Serial.println(a); } } ////////////////////////// void SprawdzPrzelacznikiFizyczne(){ // ODBIERANIE SYGNAŁÓW WCIŚNIĘCIA PRZYCISKU PRZEZ ARDUINO I WYSYŁANIE DO DOMOTICZA if (digitalRead(przelacznikSALON)==LOW) { delay(300); sendLOG("ARDU_SWITCH_SALON"); if (digitalRead(przelacznikSALON)==LOW) { delay(1000); if (digitalRead(przelacznikSALON)==LOW) {Serial.println("Dlugo wcisniete!");sendGET("/json.htm?type=command¶m=switchscene&idx=3&switchcmd=On"); delay(1000); } } else { BprzelacznikSALON=!BprzelacznikSALON; if ((BprzelacznikSALON==true)) { sendGET("/json.htm?type=command¶m=switchlight&idx=12&switchcmd=On"); } else { sendGET("/json.htm?type=command¶m=switchlight&idx=12&switchcmd=Off"); } } } if (digitalRead(przelacznikJADALNIA)==LOW) { delay(300); sendLOG("ARDU_SWITCH_JADALNIA"); BprzelacznikJADALNIA=!BprzelacznikJADALNIA; if ((BprzelacznikJADALNIA==true)) { sendGET("/json.htm?type=command¶m=switchlight&idx=13&switchcmd=On"); } else { sendGET("/json.htm?type=command¶m=switchlight&idx=13&switchcmd=Off"); } } if (digitalRead(przelacznikBAREK)==LOW) { delay(300); sendLOG("ARDU_SWITCH_BAREK"); BprzelacznikBAREK=!BprzelacznikBAREK; if ((BprzelacznikBAREK==true)) { sendGET("/json.htm?type=command¶m=switchlight&idx=14&switchcmd=On"); } else { sendGET("/json.htm?type=command¶m=switchlight&idx=14&switchcmd=Off"); } } if (digitalRead(przelacznikWIATROLAP)==LOW) { delay(300); sendLOG("ARDU_SWITCH_WLAP"); if (digitalRead(przelacznikWIATROLAP)==LOW) { delay(1000); if (digitalRead(przelacznikWIATROLAP)==LOW) {Serial.println("Dlugo wcisniete!");sendGET("/json.htm?type=command¶m=switchscene&idx=2&switchcmd=On"); BprzelacznikWIATROLAP=!BprzelacznikWIATROLAP; BprzelacznikHOL=!BprzelacznikHOL; BprzelacznikSALON=!BprzelacznikSALON; BprzelacznikJADALNIA=!BprzelacznikJADALNIA; BprzelacznikBAREK=!BprzelacznikBAREK; delay(1000); } } else { BprzelacznikWIATROLAP=!BprzelacznikWIATROLAP; if ((BprzelacznikWIATROLAP==true)) { sendGET("/json.htm?type=command¶m=switchlight&idx=18&switchcmd=On"); } else { sendGET("/json.htm?type=command¶m=switchlight&idx=18&switchcmd=Off"); } } } if (digitalRead(przelacznikWEJSCIE)==LOW) { delay(300); sendLOG("ARDU_SWITCH_WEJSCIE"); BprzelacznikWEJSCIE=!BprzelacznikWEJSCIE; if ((BprzelacznikWEJSCIE==true)) { sendGET("/json.htm?type=command¶m=switchlight&idx=19&switchcmd=On"); } else { sendGET("/json.htm?type=command¶m=switchlight&idx=19&switchcmd=Off"); } } else if (digitalRead(przelacznikHOL)==LOW) { delay(300); sendLOG("ARDU_SWITCH_HOL"); BprzelacznikHOL=!BprzelacznikHOL; if ((BprzelacznikHOL==true)) { sendGET("/json.htm?type=command¶m=switchlight&idx=22&switchcmd=On"); } else { sendGET("/json.htm?type=command¶m=switchlight&idx=22&switchcmd=Off"); } } if (digitalRead(przelacznikTARAS)==LOW) { delay(300); sendLOG("ARDU_SWITCH_TARAS"); BprzelacznikTARAS=!BprzelacznikTARAS; if ((BprzelacznikTARAS==true)) { sendGET("/json.htm?type=command¶m=switchlight&idx=30&switchcmd=On"); } else { sendGET("/json.htm?type=command¶m=switchlight&idx=30&switchcmd=Off"); } } } void ParsujPolecenia(){ ///////// ---------- ODBIERANIE POLECEŃ Z DOMOTICZA VIA URL ///////////////////// control arduino pin ///////////////////////////////////--------------------------------------- SWIATLO SALON if(readString.indexOf("swSALONon") >0)//checks for on { wlaczSwiatlo(swiatloSALON); Serial.println("+ WLACZAM SWIATLO W SALONIE!!"); } if(readString.indexOf("swSALONoff") >0)//checks for off { wylaczSwiatlo(swiatloSALON); Serial.println("- WYLACZAM SWIATLO W SALONIE"); } ///////////////////////////////-------------------------------------------- KONIEC SWIATLO SALON ///////////////////////////////////--------------------------------------- SWIATLO JADALNIA if(readString.indexOf("swJADALNIAon") >0)//checks for off { wlaczSwiatlo(swiatloJADALNIA); Serial.println("+ WLACZAM SWIATLO W JADALNI!!"); } if(readString.indexOf("swJADALNIAoff") >0)//checks for off { wylaczSwiatlo(swiatloJADALNIA); Serial.println("- WYLACZAM SWIATLO W JADALNI"); } ///////////////////////////////-------------------------------------------- KONIEC SWIATLO JADALNIA ///////////////////////////////////--------------------------------------- SWIATLO JADALNIA if(readString.indexOf("swBAREKon") >0)//checks for off { wlaczSwiatlo(swiatloBAREK); Serial.println("+ WLACZAM SWIATLO W BARKU!!"); } if(readString.indexOf("swBAREKoff") >0)//checks for off { wylaczSwiatlo(swiatloBAREK); Serial.println("- WYLACZAM SWIATLO W BARKU"); } ///////////////////////////////-------------------------------------------- KONIEC SWIATLO JADALNIA ///////////////////////////////////--------------------------------------- SWIATLO wiatrolap if(readString.indexOf("swWIATROLAPon") >0)//checks for off { wlaczSwiatlo(swiatloWIATROLAP); Serial.println("+ WLACZAM SWIATLO W WLAPIE!!"); } if(readString.indexOf("swWIATROLAPoff") >0)//checks for off { wylaczSwiatlo(swiatloWIATROLAP); Serial.println("- WYLACZAM SWIATLO W WLAPIE"); } ///////////////////////////////-------------------------------------------- KONIEC SWIATLO wiatrolap ///////////////////////////////////--------------------------------------- SWIATLO wejscie if(readString.indexOf("swWEJSCIEon") >0)//checks for off { wlaczSwiatlo(swiatloWEJSCIE); Serial.println("+ WLACZAM SWIATLO W wejsciu!!"); } if(readString.indexOf("swWEJSCIEoff") >0)//checks for off { wylaczSwiatlo(swiatloWEJSCIE); Serial.println("- WYLACZAM SWIATLO W wejsciu"); } ///////////////////////////////-------------------------------------------- KONIEC SWIATLO wejscie ///////////////////////////////////--------------------------------------- SWIATLO HOL if(readString.indexOf("swHOLon") >0)//checks for off { wlaczSwiatlo(swiatloHOL); Serial.println("+ WLACZAM SWIATLO W HOLU!!"); } if(readString.indexOf("swHOLoff") >0)//checks for off { wylaczSwiatlo(swiatloHOL); Serial.println("- WYLACZAM SWIATLO W HOLU"); } ///////////////////////////////-------------------------------------------- KONIEC SWIATLO HOL ///////////////////////////////////--------------------------------------- SWIATLO TARAS if(readString.indexOf("swTARASon") >0)//checks for off { wlaczSwiatlo(swiatloTARAS); Serial.println("+ WLACZAM SWIATLO NA TARASIE"); } if(readString.indexOf("swTARASoff") >0)//checks for off { wylaczSwiatlo(swiatloTARAS); Serial.println("- WYLACZAM SW TARAS"); } ///////////////////////////////-------------------------------------------- KONIEC SWIATLO TARAS //clearing string for next read readString=""; } void sendGET(String url) //client function to send/receie GET request data. { if (client.connect(myserver, 8080)) { Serial.print("wyslano "); 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(); } void sendLOG(String url) { String logtxt=""; if (client.connect(myserver, 8080)) { Serial.print("wysylam LOG:"); client.print("GET "); logtxt="/json.htm?type=command¶m=addlogmessage&message="; logtxt+=url; client.print(logtxt); client.println(" HTTP/1.0"); client.println(); Serial.println(url); } else { Serial.println("connection failed"); Serial.println(); } //Serial.println("stop."); client.stop(); Serial.println("Wyslano log."); } void sprDHT11(DHT xht,int devnr) { float t = xht.getTemperature(); // odczyt temperatury float h = xht.getHumidity(); // odczyt wilgotności powietrza // czy odczytano wartości? if (isnan(t) || isnan(h)) { // NIE -> informacja o błędzie Serial.println(">>>>>>>>>>>>>>>>>>>>Blad odczytu danych z czujnika!"); } else { // TAK -> wysyłamy wyniki przez port szeregowy Serial.print("Wilgotnosc: "); Serial.print(h); Serial.print(" % "); Serial.print("Temperatura: "); Serial.print(t); Serial.println(" *C"); String a; a="/json.htm?type=command¶m=udevice&idx="; a+=devnr; a+="&nvalue=0&svalue="; a+=t; a+=";"; a+=h; a+=";0"; sendGET(a); Serial.print("DHT11: "); Serial.println(a); } } void Timer1Start(){ Serial.println("Odpalam Timer1"); Timer1Active=true; Timer1=millis(); } void Timer1Stop(){ Serial.println("zatrzymano T1."); Timer1Active=false; Timer1=0; } void wlaczSwiatlo(int pinnr) { String logtxt=""; digitalWrite(pinnr, HIGH); delay(2); digitalWrite(pinnr, LOW); logtxt="wlaczam_pin_"; logtxt+=pinnr; sendLOG(logtxt); } void wylaczSwiatlo(int pinnr) { String logtxt=""; digitalWrite(pinnr, LOW); delay(2); digitalWrite(pinnr, HIGH); logtxt="wylaczam_pin_"; logtxt+=pinnr; sendLOG(logtxt); } /////////// RADIO 433 mhz void WyslijPolecenie(String urzadzenie,String polecenie) { String toSend = "@"+urzadzenie+"$"+polecenie; //String toSend = ("KUC$128$128$128$255"); // tekst wiadomości char msg[23]; // tworzymy tablicę typu char toSend.toCharArray(msg, toSend.length() + 1); // konwertujemy nasz tekst do tablicy char'ów Serial.println(toSend); vw_send((uint8_t *)msg, strlen(msg));// wysyłamy vw_wait_tx(); delay(1); }