Skip to content

Instantly share code, notes, and snippets.

@karljosefschneider
Last active April 20, 2024 14:39
Show Gist options
  • Save karljosefschneider/da285d275893a9414d18bd7e4e7b53ef to your computer and use it in GitHub Desktop.
Save karljosefschneider/da285d275893a9414d18bd7e4e7b53ef to your computer and use it in GitHub Desktop.
Steuerung eines Treppenlifts über WLAN
// Projekt: KJS Treppenlift
// Datei: KJS_Node_Treppenlift.ino
// Thema: Befehle zur Bedienung des Treppenlifts vom Smartphone per WLAN
// Hardware: NodeMCU 8266, Boardauswahl > Node MCU 1.0
// Autor: Karl-Josef Schneider
// Bearbeitung: erstellt am 24.03.2022, letzte Änderungen am 02.05.2022
//..!....1....!....2....!....3....!....4....!....5....!....6....!....7....!....8....!
// Libraries hinzufügen -------------------------------------------------------------
#include "FS.h" // Lib für das Filesystem
#include <ESP8266WebServer.h> // Lib für den Webserver
#include <ESP8266WiFi.h> // Lib für den Internetzugang
#include <time.h> // Lib für die Uhrzeit
// Variablen deklarieren ------------------------------------------------------------
int EndDach = D1; // Endschalter Dach an D1
int EndEtage = D2; // Endschalter Etage an D2
int EndParterre = D3; // Endschalter Paterre an D3
int EndKeller = D4; // Endschalter Keller an D4
int Auf = D5; // Ausgang für aufwärts = D7
int Ab = D6; // Ausgang für abwärts = D8
int dach=1,etage=1,parterre=1,keller=1; // Status der Etage-Tasten
int auf=1,stopp=1,ab=1; // Status der AUF-STOPP-AB-Tasten
int enddach,endetage,endparterre,endkeller; // Status der Endschalter
int Std, Min, Sek; // Variablen für Uhrzeit
int Sekunde; // Fahrzeit
#define MY_NTP_SERVER "at.pool.ntp.org" // NTP-Server
#define MY_TZ"CET-1CEST,M3.5.0/02,M10.5.0/03" // Sommer-/Winterzeit
time_t now; // Zeitinformation
tm tm; // Struktur tm für Zeitinformation
uint32_t altzeit; // alte Zeit
float Flag = 0; // Flag für Timer
unsigned long Startzeit = 0; // Startzeit für Timer
int Fahrzeit = 0; // Fahrzeit in millisec
int Fahrtende;
int Start; // Startposition des Lifts
ESP8266WebServer server(80); // Server Instanz erstellen
// Startfunktion --------------------------------------------------------------------
void setup() {
Serial.begin(115200); // Start des seriellen Monitors
connect(); // Tab zum Verbinden mit dem WLAN
SPIFFS.begin(); // Filesystem starten
FSzeigen(); // Info anzeigen
configTime(MY_TZ, MY_NTP_SERVER); // Zeitkonfiguration
server.serveStatic("/", SPIFFS, "/index.html"); // Server einrichten
server.on("/daten", sendeDaten); // sende Daten
server.on("/btnclick", getDaten); // empfange Daten
server.onNotFound(handleNotFound); // Fehler bearbeiten
pinMode(EndDach, INPUT_PULLUP); // Endschalter Dachgeschoß Input
pinMode(EndEtage, INPUT_PULLUP); // Endschalter 1.Etage Input
pinMode(EndParterre, INPUT_PULLUP); // Endschalter Parterre Input
pinMode(EndKeller, INPUT_PULLUP); // Endschalter Keller Input
pinMode(Auf,OUTPUT);digitalWrite(Auf,HIGH); // Aufwärts Output auf HIGH
pinMode(Ab,OUTPUT);digitalWrite(Ab,HIGH); // Abwärts Output auf HIGH
} // Ende Startfunktion -----------------------------------------------------------
// Hauptfunktion =====================================================================
void loop(void) {
server.handleClient(); // hier passiert sonst nichts
time(&now); // aktuelle Zeit lesen
localtime_r(&now, &tm); // Zeit-Update der tm-Struktur
if (millis() - altzeit >= 1000) { // im Sekundentakt
altzeit = millis(); // Zeit zurücksetzen
Std = tm.tm_hour; // Stunden
Min = tm.tm_min; // Minute
Sek = tm.tm_sec; } // Sekunden
Endschalter(); // Abfrage der Endschalter
// Fahrt zum Dach .................................................................
if (dach == 0) { // Taste "Dach" gedrückt
if (Start == 2) { // Startposition = Etage
Fahrzeit = 110000; Flag = 1; // Fahrzeit Etage/Dach = 110sec
digitalWrite(Auf, LOW); } // Fahrt aufwärts
if (Start == 3) { // Startposition = Parterre
Fahrzeit = 105000; Flag = 1; // Fahrzeit Parterre/Etage = 105sec
digitalWrite(Auf, LOW); } // Fahrt aufwärts
if (Start == 4) { // Startposition = Keller
Fahrzeit = 80000; Flag = 1; // Fahrzeit Keller/Parterre = 80sec
digitalWrite(Auf, LOW); } } // Fahrt aufwärts
// Fahrt zur Etage ................................................................
if (etage == 0) { // Taste "Etage" gedrückt
if (Start == 1) { // Startposition = Dach
Fahrzeit = 110000; Flag = 1; // Fahrzeit Dach/Etage = 110sec
digitalWrite(Ab, LOW); } // Fahrt abwärts
if (Start == 4) { // Startposition = Keller
Fahrzeit = 80000; Flag = 1; // Fahrzeit Keller/Parterre = 80sec
digitalWrite(Auf, LOW); } // Fahrt aufwärts
if (Start == 3) { // Startposition = Parterre
Fahrzeit = 105000; Flag = 1; // Fahrzeit Parterre/Etage = 105sec
digitalWrite(Auf, LOW); } } // Fahrt aufwärts
// Fahrt nach Parterre ............................................................
if (parterre == 0) { // Taste "Parterre" gedrückt
if (Start == 1) { // Startposition = Dach
Fahrzeit = 110000; Flag = 1; // Fahrzeit Dach/Etage = 110sec
digitalWrite(Ab, LOW); } // Fahrt abwärts
if (Start == 2) { // Startposition = Etage
Fahrzeit = 105000; Flag = 1; // Fahrzeit Etage/Parterre = 105sec
digitalWrite(Ab, LOW); } // Fahrt abwärts
if (Start == 4) { // Startposition = Keller
Fahrzeit = 80000; Flag = 1; // Fahrzeit Keller/Parterre = 80sec
digitalWrite(Auf, LOW); } } // Fahrt aufwärts
// Fahrt zum Keller ...............................................................
if (keller == 0) { // Taste "Keller" gedrückt
if (Start == 1) { // Startposition = Dach
Fahrzeit = 110000; Flag = 1; // Fahrzeit Dach/Etage = 110sec
digitalWrite(Ab, LOW); } // Fahrt abwärts
if (Start == 2) { // Startposition = Etage
Fahrzeit = 105000; Flag = 1; // Fahrzeit Etage/Parterre = 105sec
digitalWrite(Ab, LOW); } // Fahrt abwärts
if (Start == 3) { // Startposition = Parterre
Fahrzeit = 80000; Flag = 1; // Fahrteit Parterre/Keller = 80sec
digitalWrite(Ab, LOW); } } // Fahrt abwärts
// Fahrt aufwärts .................................................................
if (auf == 0) { // Taste aufwärts gedrückt
Fahrzeit = 110000; Flag = 1; // max. Fahrzeit = 110sec
digitalWrite(Auf, LOW); } // Fahrt aufwärts
// Fahrt abwärts ..................................................................
if (ab == 0) { // Taste abwärts gedrückt
Fahrzeit = 110000; Flag = 1; // max. Fahrzeit = 110sec
digitalWrite(Ab, LOW); } // Fahrt abwärts
if (Flag == 1) {Timer();} // Timer starten
} // Ende Hauptfunktion ===========================================================
// Abfrage Endschalter ---------------------------------------------------------------
void Endschalter() {
enddach = digitalRead(EndDach); // Abfrage Endschalter Dach
endetage = digitalRead(EndEtage); // Abfrage Endschalter Etage
endparterre = digitalRead(EndParterre); // Abfrage Endschalter Parterre
endkeller = digitalRead(EndKeller); // Abfrage Endschalter Keller
} // Ende Endschalter -------------------------------------------------------------
// Fahrt-Timer -----------------------------------------------------------------------
void Timer() {
if (millis() <= (Startzeit + Fahrzeit)) { // solange Fahrzeit nicht erreicht
Sekunde = ((millis()-Startzeit)/1000); } // Sekunden zählen
if (millis() > (Startzeit + Fahrzeit)) { // wenn Fahrzeit erreicht
digitalWrite(Auf, HIGH); // Fahrt aufwärts stoppen
digitalWrite(Ab, HIGH); // Fahrt abwärts stoppen
Serial.print("Stop nach ");Serial.print(Fahrzeit/1000); Serial.println(" sec Fahrzeit");
Flag = 0; delay(1000); // Ende Timer, kurze Schaltpause
// Fahrtende = 1; Fahrzeit = 0;
if (enddach == 0) dach = 1; // End-Dach = 0 > Status = 1
if (endetage == 0) etage = 1; // End-Etage = 0 > Status = 1
if (endparterre == 0) parterre = 1; // End-Parterre = 0 > Status = 1
if (endkeller == 0) keller = 1; // End-Keller = 0 > Status = 1
if (keller == 0) { // wenn Keller angewählt
if (Start == 1) { // wenn 1. Startposition = Dach
Start = 2; Startzeit = millis(); } // 2. Startposition = Etage
if (Start == 2) { // wenn 2. Startposition = Etage
if (endparterre == 0) { // wenn Endschalter Parterre = 0
Start = 3; Startzeit = millis(); }} } // 3. Startposition = Parterre
if (parterre == 0) { // wenn Parterre angewählt
if (Start == 1) { // wenn 1. Startposition = Dach
Start = 2; Startzeit = millis(); } } // 2. Startposition = Etage
if (etage == 0) { // wenn Etage angewählt
if (Start == 4) { // wenn 1. Startposition = Keller
Start = 3; Startzeit = millis(); } } // 2. Startposition = Parterre
if (dach == 0) { // wenn Dach angewählt
if (Start == 4) { // wenn 1. Startposition = Keller
Start = 3; Startzeit = millis(); } // 2. Startposition = Parterre
if (Start == 3) { // wenn 2. Startposition = Parterre
if (endetage == 0) { // wenn Endschalter Etage = 0
Start = 2; Startzeit = millis(); }} } // 3. Startposition = Etage
Serial.print("dach = ");Serial.println(dach);
Serial.print("etage = ");Serial.println(etage);
Serial.print("parterre = ");Serial.println(parterre);
Serial.print("keller = ");Serial.println(keller);
Serial.print("Fahrzeit = ");Serial.println(Fahrzeit);
Serial.print("Startposition = ");Serial.println(Start);
if (auf == 0) {auf = 1;}
if (ab == 0) {ab = 1;} } // Status AUF-AB-Tasten setzen
} // Ende Fahrt-Timer -------------------------------------------------------------
// Stop ------------------------------------------------------------------------------
void Stop() {
dach=1; etage=1; parterre=1; keller=1; // Status der Etage-Tasten setzen
auf = 1; ab = 1; // Status AUF-STOPP-AB-Tasten setzen
digitalWrite(Auf, HIGH); // Fahrt aufwärts stoppen
digitalWrite(Ab, HIGH); // Fahrt abwärts stoppen
Fahrzeit = 0; Sekunde=0;
} // Ende Stop --------------------------------------------------------------------
// Funktion Daten ins WLAN senden ----------------------------------------------------
void sendeDaten() {
char sendbuffer[50];
// JSON String als Array anlegen ["20.0","572.6","24.0"]
sprintf(sendbuffer, "[\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\",\"%1u\"]",
Std,Min,Sek,dach,etage,parterre,keller,auf,stopp,ab,enddach,endetage,endparterre,endkeller,Sekunde);
server.send(200, "application/json", sendbuffer);
//Serial.println(sendbuffer);
//Serial.println(strlen(sendbuffer));
} // Ende Daten senden ------------------------------------------------------------
// Daten empfangen und antworten -----------------------------------------------------
void getDaten() {
char state[] = {"0"};
Serial.print("gedrückte Taste "); Serial.print(server.arg(0));
if (server.arg(0)=="1") { // Taste mit Id 1 wurde gedrückt
dach=0; Startzeit = millis(); } // Fahrt zum Dach
if (server.arg(0)=="2") { // Taste mit Id 2 wurde gedrückt
etage=0; Startzeit = millis(); } // Fahrt zur Etage
if (server.arg(0)=="3") { // Taste mit Id 3 wurde gedrückt
parterre=0; Startzeit = millis(); } // Fahrt nach Parterre
if (server.arg(0)=="4") { // Taste mit Id 4 wurde gedrückt
keller=0; Startzeit = millis(); } // Fahrt zum Keller
if (server.arg(0)=="5") { // Taste mit Id 5 wurde gedrückt
auf = 0; Startzeit = millis(); } // Fahrt aufwärts
if (server.arg(0)=="6") {Stop();} // Taste mit Id 6 wurde gedrückt
if (server.arg(0)=="7") { // Taste mit Id 7 wurde gedrückt
ab = 0; Startzeit = millis(); } // Fahrt abwärts
if (enddach == 0) {Start=1;} // Startposition = Dach
if (endetage == 0) {Start=2;} // Startposition = Etage
if (endparterre == 0) {Start=3;} // Startposition = Parterre
if (endkeller == 0) {Start=4;} // Startposition = Keller
server.send(200, "text/plane", state); // Antwort senden
Serial.print(" Status gesendet "); Serial.println(state);
Serial.print("Startposition = ");Serial.println(Start);
} // Ende Daten empfangen und antworten -------------------------------------------
// Fehlerseite -----------------------------------------------------------------------
void handleNotFound() {
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; }
server.send(404, "text/plain", message);
} // Ende Fehlerseite -------------------------------------------------------------
// Filesystem anzeigen ---------------------------------------------------------------
void FSzeigen() {
FSInfo fs_info;
SPIFFS.info(fs_info);
float fileTotalKB = fs_info.totalBytes / 1024.0;
float fileUsedKB = fs_info.usedBytes / 1024.0;
Serial.print("\nFilesystem Total KB "); Serial.print(fileTotalKB);
Serial.print(" benutzt KB "); Serial.println(fileUsedKB);
Dir dir = SPIFFS.openDir("/"); // Dir ausgeben
while (dir.next()) {
Serial.print(dir.fileName()); Serial.print("\t");
File f = dir.openFile("r");
Serial.println(f.size()); }
} // Ende Filesystem --------------------------------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment