Automatyka domowa domoticz i arduino [cz.3]

//Automatyka domowa domoticz i arduino [cz.3]

Automatyka domowa domoticz i arduino [cz.3]

2017-01-20T13:47:17+01:00 21 grudnia, 2016|Categories: Automatyka Domowa|Tags: , |

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.

dht

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&param=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&param=switchlight&idx=26&switchcmd=Off"); Serial.println("Jasno"); sendLOG("WIDNO");
 }
 else { bCIEMNO=true;
 
 if (bCIEMNO!=prevCIEMNO) sendGET("/json.htm?type=command&param=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&param=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&param=switchscene&idx=3&switchcmd=On"); delay(1000); }
 } else {
BprzelacznikSALON=!BprzelacznikSALON;
if ((BprzelacznikSALON==true)) { sendGET("/json.htm?type=command&param=switchlight&idx=12&switchcmd=On"); } else { sendGET("/json.htm?type=command&param=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&param=switchlight&idx=13&switchcmd=On"); } else { sendGET("/json.htm?type=command&param=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&param=switchlight&idx=14&switchcmd=On"); } else { sendGET("/json.htm?type=command&param=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&param=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&param=switchlight&idx=18&switchcmd=On"); } else { sendGET("/json.htm?type=command&param=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&param=switchlight&idx=19&switchcmd=On"); } else { sendGET("/json.htm?type=command&param=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&param=switchlight&idx=22&switchcmd=On"); } else { sendGET("/json.htm?type=command&param=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&param=switchlight&idx=30&switchcmd=On"); } else { sendGET("/json.htm?type=command&param=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&param=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&param=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);
}


Facebook - komentarze