#include #include #include #include #include "HTML.h" #define DHTTYPE DHT22 #define DHTPIN D0 #define EIN LOW #define AUS HIGH String Temp = ""; int status_1 = AUS; int status_2 = AUS; int status_3 = AUS; int status_4 = AUS; const char* ssid = "CSB"; const char* password = "PASSWORT"; float humidity, temp_f; // Values read from sensor String webString =""; int val = 0; // Generally, you should use "unsigned long" for variables that hold time unsigned long previousMillis = 0; // will store last temp was read const long interval = 2000; // interval at which to read sensor DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266 ESP8266WebServer server(80); // Server Port hier einstellen struct schaltRelais_t { byte pin; int ein1; int aus1; int ein2; int aus2; int ein3; int aus3; int ein4; int aus4; }; // D3 = Heizlampe // D4 = Neonlampe // D5 = Strahler // D6 = Nachtlampe schaltRelais_t schaltRelais[4] = { // PIN - VON - BIS // 900 = 9:00 Uhr // 5 = 0:05 Uhr // 20 = 0:20 Uhr {D3, 730, 1100, 1300, 1800}, // Heizlampe {D4, 715, 1900}, // Neonlampe {D5, 700, 1830}, // Strahler {D6, 2100, 2359, 1, 630}, // NACHTLAMPE }; struct timerRelais_t { byte pin; byte dauer; int timer1; int timer2; }; // Hier den Kurzzeittimer definieren timerRelais_t timerRelais = {D6, 90, 2359}; // Timer an Pin-4 für 25 Sekunden um 0830 und 2000 void relaisTimerNachZeit(int thishour, int thisminute) { int thisTime = thishour * 100 + thisminute; if (thisTime == timerRelais.timer1 || thisTime == timerRelais.timer2) { Serial.println("Timer Start"); digitalWrite(timerRelais.pin, EIN); delay(timerRelais.dauer * 1000L); digitalWrite(timerRelais.pin, AUS); Serial.println("Timer Stopp"); } } void relaisSchaltenNachZeit(int thishour, int thisminute) // Schaltet die Zeitschaltuhr ein und aus und setzt den Ausgang entsprechend { boolean state; boolean status_1; boolean status_2; boolean status_3; boolean status_4; // Aus der aktuellen Zeit eine Schaltzeit bilden int thisTime = thishour * 100 + thisminute; // Alle Schaltzeiten durchgehen, falls eine davon EIN sagt, einschalten for (int i = 0; i < sizeof(schaltRelais) / sizeof(schaltRelais_t); i++) { state = AUS; // Amnahme: Es sei nichts geschaltet status_1 = AUS; status_2 = AUS; status_3 = AUS; status_4 = AUS; if ( (thisTime >= schaltRelais[i].ein1 && thisTime < schaltRelais[i].aus1) || (thisTime >= schaltRelais[i].ein2 && thisTime < schaltRelais[i].aus2) || (thisTime >= schaltRelais[i].ein3 && thisTime < schaltRelais[i].aus3) || (thisTime >= schaltRelais[i].ein4 && thisTime < schaltRelais[i].aus4) ) { state = EIN; } if (digitalRead(schaltRelais[i].pin) != state) // Falls geschaltet werden soll { // ein paar Debug-Ausgaben machen Serial.print("Relais "); Serial.print(i + 1); // Relais-Index zählt ab 0, einfach 1 dazuzählen Serial.print(": "); if (state == EIN) Serial.println("EIN"); else Serial.println("AUS"); } if (digitalRead(schaltRelais[1].pin) != status_1) // Falls geschaltet werden soll { digitalWrite(schaltRelais[i].pin, state); // Schaltzustand setzen } } } #include // I2C Adresse der RTC ist 0x68 für DS1307 und DS3231 #define RTC_I2C_ADDRESS 0x68 int jahre, monate, tage, stunden, minuten, sekunden; // wochentag bleibt in diesem Test-Sketch unberücksichtigt void rtcReadTime(int &jahre, int &monate, int &tage, int &stunden, int &minuten, int &sekunden) // aktuelle Zeit aus RTC auslesen { // Reset the register pointer Wire.beginTransmission(RTC_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(RTC_I2C_ADDRESS, 7); // A few of these need masks because certain bits are control bits sekunden = bcdToDec(Wire.read() & 0x7f); minuten = bcdToDec(Wire.read()); stunden = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm /*wochentag = */bcdToDec(Wire.read()); tage = bcdToDec(Wire.read()); monate = bcdToDec(Wire.read()); jahre = bcdToDec(Wire.read()) + 2000; } void rtcWriteTime(int jahre, int monate, int tage, int stunden, int minuten, int sekunden) // aktuelle Zeit in der RTC speichern { Wire.beginTransmission(RTC_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(sekunden)); // 0 to bit 7 starts the clock Wire.write(decToBcd(minuten)); Wire.write(decToBcd(stunden)); // If you want 12 hour am/pm you need to set // bit 6 (also need to change readDateDs1307) Wire.write(decToBcd(0)); // Wochentag unberücksichtigt Wire.write(decToBcd(tage)); Wire.write(decToBcd(monate)); Wire.write(decToBcd(jahre - 2000)); Wire.endTransmission(); } byte decToBcd(byte val) // Hilfsfunktion zum Lesen/Schreiben der RTC // Convert decimal number to binary coded decimal // Hilfsfunktion für die Echtzeituhr { return ( (val / 10 * 16) + (val % 10) ); } byte bcdToDec(byte val) // Hilfsfunktion zum Lesen/Schreiben der RTC // Convert binary coded decimal to decimal number // Hilfsfunktion für die Echtzeituhr { return ( (val / 16 * 10) + (val % 16) ); } int getIntFromString (char *stringWithInt, byte num) // input: pointer to a char array // returns an integer number from the string (positive numbers only!) // num=1, returns 1st number from the string // num=2, returns 2nd number from the string, and so on { char *tail; while (num > 0) { num--; // skip non-digits while ((!isdigit (*stringWithInt)) && (*stringWithInt != 0)) stringWithInt++; tail = stringWithInt; // find digits while ((isdigit(*tail)) && (*tail != 0)) tail++; if (num > 0) stringWithInt = tail; // new search string is the string after that number } return (strtol(stringWithInt, &tail, 10)); } void setup() { Wire.begin(); // initialisiert die Wire-Library Serial.begin(9600); // Serielle Kommunikation starten dht.begin(); // initialize temperature sensor while (!Serial); // wait for serial port to connect. Needed for Leonardo only Serial.println("\r\nZeitschaltuhr- und Kurzzeittimer-Demo Sketch"); Serial.println("Coded by jurs for German Arduino Forum."); Serial.println("Jede Minute wird die aktuelle Zeit im 'Seriellen Monitor' angezeigt."); Serial.println("Ebenso alle Ein- und Ausschaltungen und die Kurzzeittimer-Aktion"); Serial.println(); Serial.println("Du kannst die Zeit mit einem 'set' Befehl im 'Serial Monitor' neu setzen."); Serial.println("\r\nBeispiel:"); Serial.println("set 06.08.2017 10:59\r\n"); for (int i = 0; i < sizeof(schaltRelais) / sizeof(schaltRelais_t); i++) { digitalWrite(schaltRelais[i].pin, AUS); pinMode(schaltRelais[i].pin, OUTPUT); } digitalWrite(timerRelais.pin, AUS); pinMode(timerRelais.pin, OUTPUT); WiFi.begin(ssid, password); Serial.print("\n\r \n\rIch versuche zu Verbinden"); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.print("Verbunden mit "); Serial.println(ssid); Serial.print("IP Adresse: "); Serial.println(WiFi.localIP()); server.on("/", []() { Temp = "\r\nWebSchalter"; Temp += ""; Temp += html1; Temp += "
\r\n\r\n\r\n"; server.send(200, "text/html", Temp); // send to someones browser when asked }); server.on("/11", Ereignis_Schalte_1_ON); server.on("/10", Ereignis_Schalte_1_OFF); server.on("/21", Ereignis_Schalte_2_ON); server.on("/20", Ereignis_Schalte_2_OFF); server.on("/31", Ereignis_Schalte_3_ON); server.on("/30", Ereignis_Schalte_3_OFF); server.on("/41", Ereignis_Schalte_4_ON); server.on("/40", Ereignis_Schalte_4_OFF); server.on("/temp", [](){ // if you add this subdirectory to your webserver call, you get text below :) gettemperature(); // read sensor webString="Temperature: "+String((int)temp_f)+" F"; // Arduino has a hard time with float to string server.send(200, "text/plain", webString); // send to someones browser when asked }); server.on("/humidity", [](){ // if you add this subdirectory to your webserver call, you get text below :) gettemperature(); // read sensor webString="Humidity: "+String((int)humidity)+"%"; server.send(200, "text/plain", webString); // send to someones browser when asked }); server.begin(); Serial.println("HTTP Server gestartet..."); } void behandleSerielleBefehle() { char linebuf[30]; byte counter; if (Serial.available()) { delay(100); // Warte auf das Eintreffen aller Zeichen vom seriellen Monitor memset(linebuf, 0, sizeof(linebuf)); // Zeilenpuffer löschen counter = 0; // Zähler auf Null while (Serial.available()) { linebuf[counter] = Serial.read(); // Zeichen in den Zeilenpuffer einfügen if (counter < sizeof(linebuf) - 1) counter++; // Zeichenzähler erhöhen } // Ab hier ist die Zeile eingelesen if (strstr(linebuf, "set") == linebuf) // Prüfe auf Befehl "set" zum Setzen der Zeit { // Alle übermittelten Zahlen im String auslesen tage = getIntFromString (linebuf, 1); monate = getIntFromString (linebuf, 2); jahre = getIntFromString (linebuf, 3); stunden = getIntFromString (linebuf, 4); minuten = getIntFromString (linebuf, 5); sekunden = getIntFromString (linebuf, 6); } else { Serial.println("Befehl unbekannt."); return; } // Ausgelesene Werte einer groben Plausibilitätsprüfung unterziehen: if (jahre < 2000 || monate < 1 || monate > 12 || tage < 1 || tage > 31 || (stunden + minuten) == 0) { Serial.println(linebuf); Serial.println("\r\nFehlerhafte Zeitangabe im 'set' Befehl"); Serial.println("\r\nBeispiel:"); Serial.println("set 10.08.2017 10:54\r\n"); return; } rtcWriteTime(jahre, monate, tage, stunden, minuten, sekunden); Serial.println("Zeit und Datum wurden auf neue Werte gesetzt."); } } void loop() { server.handleClient(); char buffer[30]; static unsigned long lastMillis; static int lastMinute; int stunden, minuten, sekunden, dummy; if (millis() - lastMillis > 1000) // nur einmal pro Sekunde { lastMillis = millis(); rtcReadTime(dummy, dummy, dummy, stunden, minuten, sekunden); if (minuten != lastMinute) // die aktuelle Minute hat gewechselt { lastMinute = minuten; snprintf(buffer, sizeof(buffer), "%02d:%02d Uhr", stunden, minuten); Serial.println(buffer); relaisSchaltenNachZeit(stunden, minuten); relaisTimerNachZeit(stunden, minuten); } } behandleSerielleBefehle(); } void gettemperature() { // Wait at least 2 seconds seconds between measurements. // if the difference between the current time and last time you read // the sensor is bigger than the interval you set, read the sensor // Works better than delay for things happening elsewhere also unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { // save the last time you read the sensor previousMillis = currentMillis; // Reading temperature for humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor) humidity = dht.readHumidity(); // Read humidity (percent) temp_f = dht.readTemperature(true); // Read temperature as Fahrenheit // Check if any reads failed and exit early (to try again). if (isnan(humidity) || isnan(temp_f)) { Serial.println("Failed to read from DHT sensor!"); return; } } } void Ereignis_Schalte_1_ON() // Wird ausgefuehrt wenn "http:///11.html" z.b. aufgerufen wurde Relais 1 AN - 10.html = Relais 1 AUS { status_1 = EIN; digitalWrite(D3, LOW); // GPIO0 Temp = "\r\nWebSchalter"; Temp += ""; Temp += html1; Temp += "
\r\n\r\n\r\n"; server.send(200, "text/html", Temp); } void Ereignis_Schalte_1_OFF() // Wird ausgefuehrt wenn "http:////0.html" aufgerufen wurde { status_1 = AUS; digitalWrite(D3, HIGH); // GPIO0 Temp = "\r\nWebSchalter"; Temp += ""; Temp += html1; Temp += "
\r\n\r\n\r\n"; server.send(200, "text/html", Temp); } void Ereignis_Schalte_2_ON() // Wird ausgefuehrt wenn "http:///11.html" z.b. aufgerufen wurde Relais 1 AN - 10.html = Relais 1 AUS { status_2 = EIN; digitalWrite(D4, LOW); // GPIO0 Temp = "\r\nWebSchalter"; Temp += ""; Temp += html1; Temp += "
\r\n\r\n\r\n"; server.send(200, "text/html", Temp); } void Ereignis_Schalte_2_OFF() // Wird ausgefuehrt wenn "http:////0.html" aufgerufen wurde { status_2 = AUS; digitalWrite(D4, HIGH); // GPIO0 Temp = "\r\nWebSchalter"; Temp += ""; Temp += html1; Temp += "
\r\n\r\n\r\n"; server.send(200, "text/html", Temp); } void Ereignis_Schalte_3_ON() // Wird ausgefuehrt wenn "http:///11.html" z.b. aufgerufen wurde Relais 1 AN - 10.html = Relais 1 AUS { status_3 = EIN; digitalWrite(D5, LOW); // GPIO0 Temp = "\r\nWebSchalter"; Temp += ""; Temp += html1; Temp += "
\r\n\r\n\r\n"; server.send(200, "text/html", Temp); } void Ereignis_Schalte_3_OFF() // Wird ausgefuehrt wenn "http:////0.html" aufgerufen wurde { status_3 = AUS; digitalWrite(D5, HIGH); // GPIO0 Temp = "\r\nWebSchalter"; Temp += ""; Temp += html1; Temp += "
\r\n\r\n\r\n"; server.send(200, "text/html", Temp); } void Ereignis_Schalte_4_ON() // Wird ausgefuehrt wenn "http:///11.html" z.b. aufgerufen wurde Relais 1 AN - 10.html = Relais 1 AUS { status_4 = EIN; digitalWrite(D6, LOW); // GPIO0 Temp = "\r\nWebSchalter"; Temp += ""; Temp += html1; Temp += "
\r\n\r\n\r\n"; server.send(200, "text/html", Temp); } void Ereignis_Schalte_4_OFF() // Wird ausgefuehrt wenn "http:////0.html" aufgerufen wurde { status_4 = AUS; digitalWrite(D6, HIGH); // GPIO0 Temp = "\r\nWebSchalter"; Temp += ""; Temp += html1; Temp += "
\r\n\r\n\r\n"; server.send(200, "text/html", Temp); }