Zum Inhalt springen

Zeitmodul DS3231

Ansicht von 4 Beiträgen - 1 bis 4 (von insgesamt 4)
  • Autor
    Beiträge
  • #6568 Antworten
    Dirk
    Teilnehmer

    Hallo Zusammen,

    ich habe mir ein 16×2-Display gekauft und habe dazu ein Zeitmodul DS3231 und ein Temperaturmodul DHT gesteckt. Das alles an einen Arduino Uno gelötet bzw. gesteckt und folgenden Code geschrieben:

    #include "DHT.h"
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    #include <DS3231.h>
    
    DS3231  rtc(SDA, SCL);
    DHT dht;
    LiquidCrystal_I2C lcd(0x27,16,2);  
    
    Time t;
    void setup()
    {
      dht.setup(2); // data pin 2
      lcd.init();                      // Initialisiert das Display 
      rtc.begin();                     // Initialisiert das Zeitmodul
      //rtc.setTime(21, 40, 0);           //Hiermit kann man die Uhr stellen
      lcd.backlight();
      Serial.begin(115200);
      
       
    }
    
    void loop(){
     
    
      lcd.setCursor(0,0);
      lcd.print(rtc.getDOWStr(2));
      lcd.setCursor(11,0);
      lcd.print(rtc.getTimeStr(1));
      float humidity = dht.getHumidity();
      float temperature = dht.getTemperature();
      lcd.setCursor(0,1);
      lcd.print(temperature, 1); 
      lcd.print("\xDF""C");
      lcd.setCursor(7,1);
      lcd.print(humidity, 1);
      lcd.print("%relF");
     // display_schalten();  //funktioniert noch nicht
      delay(1000);
    }
    
    //Wochentage auslesen
    void display_schalten(){
      t = rtc.getTime();      // Die Zeit auslesen vom DS3231
      int stunde = t.hour;
      int minute = t.min;
      int sekunde = t.sec;
      char *tag = rtc.getDOWStr();
      if (minute = 20){
        lcd.noDisplay();
      }
     Serial.print("Stunde: ");
     Serial.println(stunde);
     Serial.print("Minute: ");
     Serial.println(minute);
     Serial.print("Tag: ");
     Serial.println(tag);
     
    } 
     
    void tag_auslesen(){ 
     String tage = String(rtc.getDOWStr(2));
     if (tage = "Monday") {
      tage = "Montag";
       }
     else if (tage = "Tuesday") {
      tage = "Dienstag";
       }
     else if (tage = "Wednesday") {
      tage = "Mittwoch";
       }
     else if (tage = "Thursday") {
      tage = "Donnerstag";
       }
     else if (tage = "Friday") {
      tage = "Freitag";
       }
     else if (tage = "Saturday") {
      tage = "Samstag";
       }
     else //(tage = "Sunday") {
      tage = "Sonntag";
      // } 
    }

    Leider ignoriert der Uno meinen Wunsch, die Wochentage auf deutsch darzustellen ;-).
    Hat jemand eine Idee warum.
    Das zweite Problem ist das ich eine Zeitschaltung programmieren will, ab 23 Uhr soll das Display mit NoDisplay() ausgehen
    und morgens um 6 Uhr wieder mit Display() angehen. Mein Versuch mit Minute=20 hat nicht geklappt.
    Hat jemand Vorschläge?

    Gruß in die Welt
    Dirk

    #6611 Antworten
    Stefan Hermann
    Administrator

    Hallo Dirk,

    ich weiß es nicht ganz genau, aber einen Fehler hab ich entdeckt. Bei den if-Abfragen musst du ein doppeltes Gleichheitszeichen verwenden. Also statt:

    if (tage = "Monday") {
    tage = "Montag";
    }

    Musst du:

    if (tage == "Monday") {
    tage = "Montag";
    }

    benutzen und das natürlich bei allen ifs.

    Ich hoffe, das hilft schon mal weiter.

    Liebe Grüße

    #6709 Antworten
    Dirk
    Teilnehmer

    Ja, das war der Fehler.
    Mittlerweile klappt alles. Sogar die Zeitschaltung des Displays.
    Vielen Dank.
    Das Sketch sieht jetzt so aus:

    #include "DHT.h"
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    #include <DS3231.h>
    
    // Init the DS3231 using the hardware interface
    DS3231  rtc(SDA, SCL);
    DHT dht;
    LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
    
    Time t;
    String tage;
    void setup()
    {
      dht.setup(2); // data pin 2
      lcd.init();                      // Initialisiert das Display 
      rtc.begin();                     // Initialisiert das Zeitmodul
      //rtc.setTime(21, 40, 0);           //Hiermit kann man die Uhr stellen
      lcd.backlight();
      //Serial.begin(115200);
      lcd.setCursor(0,0);
      lcd.print("Version 27.Nov19");
    }
    
    void loop(){
     
     //delay(dht.getMinimumSamplingPeriod());
      
      lcd.setCursor(0,0);
      //Tage ins deutsche übersetzen
      tage = rtc.getDOWStr(2);
      if (tage == "Monday") {
      tage = "Montag";
       }
     else if (tage == "Tuesday") {
      tage = "Dienstag";
       }
     else if (tage == "Wednesday") {
      tage = "Mittwoch";
       }
     else if (tage == "Thursday") {
      tage = "Donnerstag";
       }
     else if (tage == "Friday") {
      tage = "Freitag";
       }
     else if (tage == "Saturday") {
      tage = "Samstag";
       }
     else if(tage == "Sunday") {
      tage = "Sonntag";
      } 
      lcd.print(tage);
      lcd.setCursor(11,0);
      lcd.print(rtc.getTimeStr(1));
      float humidity = dht.getHumidity();
      float temperature = dht.getTemperature();
      lcd.setCursor(0,1);
      lcd.print(temperature, 1); 
      lcd.print("\xDF""C");
      lcd.setCursor(7,1);
      lcd.print(humidity, 1);
      lcd.print("%relF");
      display_schalten();
      delay(1000);
    }
    
    //Display an und ausschalten
    void display_schalten(){
      t = rtc.getTime();      // Die Zeit auslesen vom DS3231
      int stunde = t.hour;
      int minute = t.min;
      int sekunde = t.sec;
      //Das Display um 4 Uhr morgens einmal löschen, damit der Tag richtig dargestellt wird
      // Weil längere Tagesnamen ihren Namen nicht löschen.
      if (stunde == 4 && sekunde == 5){
        lcd.clear();
      }
     // In der Zeit von 6 Uhr bis 21:59 Display anschalten
     if (stunde > 5 && stunde < 22 ){
      lcd.backlight();
     }
     else if (stunde == 22 && minute == 0){
      lcd.clear();
      delay(100);
      lcd.setCursor(0,0);
      lcd.print("Gute Nacht");
      lcd.setCursor(0,1);
      lcd.print("lieber Dirk");
     }
      // Display ausschalten
      else{
       lcd.noBacklight();
      }
     
    }
    #6735 Antworten
    Stefan Hermann
    Administrator

    Hallo Dirk, danke für die Rückmeldung! Schön, dass es jetzt klappt :-)

Ansicht von 4 Beiträgen - 1 bis 4 (von insgesamt 4)
Antwort auf: Antwort #6735 in Zeitmodul DS3231
Deine Information: