Changeset - ec770b41aaac
[Not reviewed]
tip default
0 1 0
Dennis Fink - 5 years ago 2020-01-15 20:54:18
dennis.fink@c3l.lu
Let the LED flash, when there is an error and the button restarts
1 file changed with 21 insertions and 5 deletions:
0 comments (0 inline, 0 general)
SpaceApiButton.ino
Show inline comments
 
@@ -4,120 +4,136 @@
 
#include <ESP8266HTTPUpdateServer.h>
 
#include <MQTT.h>
 
#include <ArduinoJson.h>
 

	
 
#include "Config.h"
 

	
 
WiFiClient WiFiclient;
 
MQTTClient client;
 
ESP8266WebServer httpServer(80);
 
ESP8266HTTPUpdateServer httpUpdater;
 

	
 
// Variables will change:
 
int buttonState;             // the current reading from the input pin
 
int lastButtonState = LOW;   // the previous reading from the input pin
 
int send_trigger = 0;
 

	
 
// the following variables are unsigned longs because the time, measured in
 
// milliseconds, will quickly become a bigger number than can be stored in an int.
 
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
 
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers
 

	
 
const size_t bufferSize = JSON_OBJECT_SIZE(4) + 70;
 

	
 
void connect() {
 
  digitalWrite(LED_BUILTIN, HIGH);
 
  Serial.print("\nChecking WiFi...");
 
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
 
    Serial.println("Connection Failed! Reboot...");
 
    delay(5000);
 
    digitalWrite(D2, LOW);
 
    digitalWrite(LED_BUILTIN, LOW);
 
    delay(250);
 
    digitalWrite(D2, HIGH);
 
    digitalWrite(LED_BUILTIN, HIGH);
 
    delay(250);
 
    digitalWrite(D2, LOW);
 
    digitalWrite(LED_BUILTIN, LOW);
 
    delay(250);
 
    digitalWrite(D2, HIGH);
 
    digitalWrite(LED_BUILTIN, HIGH);
 
    delay(250);
 
    digitalWrite(D2, LOW);
 
    digitalWrite(LED_BUILTIN, LOW);
 
    delay(4000);
 
    ESP.restart();
 
  }
 
  Serial.println("Connected to WiFi!");
 
  Serial.print("Connected to: ");
 
  Serial.println(WiFi.SSID());
 
  Serial.print("IP: ");
 
  Serial.println(WiFi.localIP());
 
  Serial.print("Connecting to MQTT Server...");
 
  while (!client.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
 
    Serial.print(".");
 
    digitalWrite(LED_BUILTIN, LOW);
 
    delay(1000);
 
    digitalWrite(LED_BUILTIN, HIGH);
 
  }
 
  Serial.println("\nConnected to MQTT!");
 
  client.publish(MQTT_AVAILABILITY_TOPIC, "online", true, 2);
 
  client.subscribe(MQTT_STATE_TOPIC);
 
  digitalWrite(LED_BUILTIN, LOW);
 
}
 

	
 
void on_state_received(String &topic, String &payload) {
 
  StaticJsonDocument<bufferSize> jb;
 
  auto error = deserializeJson(jb, payload);
 

	
 
  if (not error) {
 
    if (jb["open"]) {
 
      digitalWrite(D2, HIGH);
 
    } else {
 
      digitalWrite(D2, LOW);
 
    }
 
  } else {
 
    digitalWrite(D2, LOW);
 
  }
 
}
 

	
 
void handle_root() {
 
  char temp[400];
 
  snprintf(temp, 400, "<html><body>This is the spaceapibutton!</body></html>");
 
  httpServer.send(200, "text/html", temp);
 
}
 

	
 
void setup() {
 
  Serial.begin(115200);
 
  Serial.println("Booting...");
 

	
 
  pinMode(LED_BUILTIN, OUTPUT);
 
  pinMode(D2, OUTPUT);
 
  pinMode(D1, INPUT);
 

	
 
  WiFi.hostname(HOSTNAME);
 
  WiFi.mode(WIFI_STA);
 
  WiFi.begin(WIFI_SSID, WIFI_PASS);
 

	
 
  client.begin(MQTT_SERVER, WiFiclient);
 
  client.setWill(MQTT_AVAILABILITY_TOPIC, "offline", true, 2);
 
  client.onMessage(on_state_received);
 

	
 
  connect();
 

	
 
  Serial.println("Starting MDNS...");
 
  MDNS.begin(HOSTNAME);
 
  Serial.println("Starting HTTP server...");
 
  httpUpdater.setup(&httpServer);
 
  httpServer.on("/", handle_root);
 
  httpServer.begin();
 

	
 
  Serial.println("Adding HTTP server to MDNS...");
 
  MDNS.addService("http", "tcp", 80);
 
  Serial.printf("HTTPUpdateServer ready! Open http://%s.local/update in your browser\n", HOSTNAME);
 

	
 
  pinMode(D2, OUTPUT);
 
  pinMode(D1, INPUT);
 

	
 
}
 

	
 
void loop() {
 
  client.loop();
 
  httpServer.handleClient();
 
  MDNS.update();
 
  delay(10);
 

	
 

	
 
  if (!client.connected()) {
 
    connect();
 
  }
 

	
 
  int reading = digitalRead(D1);
 
  if (reading != lastButtonState) {
 
    lastDebounceTime = millis();
 
  }
 

	
 
  if ((millis() - lastDebounceTime) > debounceDelay) {
 
    digitalWrite(LED_BUILTIN, LOW);
 
    if (reading != buttonState) {
 
      buttonState = reading;
 
      if (buttonState == HIGH) {
 
        send_trigger = 1;
0 comments (0 inline, 0 general)