Kaffeemaschine automatisiert IoT – das Internet der Dinge

Kaffeemaschine mit dem NodeMCU verbessert

Retrofit , eine alte Kaffeemaschine mit einem NodeMCU umgebaut, das sie sich automatisch nach einer einstellbaren Zeit selbst ausschaltet, zusätzlich ist die Abschaltung auch temperaturüberwacht.

Weiterhin hat man die Möglichkeit die Kaffeemaschine mit einer App zu programmieren und den Status abfragen. Man wird benachrichtigt, wenn der Kaffee fertig ist und sieht auf dem Handy die Kaffeetemperatur mit Warmhaltefunktion.

Die Wlan Verbindung der Kaffeemaschine sorgt dafür, dass sie auch ferngeschaltet/überwacht werden kann. Die eingebaute Temperaturüberwachung sendet auch bei einem Brand in der Umgebung der Kaffeemaschine eine Benachrichtigung auf das Handy.

Die Technologie ist heute unter dem Namen IoT (Internet der Dinge) bekannt.

NodeMCU_Box
NodeMCU_Box

Der NodeMCU Controller ist der gleiche aus dem letzten Beitrag. Im letzten Beitrag wurde der NodeMCU mit einem Solarpaneel betireben:
Temperatur Anzeige via Wlan/WIFI auf das Handy

 

WebApp für die IoT Kaffeemaschine
WebApp für die IoT Kaffeemaschine

Hier der Code zum selbst probieren:

//nodeMCU v1.0 (black) with Arduino IDE
#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>

#include <DallasTemperature.h>
#include <OneWire.h>
#define ONE_WIRE_BUS D1

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

char temperatureString[6];
 
const char* ssid = "xxxxxxx";
const char* password = "1234";

int ledPin = 13; // GPIO13 oder D7 Physisch am Board
int ledPinAN_AUS = 4; // GPIO4 oder D2 Physisch am Board
int Relais = 14; // GPIO14 hier ist ein Relais angeschlossen
int buttonPin = 2; // GPIO2 oder D4 Physisch am Board
int buttonState = 0;         // variable for reading the pushbutton status
int value = LOW;
long AusschaltZeit = 600;
long AusschaltZeit_Zaehler = 0;
WiFiServer server(80);

void setup(void){
 
  Serial.begin(9600);
  delay(10);
  AusschaltZeit_Zaehler = 0;
  pinMode(Relais, OUTPUT);
  digitalWrite(Relais, LOW);
  pinMode(buttonPin, INPUT);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("mit Router verbinden: ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("mit WiFi verbunden");
 
  // Start the server
  server.begin();
  Serial.println("Server ist gestartet");
 
  Serial.print("Lokale IP Adresse vom Router bekommen: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP()); 
  Serial.println("/");

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH); // man kann eine LED anschliessen, dann sieht man das das Gerät an ist
  pinMode(ledPinAN_AUS, OUTPUT);
  digitalWrite(ledPinAN_AUS, HIGH); //Diese LED Zeigt ob das Relais an oder aus ist
  
  DS18B20.begin();
}

float getTemperature() {
  float temp;
  do {
    DS18B20.requestTemperatures(); 
    temp = DS18B20.getTempCByIndex(0);
    delay(100);
  } while (temp == 85.0 || temp == (-127.0));
  return temp;
}

void loop() {
  
    // read the state of the pushbutton value:
    buttonState = digitalRead(buttonPin);
    // check if the pushbutton is pressed.
    // if it is, the buttonState is HIGH:
    if (buttonState == HIGH) {
        if (value == HIGH) {
           value = LOW;
           digitalWrite(ledPinAN_AUS, HIGH);
           digitalWrite(Relais, LOW);
          } else {
           value = HIGH;
           digitalWrite(ledPinAN_AUS, LOW);
           digitalWrite(Relais, HIGH); 
          } 
     }
  
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    // wenn kein Client verbunden ist
    AusschaltZeit_Zaehler++;
    delay(1000);
    if(AusschaltZeit_Zaehler >= AusschaltZeit) {
         value = HIGH;
         digitalWrite(Relais, HIGH);
       }
    return; //springe wieder zum Anfang der LOOP
  }

   float temperature = getTemperature();
   dtostrf(temperature, 2, 1, temperatureString);
  
  // ############################################ Button Teil beginn #######
  delay(100);
  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();
  
  // Match the request
    if (request.indexOf("/LED=OFF") != -1)  {
    digitalWrite(Relais, HIGH);
    value = HIGH;
  }
  if (request.indexOf("/LED=ON") != -1)  {
    digitalWrite(Relais, LOW);
    value = LOW;
  }
  // ############################################ Button Teil ende #######
  
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  der darf nicht vergessen werden!
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  //Sagt dem Client, das er sich alle 5 sec. aktualisieren soll
  client.print("<head><meta http-equiv=refresh content=\"5; URL=http://");
  client.print(WiFi.localIP());
  client.println("/\">");
  client.println("<meta name=\"viewport\" content=\"width=device-width, inital-scale=1.0, maxium-scale=1.0, user-scalable=0\"/>");
  client.println("<meta charset=\"utf-8\"/>");
  client.println("</head>");
  client.println("<body>");
  client.print("<h1>");
  client.print(temperatureString);
  client.print(" °C");
  client.print("</h1>");
  // ############################################ Button Teil beginn #######
  client.print("Kaffemaschine ist: ");
  if(value == HIGH) {
    digitalWrite(ledPinAN_AUS, LOW);
    AusschaltZeit_Zaehler = 0;
    client.print("<span style='color: #FF0000; font-weight: bold;'> AUS</span>");
  } else {
    digitalWrite(ledPinAN_AUS, HIGH);
    if(AusschaltZeit_Zaehler >= AusschaltZeit) {
         value = HIGH;
         digitalWrite(Relais, HIGH);
         client.print("<span style='color: #FF0000; font-weight: bold;'> AUS</span>");
       } else {
         client.print("<span style='color: #00FF00; font-weight: bold;'> AN</span>");
      }  
  }
  client.println("<br><br>");
  if (AusschaltZeit_Zaehler != 0) { 
    client.print("Kaffeemaschine schaltet in ");
    if((AusschaltZeit - AusschaltZeit_Zaehler) > 120) {
    client.print((AusschaltZeit - AusschaltZeit_Zaehler) / 60);
    client.println(" min aus");
    } else {
    client.print(AusschaltZeit - AusschaltZeit_Zaehler);
    client.println(" sec aus"); 
    } 
  }
   
  client.println("<br><br>");
  client.println("<a href=\"/LED=ON\"\"><button> Schalte EIN </button></a>");
  client.println("<a href=\"/LED=OFF\"\"><button> Schalte AUS </button></a><br />");  
  // ############################################ Button Teil ende #######
  client.println("</body>");
  client.println("</html>");
 
  AusschaltZeit_Zaehler++;

  digitalWrite(ledPin, LOW); // Hier sieht man wenn der Browser einen Wert liest
  delay(1000);
  Serial.println(temperatureString);
  digitalWrite(ledPin, HIGH); 
}