diff --git a/src/main.cpp b/src/main.cpp index 6960a9d..fb6e8d4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,7 +6,7 @@ const int PIR_PIN=23; const char* ssid = "JoNelsDarlings"; const char* password = "Paris2016"; -const char* mqtt_server = "mqtt.ddns.kawomi.com"; +const char* mqttServerName = "mqtt.ddns.kawomi.com"; WiFiClient espClient; PubSubClient mqttClient(espClient); @@ -37,45 +37,19 @@ void setup_wifi() { Serial.println(WiFi.localIP()); } - -void reconnect() { - // Loop until we're reconnected - while (!mqttClient.connected()) { - Serial.print("Attempting MQTT connection..."); - // Create a random client ID - String clientId = "ESP32Client-"; - clientId += String(random(0xffff), HEX); - // Attempt to connect - if (mqttClient.connect(clientId.c_str())) { - Serial.println("MQTT connected"); - // Once connected, publish an announcement... - } else { - Serial.print("MQTT failed, rc="); - Serial.print(mqttClient.state()); - Serial.println(" try again in 5 seconds"); - // Wait 5 seconds before retrying - delay(5000); - } - } -} - -void send_mqtt(String status, long time_min=0) { +void send_mqtt(String status, long minutes=0) { Serial.print("MQTT Send status "); Serial.print(status); Serial.print(" mins "); - Serial.println(time_min); + Serial.println(minutes); - const size_t CAPACITY = JSON_OBJECT_SIZE(1); - StaticJsonDocument doc; - - // create an object + JsonDocument doc; JsonObject object = doc.to(); object["status"] = status.c_str(); - if (time_min > 0) { - object["minutes"] = time_min; + if (minutes > 0) { + object["minutes"] = minutes; } - // serialize the object and send the result to Serial static char sensorStatus[150]; serializeJson(doc, sensorStatus); Serial.println(sensorStatus); @@ -83,6 +57,34 @@ void send_mqtt(String status, long time_min=0) { mqttClient.publish("Address/Livorno/Kitchen/PIR", sensorStatus, true); } +void reconnect() { + int numRetries=0; + + while (!mqttClient.connected()) { + numRetries++; + Serial.print("Attempting MQTT connection..."); + + // Create a random client ID + String clientId = "ESP32Client-"; + clientId += String(random(0xffff), HEX); + + if (mqttClient.connect(clientId.c_str())) { + Serial.println("MQTT connected"); + } else { + Serial.print("MQTT failed, rc="); + Serial.print(mqttClient.state()); + Serial.println(" try again in 5 seconds"); + + if (numRetries>5){ + Serial.println("Too many retries, restarting the ESP..."); + ESP.restart(); + } + + delay(5000); + } + } + send_mqtt("ready"); +} void setup() { pinMode(LED_BUILTIN,OUTPUT); @@ -90,13 +92,14 @@ void setup() { Serial.begin(115200); setup_wifi(); - mqttClient.setServer(mqtt_server, 1883); - + const int mqttPort=1883; + mqttClient.setServer(mqttServerName, mqttPort); } +const int millisPerSecond=1000; long previousMotionMillis=millis(); -short previousState=digitalRead(PIR_PIN); -long previousNoMoNotifyMins=0; +short previousState=0; +long previousNoMoNotifyMinutes=0; void loop() { if (!mqttClient.connected()) { reconnect(); @@ -112,17 +115,21 @@ void loop() { if (currentState == HIGH) { send_mqtt("motion"); digitalWrite(LED_BUILTIN,HIGH); - delay(5000); - digitalWrite(LED_BUILTIN,LOW); previousMotionMillis=millis(); } previousState = currentState; } - long minsSinceLastMotion=(millis()-previousMotionMillis)/(1000*60); - if ((previousNoMoNotifyMins != minsSinceLastMotion) && (0 != minsSinceLastMotion)) { - send_mqtt("no_motion",minsSinceLastMotion); - previousNoMoNotifyMins = minsSinceLastMotion; + const int secondsPerMinute=60; + long minutesSinceLastMotion=(millis()-previousMotionMillis)/(millisPerSecond*secondsPerMinute); + if ((previousNoMoNotifyMinutes != minutesSinceLastMotion) && (0 != minutesSinceLastMotion)) { + send_mqtt("no_motion",minutesSinceLastMotion); + previousNoMoNotifyMinutes = minutesSinceLastMotion; + } + + const int ledDelaySeconds=5; + if ((millis()-previousMotionMillis)/(millisPerSecond) >= ledDelaySeconds) { + digitalWrite(LED_BUILTIN,LOW); } delay(20);