I²C - Probleme

Hallöle :slight_smile:

Ich habe da ein Problem mit dem I²C-Bus…eine RTC DS3231 Adresse 0x68 und einer LCD/VFD(ist im Wesentlich gleich mit den Befehlen/Daten) Adresse 0x27. Jedes Teil für sich allein macht was es soll am Bus, auch wenn beide gleichzeitig dranhängen, sehr kurze Leitungen und 2,7k Pullups. Die Zeit über den seriellen Port ausgeben…kein Problem, über die LCD “Hello world!” schreiben auch nicht. Aber die RTC_Daten auf das Display zu bringen geht schief. Sowie nur irgendein Commando an die LCD spielt die RTC oder der Bus verrückt…statt der Zeit, Monat, Tag und Datum kommt folgendes raus:

27:85:85
52785.85.2165

Ich habe beie einem Projekt problemlos einen Feuchtigkeitssensor, einen Drucksensor und eine Expansionsplatine(8 Ausgänge) dran ohne Probleme und dabei ist bdas Sensorkabel noch gute 2,5m lang(mit I²C-Extender-Chip)
Und so sieht der Sketch aus:

#include <LiquidCrystal_I2C.h>
#include <DS1307.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display

// Init the DS1307
DS1307 rtc(20, 21);

void setup()
{

lcd.init();

// Set the clock to run-mode
rtc.halt(false);

// Setup LCD to 20x4 characters
lcd.begin(20, 4);

// The following lines can be commented out to use the values already stored in the DS1307
// rtc.setDOW(SUNDAY); // Set Day-of-Week to SUNDAY
// rtc.setTime(14, 0, 0); // Set the time to 12:00:00 (24hr format)
// rtc.setDate(16, 10, 2015); // Set the date to October 3th, 2010

// Set SQW/Out rate to 1Hz, and enable SQW
rtc.setSQWRate(SQW_RATE_1);
rtc.enableSQW(true);
}

void loop()
{
// Display time centered on the upper line
lcd.setCursor(6, 0);
lcd.print(rtc.getTimeStr());

// Display abbreviated Day-of-Week in the lower left corner
lcd.setCursor(3, 1);
lcd.print(rtc.getDOWStr(FORMAT_SHORT));

// Display date in the lower right corner
lcd.setCursor(6, 1);
lcd.print(rtc.getDateStr());

// Wait one second before repeating :slight_smile:
delay (1000);
}

Wo mache ich einen Fehler? Danke für Eure Hilfe!

Grüße, Steffen

Ich kenne die Library nicht, die du für die RTC verwendest. Wie alt ist die?
Hast du schon mal eine andere Lib versucht, z.B. diese: “RTClib.h”
Eine andere Idee habe ich nicht.

Input_de:
Wo mache ich einen Fehler? Danke für Eure Hilfe!

Deine DS1307 Library verwendet offenbar NICHT die Wire-Library:

DS1307 rtc(20, 21);

Stattdessen scheint diese DS1307 Library eigene Steuerfunktionen für die I2C-Ansteuerung zu verwenden, die zur standardmäßigen Wire-Library inkompatibel sind.

Abhilfe wäre: Für alle I2C-Geräte auf dem Bus dieselbe Library zur Ansteuerung verwenden, also üblicherweise die zur Arduino-IDE mitgelieferte Wire-Library.

Also für die RTC entweder den I2C-Bus selbst mit Hilfe der Wire.h Library ansteuern.
Oder eine andere RTC-Library verwenden, die die Wire-Library verwendet.
(Erkennbar daran, dass die RTC-Library <Wire.h> inkludiert.)

Du kannst Dir nicht überall inkompatiblen Scheiß zusammensuchen und dann mit “Prinzip Hoffnung” darauf setzen, dass all die ganzen inkompatiblen Sachen ausgerechnet in Deinem Sketch kompatibel zusammenarbeiten.

Danke erstmal für die Antworten!
@jurs...dem inkompatiblen Scheiß steht es nicht auf der Stirn geschrieben, daß er inkompatibel ist und solange keine Fehlermeldung erscheint wirst auch Du nicht an Inkompatibilität denken. 2. DS1307 rtc(20,21) ist die Erstellung der Klasse mit der Definierung der I²C Pins vom Arduino Mega und 3. Die DS1307 Bibliothek ist von Henning Karlsen, der wohl eher keine Sonderfunktionen verwendet.
Trotzdem werde ich das kontrollieren, weil "nichts ist unmöglich"

Nimm die:

Die funktioniert ganz sicher mit dem Display zusammen.

Guten Morgen @all

Danke für die Tips! @jurs…Du hattest Recht, diese Bibliothek verwendet nicht <Wire.h>…wieder was gelernt :wink:
Ich habe jetzt mehrere Bibliotheken ausprobiert, einiges im Netz gefunden aber 80% davon lassen nichtmal die Compilierung ihrer eigenen Examples zu… Endlose Fehlermeldungen wegen nicht declarierten Funktionen oder Argumenten…
@HotSystems…ebenso Deine vorgeschlagene Bibliothek…Compilierungsfehler der eigenen Examples
Vielleicht sollte ich noch erwähnen, sorry, hab ich bisher vergessen, ich habe sowohl die IDE 1.05, 1.06 und auch die 1.6.5 versucht…ebenso die Ergänzung in den Bibliotheken, die <Arduino.h> und <Wprogram.h>, je nach Version der IDE, nutzen sollen.
Langsam gehen mir hier die Ideen aus, da ich auch nicht unbedingt der Profi im Programmieren bin.

Aber trotzdem Dank für Eure Hilfe
Gruß
Steffen

Also die von mir verlinkte RTCLib tut es seit einiger Zeit problemlos.

Du musst natürlich deinen Code daraufhin anpassen.

Sieh dir das in den Beispielen an. Wenn du ein Beispiel aufbaust, wirst du sehen, es funktioniert.
Am Besten, du nimmst nur die RTC und das LCD per I2C.

Wenn es nicht funktioniert, machst du irgend etwas falsch. :wink:

Ich hab versucht, die Beispiele aus diesem, von Dir verlinkten Paket zu Testzwecken zu compilieren, schon damit bekomme ich Fehlermeldungen wie z.B.: byte was not declared in this scope oder byte was not a name...usw...
Da habe ich meinen Scetch noch gar nicht geladen, geschweige denn angepasst...einfach nur das Beispiel zum Auslesen der Uhr, Ausgabe seriell wird mit diesen Fehlern abgebrochen :o

Input_de:
Ich hab versucht, die Beispiele aus diesem, von Dir verlinkten Paket zu Testzwecken zu compilieren, schon damit bekomme ich Fehlermeldungen wie z.B.: byte was not declared in this scope oder byte was not a name...usw...
Da habe ich meinen Scetch noch gar nicht geladen, geschweige denn angepasst...einfach nur das Beispiel zum Auslesen der Uhr, Ausgabe seriell wird mit diesen Fehlern abgebrochen :o

Schade, dass du uns nicht die ganze Fehlermeldung zeigst. Da kann man sicher rauslesen, wo das Problem liegt.

Schade, dass du uns nicht die ganze Fehlermeldung zeigst.

Das bedauere ich auch....

Ich erkläre mir das so:
Natürlich ist man irgendwie enttäuscht, wenn was nicht klappt.
Emotionen kochen...
Die Enttäuschung, das Leid, und was auch sonst noch.....
Irgendwie verhindert die Konzentration auf des Leid, das zielorientierte handeln, sprechen, denken.
Und das, obwohl man genau weiß, dass man wieder was gelernt hat, wenn das Problem gelöst ist.

Ich weiß, dass man Probleme auch lösen kann, indem man darüber redet, gerade im sozialen Bereich. Solange drüber reden, bis sich das Problem verändert, oder die Sicht auf die Dinge. Klappt ganz gut.

Leider ist diese Vorgehensweise in der Technik nicht immer Sinnvoll. Klar ist da auch reden ganz wichtig. Zumindest bis man das Problem verstanden hat.
Aber viel geht auch über die Analyse der beteiligten Komponenten. Und dazu ist eine klare Sprache notwendig.
Jammern und heulen lenkt ab.
Klare Daten bringen weiter.
Schaltpläne, Bauteilbezeichnungen, links zu Datenblättern, komplette Fehlermeldungen usw.

:o Danke, dass ich mich hier ausheulen durfte :o

Input_de:
Ich habe jetzt mehrere Bibliotheken ausprobiert, einiges im Netz gefunden aber 80% davon lassen nichtmal die Compilierung ihrer eigenen Examples zu... Endlose Fehlermeldungen wegen nicht declarierten Funktionen oder Argumenten...

Auch wenn Du es nicht explizit schreibst, scheinst Du ein DUE Board zu verwenden, und in dem Fall, dass Du so ein Exoten-Board verwendest, müßtest Du bei der Auswahl der Library natürlich auch explizit darauf achten, dass die verwendete Library zu diesem Board auch kompatibel ist.

Die Einsteiger-Boards bei Arduino sind 8-Bit Controller Boards (UNO, MEGA, LEONARDO etc.) und viele Drittanbieter von Libraries schreiben ihre Libraries nur für 8-Bit-Controller, ohne sich um Adaptionen an 32-Bit Controller-Boards weiter zu kümmern.

Wenn bei Arduino-Libraries von Drittanbietern nichts weiter dabeisteht, kannst Du erstmal nur von einer Kompatibilität zu den 8-Bit Atmega Boards ausgehen (z.B. UNO, MEGA, LEONARDO etc.), und wenn spezielle Controller-Hardware verwendet wird (z.B. der I2C-Bus), müßtest Du auf DUE-Kompatibilität der Library achten, wenn Du ein DUE-Board verwendest. Im speziellen Fall I2C wäre auch zu prüfen, welcher der beiden I2C Busse des DUE unterstützt wird, oder vielleicht sogar beide. Denn während alle 8-Bit Atmegas nur einen einzigen I2C-Bus haben, hat der DUE davon gleich zwei Stück, und ggf. müssen Beispielprogramme angepasst werden, z.B. von "Wire" auf "Wire1".

scheinst Du ein DUE Board zu verwenden,

Da wäre ich ja so nie drauf gekommen....

Ups, jetzt wollte ich gerade den Fehler bei mir suchen. :grin:
Ich habe nochmal ne andere Lib rausgesucht, die auch bei mir gut funktioniert.
Das hat sich dann wohl erübrigt.

Nur für den Fall: GitHub - JChristensen/DS3232RTC: Arduino Library for Maxim Integrated DS3232 and DS3231 Real-Time Clocks

Diese tut es in jedem Fall auf einem Uno oder kompatibel, gerade noch probiert.

Edit:
In einem früheren Post des TO war bei diesem Display von einem Mega die Rede.

HotSystems:
Edit:
In einem früheren Post des TO war bei diesem Display von einem Mega die Rede.

In dem Fall, dass sich die geschilderten Probleme mit den Programmbeispielen auf ein MEGA2560 Board beziehen, sollte der Problemverursacher sich vielleicht nochmal darüber informieren, wie man eine Drittanbieter-Library korrekt installiert:

Compile-Fehler beim Compilieren von nachinstallierten Drittanbieter-Libraries können eigentlich nur wenige Ursachen haben:

  • Library wurde nicht korrekt installiert (falscher Library-/Dateipfad)
  • falsche Boardeinstellung oder nicht unterstütztes Board
  • die Library war für eine ältere IDE/Compiler-Version gemacht und wird von einer neueren IDE nicht unterstützt

OK, OK...Ihr habt ja Recht...in einigen Dingen...Keine Beschreibung der Hardware, keine genauen Fehlermeldungen...sorry Ich versuch das jetzt mal zu korrigieren:

Also, nein ich verwende keinen DUE, obwohl ich einen hab ;), und es ist ein MEGA 128(der schien mir erstmal ausreichend für meine Bedürfnisse zuhause und auf Arbeit). Was die Fehlermeldungen betrifft: Ich habe gestern und heute vom Firmenrechner aus geantwortet und dort habe ich leider die Fehlermeldungen nicht parat, ich reiche sie heute nach, wenn ich mich drangemacht habedie Bibliotheken alle nochmal ranzunehmen...das wird dann sicher viel. Und ja, ich weiß wie man Bibliotheken von Drittanbietern installiert, ist nicht das erste Mal :wink: Die Pfade sind korrekt und auch die Board-Einstellungen stimmen aber es gibt natürlich auch Probleme schon durch die unterschiedlichen IDE-Versionen. So, das erstmal noch als Erklärung. Ich werde Mich jetzt nochmal ransetzen und Versuche starten und die Fehlermeldungen kopieren :slight_smile:

Ich habe das Beispiel von John Boxall verwendet, da es ohne Bibliothek (außer Wire) auskommt. Das mag mein Compiler (IDE 1.6.5) auch für den Mega 2560:

Der Sketch verwendet 5.114 Bytes (2%) des Programmspeicherplatzes. Das Maximum sind 253.952 Bytes.
Globale Variablen verwenden 486 Bytes (5%) des dynamischen Speichers, 7.706 Bytes für lokale Variablen verbleiben. Das Maximum sind 8.192 Bytes.

Die Bibliothek von J. Christensen...die Bibliothek Streaming.h kann man nicht mehr runterladen...auf die Seite kommt man nicht "Fehler 403-forbidden"

Arduino: 1.6.5 (Windows 8.1), Platine: "Arduino/Genuino Mega or Mega 2560, ATmega1280"

Build-Optionen wurden verändert, alles wird neu gebautSetSerial.ino:36:75: fatal error: Streaming.h: No such file or directory
compilation terminated.
Fehler beim Kompilieren.

Arduino: 1.6.5 (Windows 8.1), Platine: "Arduino/Genuino Mega or Mega 2560, ATmega1280"

Build-Optionen wurden verändert, alles wird neu gebautIn file included from D:\Program Files (x86)\Arduino\libraries\Time\DateStrings.cpp:11:0:
D:\Program Files (x86)\Arduino\libraries\Time\DateStrings.cpp:41:22: error: variable 'monthNames_P' must be const in order to be put into read-only section by means of 'attribute((progmem))'
PGM_P monthNames_P PROGMEM =
^
D:\Program Files (x86)\Arduino\libraries\Time\DateStrings.cpp:58:20: error: variable 'dayNames_P' must be const in order to be put into read-only section by means of 'attribute((progmem))'
PGM_P dayNames_P PROGMEM = { dayStr0,dayStr1,dayStr2,dayStr3,dayStr4,dayStr5,dayStr6,dayStr7};
^
D:\Program Files (x86)\Arduino\libraries\Time\DateStrings.cpp:59:24: error: variable 'dayShortNames_P' must be const in order to be put into read-only section by means of 'attribute((progmem))'
char dayShortNames_P PROGMEM = "ErrSunMonTueWedThrFriSat";
^
Fehler beim Kompilieren.

Allerdings habe ich diesen Sketch mit der IDE-Version 1.06 zum Laufen bekommen und habe die Seriell printings durch lcd.print ersetzt...das hat erstmal funktioniert, ist aber nicht sehr komfortabel.

Dies zu der einen Bibliothek...die Andere wird etwas umfangreicher :wink:

Wozu brauchst du die Streaming.h?
Ich hatte dir doch die Library

vorgeschlagen, die funktioniert, ist aktuell (unbedingt wichtig), läuft mit der IDE 1.6.5 und hat diverse Beispiele dabei.

Bei der IDE 1.6.5 ist es wichtig, aktuelle Libraries zu hohlen und die erhällst du bei Github.

Was hat das mit Streaming zu tun? Du hast da eine recht alte Version der Time Library. PROGMEM Konstanten müssen schon seit 1.5.7. const sein. Das steht deutlich in der Fehlermeldung. Und es steht auch dort welche Datei betroffen ist:

D:\Program Files (x86)\Arduino\libraries*Time*\DateStrings.cpp

Aktuelle Version:

@Hot Systems…im Beispielsketch steht:

  • in the input will result in an incorrect RTC setting. *
  • Jack Christensen 08Aug2013 *
  • Tested with Arduino 1.0.5, Arduino Uno, DS3231/Chronodot, DS3232. *
  • This work is licensed under the Creative Commons Attribution- *
  • ShareAlike 3.0 Unported License. To view a copy of this license, *
  • visit http://creativecommons.org/licenses/by-sa/3.0/ or send a *
  • letter to Creative Commons, 171 Second Street, Suite 300, *
  • San Francisco, California, 94105, USA. *
    ----------------------------------------------------------------------/

#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <Streaming.h> //http://arduiniana.org/libraries/streaming/
#include <Time.h> //http://playground.arduino.cc/Code/Time
#include <Wire.h> //http://arduino.cc/en/Reference/Wire

soviel dazu, ob ich die brauch oder nicht…