I had my test setup running pretty stabile, so i've put it all together in a box, placed my sensors outside and guess what... i see it locking Even though it does work successful for about 15 hours, it stops every night for some reason.
I don't have a good indication of what's going on, i figured that it could be related to the Wifi signal, since it's in a different spot than where i tested before. Or otherwise could it be related to the sensors? I've soldered them to a 3m long (USB) cable.
Below is my (current) sketch, thanks for your ideas!
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <BH1750.h>
// ========================= LED PIN ========================
#define LED_PIN D5 // Led pin
// ======================= DHT11 / 22 =======================
#define DHTPIN D3
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ==================== lightmeter BH1750 ===================
// BH1750 Light Sensor connection: VCC to 5v+ | GND to GND | SCL to pin SCL/D1 | SDA to pin SDA/D2 | ADD not used
BH1750 lightMeter;
// ========================== Wifi ==========================
const char* ssid = "myssid";
const char* password = "mypass";
// ============= Domoticz host address and port =============
const char* host = "192.168.2.100"; // NOTE: There should not be http:// before the address!!!
const int httpPort = 8080;
// =============== Domoticz devices to update ===============
int domoticz_temp_idx = 133;
int domoticz_hum_idx = 167;
int domoticz_lux_idx = 168;
// ==========================================================
void setup(){
Serial.begin(115200);
delay(10);
// starting DHT sensor
dht.begin();
// starting lightMeter BH1750
lightMeter.begin();
WiFi.begin(ssid, password);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("Device IP: ");
Serial.println(WiFi.localIP());
Serial.println("=============================================");
Serial.println("");
}
// ==========================================================
void loop(){
Serial.println("Reading sensors:");
// === DHT22 ===
float hum = dht.readHumidity();
float temp = dht.readTemperature();
int hum_status = 0;
if (isnan(hum) || isnan(temp)) {
Serial.println("Failed to read from DHT sensor!");
return;
} else {
// === TEMPERATURE ===
Serial.print("Temperature: ");
Serial.print(temp);
Serial.println(" degrees Celsius");
// When we set a correction...
// Serial.print("After (-4%) correction, temperature is: ");
// temp = temp*0.96; /* 4 precent correction */
// Serial.print(temp);
// Serial.println(" degrees Celsius");
// === HUMIDITY ===
Serial.print("Humidity: ");
Serial.print(hum);
Serial.println(" Percent");
}
// === BH1750 ===
uint16_t lux = lightMeter.readLightLevel();
int luxnum = lux;
if (isnan(lux)) {
Serial.println("Failed to read from LUX sensor!");
return;
} else {
Serial.print("Lux: ");
Serial.println(lux);
}
Serial.println("");
Serial.println("Update values in Domoticz:");
// Define a new client
WiFiClient client;
unsigned long timeout = millis();
// Get Connected to the Server
if (!client.connect(host, httpPort)) {
Serial.println("[connection failed]");
return;
}
// LED turns on when we connect
digitalWrite(LED_PIN, HIGH);
// === TEMPERATURE ===
Serial.println("Temperature:");
// get url to set temperature
String url = gettempurl(temp, domoticz_temp_idx);
Serial.print("Requesting URL: ");
Serial.println(url);
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
// set the timeout value
int TIMEOUT1 = millis() + 5000;
// Read all the lines of the reply from server and print them to Serial
while(client.available() == 0){
// check for timeout
if (TIMEOUT1 - millis() < 0) {
Serial.println(">>> CLIENT TIMEOUT!");
// Before we exit, turn the LED off.
digitalWrite(LED_PIN, LOW);
client.stop();
return;
}
String line = client.readStringUntil('\r');
Serial.print(line);
}
// Disconnect from the server
client.stop();
Serial.println("");
// Before we exit, turn the LED off.
digitalWrite(LED_PIN, LOW);
delay(500);
// === HUMIDITY ===
// Get Connected to the Server
if (!client.connect(host, httpPort)) {
Serial.println("[connection failed]");
return;
}
// LED turns on when we connect
digitalWrite(LED_PIN, HIGH);
Serial.println("Humidity:");
/* -- Mapping for Humidity_status
* ----------------------------------------------------------------------------------------------------
-- 0 = Normal
-- 1 <> 46-70% = Comfortable
-- 2 < 46 = Dry
-- 3 > 70% = Wet
* ---------------------------------------------------------------------------------------------------- */
if (hum > 0){
if ((hum >= 46) and (hum <= 70)) {
hum_status = 1; /* comfortable */
} else if (hum < 46) {
hum_status = 2; /* dry */
} else if (hum > 70)
hum_status = 3; /* wet */
}
// get url to set humidity
String url_hum = gethumurl(hum, hum_status, domoticz_hum_idx);
Serial.print("Requesting URL: ");
Serial.println(url_hum);
// This will send the request to the server
client.print(String("GET ") + url_hum + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
// set the timeout value
int TIMEOUT2 = millis() + 5000;
// Read all the lines of the reply from server and print them to Serial
while(client.available() == 0){
// check for timeout
if (TIMEOUT2 - millis() < 0) {
Serial.println(">>> CLIENT TIMEOUT!");
// Before we exit, turn the LED off.
digitalWrite(LED_PIN, LOW);
client.stop();
return;
}
String line = client.readStringUntil('\r');
Serial.print(line);
}
// Disconnect from the server
client.stop();
Serial.println("");
// Before we exit, turn the LED off.
digitalWrite(LED_PIN, LOW);
delay(500);
// === LUX ===
// Get Connected to the Server
if (!client.connect(host, httpPort)) {
Serial.println("[connection failed]");
return;
}
// LED turns on when we connect
digitalWrite(LED_PIN, HIGH);
Serial.println("Lux:");
String url_lux = getluxurl(lux, domoticz_lux_idx);
Serial.print("Requesting URL: ");
Serial.println(url_lux);
// This will send the request to the server
client.print(String("GET ") + url_lux + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
// set the timeout value
int TIMEOUT3 = millis() + 5000;
// Read all the lines of the reply from server and print them to Serial
while(client.available() == 0){
// check for timeout
if (TIMEOUT3 - millis() < 0) {
Serial.println(">>> CLIENT TIMEOUT!");
// Before we exit, turn the LED off.
digitalWrite(LED_PIN, LOW);
client.stop();
return;
}
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println("");
// Disconnect from the server
client.stop();
Serial.println("");
// Before we exit, turn the LED off.
digitalWrite(LED_PIN, LOW);
delay(500);
// === PAUZE ===
Serial.println("Waiting 5 mins for next update");
// 5*60 seconds pause (5 minutes)
delay(300000);
Serial.println("");
}
// ==========================================================
String gettempurl(int temperature, int idx){
// this function returns url to set temp_value in domoticz
/* example url for domoticz temperature device:
http://192.168.2.100:8080/json.htm?type=command¶m=udevice&idx=133&nvalue=0&svalue=24
*/
// Create a URI for the request
String url = "/json.htm?type=command¶m=udevice&idx=";
url += idx;
url += "&nvalue=0&svalue=";
url += temperature;
return url;
}
String gethumurl(int humidity, int humstatus, int idx){
// this function returns url to set hum_value in domoticz
/* example url for domoticz humidity device:
http://192.168.2.100:8080/json.htm?type=command¶m=udevice&idx=IDX&nvalue=HUM&svalue=0
*/
// We now create a URI for the request
String url = "/json.htm?type=command¶m=udevice&idx=";
url += idx;
url += "&nvalue=";
url += humidity; // Humidity value
url += "&svalue=";
url += humstatus; // Humidity_status can be: 0=Normal | 1=Comfortable | 2=Dry | 3=Wet
return url;
}
String getluxurl(int lux, int idx){
// this function returns url to set lux_value in domoticz
/* example url for domoticz lux device:
http://192.168.2.100:8080/json.htm?type=command¶m=udevice&idx=IDX&svalue=VALUE
*/
// We now create a URI for the request
String url = "/json.htm?type=command¶m=udevice&idx=";
url += idx;
url += "&svalue=";
url += lux;
return url;
}