#include #include #include #include #include const int deviceId = 0; bool alarmIsTriggered = false; bool alarmIsArmed = false; bool alarmIsDisarmed = false; bool alarmIsArming = false; bool alarmIsDisarming = false; unsigned long previousBuzzerMillis = 0; unsigned long previousButtonMillis = 0; bool buzzerStatus = false; bool lastButtonState = false; const char *ssid = "PET Aflytningsvogn #43"; const char *password = "zwr33htm"; const char *mqtt_server = "192.168.24.215"; WiFiClient espClient; PubSubClient client(espClient); int buzzerPin = D0; int buttonPin = D5; int lcdColumns = 16; int lcdRows = 2; LiquidCrystal_I2C lcd(0x3f, lcdColumns, lcdRows); void setup_wifi() { delay(10); // We start by connecting to a WiFi network 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.println("IP address: "); Serial.println(WiFi.localIP()); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect("ESP8266Client5")) { Serial.println("connected"); client.subscribe("alarm/state"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void isArming() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Arming"); } void isArmed() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Armed"); } void isDisarmed() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Disarmed"); } void isTriggered() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Triggered"); } void isDisarming() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Disarmed"); } void callback(char *topic, byte *payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); StaticJsonDocument<512> doc; deserializeJson(doc, payload, length); alarmIsTriggered = false; alarmIsArmed = false; alarmIsDisarmed = false; alarmIsArming = false; alarmIsDisarming = false; digitalWrite(buzzerPin, LOW); if (strcmp(doc["status"], "Arming") == 0) { alarmIsArming = true; isArming(); } else if (strcmp(doc["status"], "Armed") == 0) { alarmIsArmed = true; isArmed(); } else if (strcmp(doc["status"], "Disarmed") == 0) { alarmIsDisarmed = true; isDisarmed(); } else if (strcmp(doc["status"], "Disarming") == 0) { alarmIsDisarming = true; isDisarming(); } else if (strcmp(doc["status"], "Triggered") == 0) { alarmIsTriggered = true; isTriggered(); } } void setup() { Serial.begin(115200); lcd.init(); lcd.backlight(); pinMode(buzzerPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); setup_wifi(); client.setCallback(callback); client.setServer(mqtt_server, 1883); reconnect(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); unsigned long currentMillis = millis(); if (currentMillis - previousBuzzerMillis >= 500 && alarmIsTriggered) { digitalWrite(buzzerPin, !buzzerStatus); buzzerStatus = !buzzerStatus; previousBuzzerMillis = currentMillis; } bool buttonState = !digitalRead(buttonPin); if (buttonState != lastButtonState && currentMillis - previousButtonMillis > 500) { previousButtonMillis = currentMillis; if (buttonState) { Serial.println("Button pressed"); DynamicJsonDocument doc(1024); doc["deviceId"] = deviceId; char buffer[1024]; size_t n = serializeJson(doc, buffer); if (alarmIsDisarmed) { client.publish("display/arm", buffer, n); } else { client.publish("display/disarm", buffer, n); } } lastButtonState = buttonState; } }