#include #include #include #include #include "HTML.h" #define DHTTYPE DHT22 #define DHTPIN  D0 #define EIN LOW #define AUS HIGH String Temp = ""; const char* ssid     = "CSB"; const char* password = "xxxx"; 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; // STATUS für RELAIS 1-4  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;     // WENN Uhrzeit > Schaltzeit.Ein UND Uhrzeit < Schaltzeit.Aus UND Status ????    if (      (thisTime >= schaltRelais[i].ein1 && thisTime < schaltRelais[i].aus1 && status_1 == AUS) ||      (thisTime >= schaltRelais[i].ein2 && thisTime < schaltRelais[i].aus2 && status_2 == AUS) ||      (thisTime >= schaltRelais[i].ein3 && thisTime < schaltRelais[i].aus3 && status_3 == AUS) ||      (thisTime >= schaltRelais[i].ein4 && thisTime < schaltRelais[i].aus4 && status_4 == AUS)    )    {      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");    }    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_3_ON);  server.on("/10", Ereignis_Schalte_3_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_3_ON()       // Wird ausgefuehrt wenn "http:///11.html" z.b. aufgerufen wurde Relais 1 AN - 10.html = Relais 1 AUS {  status_1 = 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_3_OFF()  // Wird ausgefuehrt wenn "http:////0.html" aufgerufen wurde {  status_1 = AUS;  digitalWrite(D4, HIGH);         // GPIO0    Temp = "\r\nWebSchalter";    Temp += "";    Temp += html1;    Temp += "
\r\n\r\n\r\n";  server.send(200, "text/html", Temp); }