diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..92001b5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +secrets.h \ No newline at end of file diff --git a/MagiQTT-Button.ino b/MagiQTT-Button.ino new file mode 100644 index 0000000..b46068b --- /dev/null +++ b/MagiQTT-Button.ino @@ -0,0 +1,113 @@ +#include +#include +#include "secrets.h" +const int feedButtonPin = 0; +const int publishTimeout = 2000; +const int feedButtonHoldTime = 50; +const String payload = "penni"; +char* topic = "control/button"; +String clientName; + +WiFiClient wifiClient; +PubSubClient client(server, port, callback, wifiClient); + +void callback(char* topic, byte* payload, unsigned int length) { + // handle message arrived +} + +String macToStr(const uint8_t* mac) +{ + String result; + for (int i = 0; i < 6; ++i) { + result += String(mac[i], 16); + if (i < 5) + result += ':'; + } + return result; +} + +void setup() { + pinMode(feedButtonPin, INPUT_PULLUP); + Serial.begin(115200); + delay(10); + 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()); + + // Generate client name based on MAC address and last 8 bits of microsecond counter + clientName += "esp8266-"; + uint8_t mac[6]; + WiFi.macAddress(mac); + clientName += macToStr(mac); + clientName += "-"; + clientName += String(micros() & 0xff, 16); + + Serial.print("Connecting to "); + Serial.print(server); + Serial.print(" as "); + Serial.println(clientName); + + if (client.connect((char*) clientName.c_str())) { + Serial.println("Connected to MQTT broker"); + Serial.print("Topic is: "); + Serial.println(topic); + + if (client.publish(topic, "control/button \"penni\" online")) { + Serial.println("Publish ok"); + } + else { + Serial.println("Publish failed"); + } + } else { + Serial.println("MQTT connect failed"); + Serial.println("Will reset and try again..."); + abort(); + } +} + +void loop() { + checkButton(); +} + +void checkButton() { + if (digitalRead(feedButtonPin) == LOW) { + long feedButtonPressedTime = millis(); + while (digitalRead(feedButtonPin) == LOW) { + if (feedButtonPressedTime + feedButtonHoldTime < millis()) { + if (client.connected()){ + sendMQTTMessage(); + } else { + Serial.println("Disconnected... reconnecting"); + if (client.connect((char*) clientName.c_str())) { + Serial.println("Connected to MQTT broker"); + sendMQTTMessage(); + }; + }; + while (digitalRead(feedButtonPin) == LOW) { + delay(100); + }; //Prevents multiple publishings + } + } + } +} + +void sendMQTTMessage() { + Serial.print("Sending payload: "); + Serial.println(payload); + if (client.publish(topic, (char*) payload.c_str())) { + Serial.println("Publish ok"); + } else { + Serial.println("Publish failed"); + } +}