ds3231 mit lcd

Mein Problem ist das bei nutzung des ds3231 mein LCD nicht mehr geht. Lösche ich alle zugrife in dem Code wo auf Wire.H zugegriffen wird geht das LCD aber logisch der rest nicht mehr. Nutze Lektion 17 vom Stefan Dräger.

Danke für eure hilfe

Hallo,
sollen wir jetzt für dich auf die Suche nach dem Sketch gehen ?
Wer ist “Stefan Dräger” ?

Den solltest du hier schon posten, damit wir deinen Fehler erkennen können.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Ich bekomme den Code hier nicht rein . Bin mal wieder zu blöd dazu.

Ich nutze den Arduino Micro

Vielen dank für die hilfe

Hier der Code für die Tabletnutzer :wink:

[edit]zuerst falschen Code ohne LCD geposted, sorry [/edit]

#include <LiquidCrystal.h>
#include <Wire.h>
#define RTC_I2C_ADDRESS 0x68 // I2C Adresse des RTC  DS3231

//Membervariablen
int jahr,monat,tag,stunde,minute,sekunde, wochentag;
int daysInMonth[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String daysInWeek[7] = {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
String monthInYear[12] = {"Jan","Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sept", "Okt", "Nov", "Dez"};

String outputLine1 = "";
String outputLine2 = "";

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Ließt den aktuellen Zeitstempel aus dem RTC Modul.
void rtcReadTime(){
  Wire.beginTransmission(RTC_I2C_ADDRESS); //Aufbau der Verbindung zur Adresse 0x68
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(RTC_I2C_ADDRESS, 7);
  sekunde    = bcdToDec(Wire.read() & 0x7f);
  minute     = bcdToDec(Wire.read()); 
  stunde     = bcdToDec(Wire.read() & 0x3f); 
  //Der Wochentag wird hier nicht ausgelesen da dieses mit 
  //dem Modul RTC DS3231 nicht über die Wire.h zuverlässig funktioniert.
  /* wochentag  =*/ bcdToDec(Wire.read());
  tag        = bcdToDec(Wire.read());
  monat      = bcdToDec(Wire.read());
  jahr       = bcdToDec(Wire.read())+2000;    
}

//Funktion zum schreiben / setzen der Uhrzeit.
void rtcWriteTime(int jahr, int monat, int tag, int stunde, int minute, int sekunde){
  Wire.beginTransmission(RTC_I2C_ADDRESS);
  Wire.write(0); // Der Wert 0 aktiviert das RTC Modul.
  Wire.write(decToBcd(sekunde));    
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(stunde));                                  
  Wire.write(decToBcd(0)); // Wochentag unberücksichtigt
  Wire.write(decToBcd(tag));
  Wire.write(decToBcd(monat));
  Wire.write(decToBcd(jahr-2000));  
  Wire.endTransmission();  
}

//Berechnet den Tag der Woche aus dem übergebenen Datumswerten.
byte calcDayOfWeek(int jahr, byte monat, byte tag) {
  static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  jahr -= monat < 3;
  return ((jahr + jahr/4 - jahr/100 + jahr/400 + t[monat-1] + tag) % 7); 
}

//Convertiert Dezimalzeichen in binäre Zeichen.
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

//Convertiert binäre Zeichen in Dezimal Zeichen.
byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

//Ließt einen String und liefert einen Integer Wert von einer 
//definierten Stelle (byte num) des Stringwertes.
int getIntFromString (char *stringWithInt, byte num){
  char *tail; 
  while (num>0){
    num--;
    //Bei Kommanseparierten Listen werden die Kommata 
    //übersprungen und geben damit die Unterteilung des Strings an.
    while ((!isdigit (*stringWithInt))&&(*stringWithInt!=0)){
      stringWithInt++;
    }
    tail=stringWithInt;
    //Schleife solange ausführen bis eine Zahl gefunden wurde
    //welche größer 0 ist.
    while ((isdigit(*tail))&&(*tail!=0)){
      tail++;
    }
   
    if (num>0){
      stringWithInt=tail;
    }
  }  
  return(strtol(stringWithInt, &tail, 10));
}  

//Setup Methode
void setup(){
  lcd.begin(16, 2);            // Einstellen des Displays für Zeilen und Spalten
  Wire.begin(); //Kommunikation über die Wire.h bibliothek beginnen.       
  Serial.begin(57600);  //Übertragungsgeschwindigkeit 9600 Baud
  Serial.println("Mit dem Befehl kann das Datum und die Uhrzeit gesetzt oder veraendert werden.");
  Serial.println("Beispiel: set 28.08.2013 10:54");
}

//Gibt einen Zeitstempel auf der Seriellen Schnittstelle aus.
void printRTCDateTime(){
  int dOW = calcDayOfWeek(jahr, monat, tag);
  String wochentagC = daysInWeek[dOW];
  String monatC = monthInYear[monat-1];

 outputLine1 = "";
 outputLine1 += wochentagC;
 outputLine1 += ", ";
 outputLine1 += tag;
 outputLine1 += ".";
 outputLine1 += monatC;
 outputLine1 += " ";  
 outputLine1 += jahr;
 
 outputLine2 = ""; 
 if(stunde<10) { outputLine2 += "0"; }
  outputLine2 += stunde;
  outputLine2 += ":";
  if(minute<10) {   outputLine2 += "0"; }
  outputLine2 += minute;
  outputLine2 += ":";
  if(sekunde<10) {   outputLine2 += "0"; }
  outputLine2 += sekunde;
}

//Manuelles setzen der Uhrzeit über den Seriellen Monitor der IDE.
void setRTCTime(){
  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
    }
    // Wenn in der gelesenen Zeile das Wort 'set' vorkommt dann...
    //(Hier muss man bedenken das die Suche nach 'set' auch nach x Zeichen ein positives Ergebnis liefern wird, zbsp. 123set 09.01.2016 12:00:00)
    if (strstr(linebuf,"set")==linebuf){ 
      tag=getIntFromString (linebuf,1);
      monat=getIntFromString (linebuf,2);
      jahr=getIntFromString (linebuf,3);
      stunde=getIntFromString (linebuf,4);
      minute=getIntFromString (linebuf,5);
      sekunde=getIntFromString (linebuf,6);
    } else {
      Serial.println("Befehl unbekannt.");
      return;
    }
    // Ausgelesene Werte einer groben Plausibilitätsprüfung unterziehen:
    if (!checkDateTime(jahr, monat, tag, stunde, minute, sekunde)){
      Serial.println(linebuf);
      Serial.println("Fehlerhafte Zeitangabe im 'set' Befehl");
      Serial.println("Beispiel: set 28.08.2013 10:54");
      return;
    }
    rtcWriteTime(jahr, monat, tag, stunde, minute, sekunde);
    Serial.println("Zeit und Datum wurden auf neue Werte gesetzt.");
  }
}

//Prüft das eingegebene Datum auf korrektheit.
boolean checkDateTime(int jahr, int monat, int tag, int stunde, int minute, int sekunde){
   boolean result = false;
   if(jahr>2000){
     result = true;  
   } else {
     return false;
   }
   // Schaltjahr prüfen
   if(jahr % 400 == 0 || (jahr % 100 != 0 && jahr % 4 == 0)){
     //Wenn es ein Schaltjahr ist dann den Wert 29 in das Array an der Stelle 1 für den Monat Februar schreiben.
     daysInMonth[1]=29;
   }
   
   //Monat muss kleiner 13 sein.
   if (monat<13){
      if( tag <= daysInMonth[monat-1] ){
        result = true;
      }
   } else {
     return false;
   }
    
  //Wert für Stunde muss zwischen 0 und 24 liegen,
  //Wert für Minute und sekunde muss zwischen 0 und 59 liegen
  if(stunde <24 && minute <60 && sekunde <60 && stunde >= 0 && minute >=0 && sekunde >=0){
        result = true;
  } else {
     return false;
   }
   
   return result;
}

void loop(){ 
 rtcReadTime();
 printRTCDateTime();
 setRTCTime();
 lcd.setCursor(0, 0);
 lcd.print(outputLine1); 
 lcd.setCursor(0, 1);
 lcd.print(outputLine2); 
 delay(1000);
}

@der_kalle: ein Schaltplan deines Aufbaus wäre evtl auch hilfreich

der_kalle:
Arduino Lektion 17: RealTimeClock RTC DS3231 - Technik Blog

Ich bekomme den Code hier nicht rein . Bin mal wieder zu blöd dazu.

Ich nutze den Arduino Micro

Vielen dank für die hilfe

Steht doch alles oben beschrieben.
Danke Moko.

ahh , kein Quick Reply nutzen. Dann sind auch Schaltflächen da :slight_smile:

http://www.arduino-projekte.de/index.php?n=11

Hoffe der Schaltplan bzw die Tabelle ist zu erkennen. Auf Board pin 2&3 habe ich die Daten Leitung und Spannung na klar vom Board 5V und Ground

Das LCD läuft auch , nur nicht mit dem Code.

Bei dem Link vom Dräger gibt es auch die Serielle Variante , die läuft auch .

Welche LiquidCrystal-Lib benutzt Du? Bitte einen Link dazu. Es gibt mehrere Libs, die gleich heißen.
Das Display ist aber nicht über I2C angeschlossen.

Gruß Tommy

Hallo Kalle,
fünf mal Post´s- fünfmal Müll…
Mache doch erst einmal eines nach dem anderen.

Du hast also einen Arduino und ein LCD?
Dann sorge erst einmal dafür, das dieses LCD fehlerfrei läuft.
Du schreibst also einen Sketch, der z.B. den Text “Ich bin ein TestText” auf dem LCD darstellt.
Wenn Du diesen Sketch geschrieben hast, dann stellt Du ihn, wenn er nicht läuft, hier ins Forum.
CodeTag´s (Editor </>) nicht vergessen. Link zum Display dazu.

Dann könnte Dir vielleicht jemand helfen, und das Display würde funktionieren.
Wenn dem dann so ist…
Dann verbindest Du Deine RTC mit dem Arduino und läßt Dir die richtige Uhrzeit auf dem LCD anzeigen.

Wenn Du diesen Sketch geschrieben hast, dann stellt Du ihn, wenn er nicht läuft, hier ins Forum.
CodeTag´s (Editor </>) nicht vergessen. Link zum Display dazu.

Dann könnte Dir vielleicht jemand helfen, und die RTC würde funktionieren.

Eine Baustelle nach der anderen…
Gruß und Spaß
Andreas
P.S. die Sketche kommen von Dir- ganz bestimmt nicht von uns

Dies ist auch einer der aufgeblasenen Sketches welche ich mir angeschaut habe :frowning:

Die Aussage

//Der Wochentag wird hier nicht ausgelesen da dieses mit
//dem Modul RTC DS3231 nicht über die Wire.h zuverlässig funktioniert.

ist falsch, bei mir funktioniert dies einwandfrei, sowohl schreiben wie lesen.
Vielleicht trifft dies auf die DS1307 RTC zu, auch wenn da DS3231 steht. Die meisten Sketches im Netz scheinen nämlich noch aus der Zeit zu sein als es die DS3231 noch nicht gab.

Ansonsten kann dein Problem natürlich auch an der Verdrahtung liegen.

Gruß

MiReu

der_kalle:
Hoffe der Schaltplan bzw die Tabelle ist zu erkennen. Auf Board pin 2&3 habe ich die Daten Leitung und Spannung na klar vom Board 5V und Ground

Was hilft uns da ein Schaltbild von einer Internetseite.

Du sollst uns das Schaltbild liefern, wie du es aufgebaut hast.
Auch ein Foto deines Aufbaus könnte da helfen.

Ich verstehe allerdings nicht, wieso du nicht mit einer gut dokumentierten (durch Beispiele) RTC-Library arbeitest. Das macht vieles einfacher. Z.B. diese Library.

Dann musst du das mit den Daten an Pin 2 und 3 mal erklären.

der_kalle:
Ich nutze den Arduino Micro

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Pin 2 = SDA
Pin 3 = SCL

Diese Pins dürfen nicht nochmal vom LC-Display verwendet werden, da es keinen I2C-Bus zu haben scheint.

LiquidCrystal lcd(12, 11, 5, 4, 7, 6);

und natürlich umklemmen.

Das LCDs gibt es auch mit I2C-Bus, auch zum Nachrüsten, dann kannst Du es parallel (weil Bus) an I2C (SDA und SCL) hängen.

Auf meinem UNO mit LCD an I2C läuft der Sketch mit LiquidCrystal_I2C.h als Bibliothek.

agmue:
Diese Pins dürfen nicht nochmal vom LC-Display verwendet werden, da es keinen I2C-Bus zu haben scheint.

Großartig, agmue... :-*

Jetzt brauch ich doch mal ne neue Brille.
Bin immer von einem "Pro Mini" ausgegangen, ja wenn man nicht richtig liest.

Ein Foto hätte mich evtl. aufgeweckt.

Das Hauptproblem dürfte hier sein, dass die Pinbelegung Arduino - LCD zwar für UNO , NANO , MINI , MEGA? passt, jedoch NICHT für den MICRO, da dieser eben auf Pin 2/3 die I2C hat.

Darum auch der Hinweis von agmue auf die falsche Pin-Nutzung.

LG Stefan

HotSystems:
Großartig, agmue... :-*

Danke! Aber manchmal liege ich meilenweit daneben und Du zauberst die passende Antwort aus dem Hut. Hauptsache ist doch, am Ende kommen hilfreiche Tipps bei raus :slight_smile:

Nennt sich das Schwarmintelligenz?

agmue:
Nennt sich das Schwarmintelligenz?

Naja... ich würde sagen, wir ergänzen uns hier alle optimal im Forum.

agmue:
Danke! Aber manchmal liege ich meilenweit daneben und Du zauberst die passende Antwort aus dem Hut. Hauptsache ist doch, am Ende kommen hilfreiche Tipps bei raus :slight_smile:

Nennt sich das Schwarmintelligenz?

Deshalb sind wir ja in der Gruppe gut, richtige Antworten zu geben.

Ich schwärme nicht. :wink: :wink: :wink: :wink:

Grüße Uwe