Last active
April 20, 2024 14:39
-
-
Save karljosefschneider/da285d275893a9414d18bd7e4e7b53ef to your computer and use it in GitHub Desktop.
Steuerung eines Treppenlifts über WLAN
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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