/* License TBD Christian Moll */ #include #include #include "DHT.h" #include #define DHTTYPE DHT22 #define DHTPIN 4 #define FORCE_DEEPSLEEP const char* host = "esp8266_room1"; // will also be used on shiftr.io const char* ssid = "ssid"; const char* password = "password"; WiFiClient net; MQTTClient mqtt; DHT dht(DHTPIN, DHTTYPE); unsigned int batt; double battV; void connect(); void setup(void){ dht.begin(); Serial.begin(115200); Serial.println(); Serial.println("Booting Sketch..."); WiFi.mode(WIFI_AP_STA); WiFi.begin(ssid, password); mqtt.begin("broker.shiftr.io", net); connect(); Serial.printf("ready!"); } void loop(void){ if(!mqtt.connected()) { connect(); } mqtt.loop(); delay(30000); // time to make reprogramming possible batt = analogRead(A0); battV = mapDouble(batt, 0, 1023, 0.0, 6.6); float h = dht.readHumidity(); float t = dht.readTemperature(); // Check if any reads failed and exit early (to try again). if (!isnan(h) || !isnan(t)) { mqtt.publish("/room1/temp", String(t)); mqtt.publish("/room1/humidity", String(h)); } mqtt.publish("/room1/batt", String(battV)); mqtt.publish("/room1/battRaw", String(batt)); mqtt.publish("/room1/resetReason", ESP.getResetReason()); #ifdef FORCE_DEEPSLEEP Serial.println("Force deepsleep 15min!"); ESP.deepSleep(15 * 60 * 1000000); delay(100); #endif //handle deep sleep depending on battV if (battV < 3.3) { ESP.deepSleep(30 * 1000000); //send IFTTT low_bat warning delay(100); } else if (battV < 4.0) { ESP.deepSleep(2 * 1000000); delay(100); } } void connect() { while(WiFi.waitForConnectResult() != WL_CONNECTED){ WiFi.begin(ssid, password); Serial.println("WiFi failed, retrying."); } Serial.print("IP address: "); Serial.println(WiFi.localIP()); while (!mqtt.connect(host, "shiftr-thing", "shiftr-pass")) { Serial.print("."); } Serial.println("\nconnected!"); } void messageReceived(String topic, String payload, char * bytes, unsigned int length) { Serial.print("incoming: "); Serial.print(topic); Serial.print(" - "); Serial.print(payload); Serial.println(); } double mapDouble(double x, double in_min, double in_max, double out_min, double out_max) { double temp = (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; temp = (int) (4*temp + .5); return (double) temp/4; }