Problem bei 2 Geräten am I2C Port des Arduino Uno R3

Hallo allerseits !

Habe ein LCD 2004 Module am I2C Port.... funktioniert soweit
Heute wollte ich das Projekt mit einer DS3231 RTC erweitern und ....dann tritt das Problem auf , dass die Anzeige am LCD nicht mehr funktioniert .
Die beiden Geräte haben aber völlig unterschiedliche Adressen !
Woran kann das liegen ???
Wenn jemand Rat weiß bitte gerne.
mit weihnachtlichen Grüssen

was ich bisher auch noch feststellen konnte ist , dass sich das SDA Signal am Oszilloskop verändert , wenn das RTC Module angeschlossen wird !

Hallo zahnlos72

Herzlich Willkommen im Arduinoforum.

Das sieht nach einem fehlerhaften Abschluss auf dem I²C-Bus an.

Schaue mal hier zum Schlaumachen:

Hallo ! Habe es schon mit verschiedenen Pullups versucht oder eben ohne
lG

Dann zeige bitte dein Schaltbild und deinen Sketch in Code-Tags.

Funktioniert denn die RTC allein am Uno ?

Hallo !
ja wie erwähnt jedes für sich funktioniert, nur eben nicht beides zusammen !
Zum Schaltbild : Hab dafür keine Schaltplan gezeichnet ...aber eben SDA vom Arduino mit den SDA von den beiden Modulen verbunden ....gleiches eben auch für SCK
Das Display läuft auf 5 Volt das RTC auf 3,3 Volt / Masse zwischen den Modulen und Arduino hergestellt
Den Code hab ich leider auf dem anderen Rechner aber ist nichts aufregendes

lG

Du solltest die RTC auch mit 5Volt betreiben.
So kann es Probleme mit dem I2C-Bus geben.
Und auch ein nicht aufregender Sketch kann total falsch sein.
Um weiteres zu sagen, wird der benötigt.

Das hast du nicht geschrieben.

Erwischt ....
Nun es ist aber so , dass es unabhängig voneinander läuft und beim Verbinden des RTC Modules nur eben die LCD streikt !
Das mit den 5 Volt am RTC habe ich testhalber schon probiert, hat darauf aber keinen Einfluss.

lG

PS: den Sketch werde ich mir morgen auf einen Stick ziehen ,um ihn Euch zu zeigen

Nicht testhalber, bei 5 Volt Systemen gehört das auf 5 Volt.
Und du kannst auch ein Foto des Aufbaus posten, dann sehen wir, ob alles richtig angeschlossen ist.

ich habe deshalb die 3,3 Volt Versorgung gewählt , damit die Knopfzelle der RTC nicht geladen wird ! und es wird ja in diversen Beschreibungen auch darauf hingewiesen, die 3,3 Volt zu verwenden.... mit 5 Volt geht es ja auch nicht !
Der Aufbau ist sicher in Ordnung möchte ich mal behaupten, da es ja sont gar nicht funktionieren würde ?!?

so hier der Code:

 

  #include "LiquidCrystal_I2C.h"                 // Bibliothek für Display
  LiquidCrystal_I2C LCD(39, 20, 4);              // Argumente für Display :  I2C Adresse / Zeilenlänge / Zeilenzahl

  #include "RTClib.h"                            // Bibliothek für die RTC DS3231
  RTC_DS3231 rtc;

  #include "Wire.h"                              // Bibliothek für I2C

  #include "DHT.h"                               // Bibliothek für Teperatursensor
 
  DHT dht1(2, DHT22); 
  DHT dht2(3, DHT22);

  

  long Timer1 = 0;                                // Zeitmessungsvariable 1  ( Temperatur alle 10 Sekunden )
  long Timer2 = 0;                                // Zeitmessungsvariable 2


  byte counter;
  byte map_counter;


  float Aktuelle_Temperatur_1 = 0;
  float Aktuelle_Temperatur_2 = 0;


  byte maxPfeil[8] = {B00100,
                                    B01110,
                                    B11111,
                                    B01110,
                                    B01110,
                                    B01110,
                                    B01110,
                                    B00000};


  byte minPfeil[8] =  {B00000,
                                    B01110,
                                    B01110,
                                    B01110,
                                    B01110,
                                    B11111,
                                    B01110,
                                    B00100};

  byte Gradsymbol[8] = {B00110,
                                          B01001,
                                          B01001,
                                          B00110,
                                          B00000,
                                          B00000,
                                          B00000,
                                          B00000};

  byte iso[8] ={B00000,
                         B00000,
                         B00000,
                         B11111,
                         B11111,
                         B00000,
                         B00000,
                         B00000};





  void setup()

  {

    pinMode(13,OUTPUT);
    digitalWrite(13,0); 


    Serial.begin(9600);

   
    dht1.begin(); 
    dht2.begin(); 
    
    Wire.begin();


    LCD.init(); 

    LCD.createChar(0, maxPfeil);                    // Eigene Sybole definiert
    LCD.createChar(1, minPfeil); 
    LCD.createChar(2, Gradsymbol); 
    LCD.createChar(3, iso); 

    LCD.clear(); 
    LCD.backlight(); 


    rtc.begin();

     


  }
 


 void loop()

 {

     if( millis() >= Timer1 )                                                // alle 10 Sekunden die Temeraturen messen
     {

        float Temp1 = dht1.readTemperature(); 
        float Temp2 = dht2.readTemperature(); 
        float rtc_temperature = rtc.getTemperature();
        DateTime now = rtc.now();
        Serial.print(rtc_temperature);Serial.print("  ");Serial.print(now.hour());Serial.print(now.minute());Serial.println(now.second());

        Serial.print(Temp1);
        Serial.print("     ");
        Serial.println(Temp2);
        Serial.print(abs (Aktuelle_Temperatur_1 - Temp1 ));
        Serial.print("     ");
        Serial.println(abs (Aktuelle_Temperatur_2 - Temp2 ));

        

        LCD.setCursor(0, 0); 
        LCD.print("Vorlauftemperatur"); 
        LCD.setCursor(0, 2); 
        LCD.print("Ruecklauftemperatur"); 

        if ( Aktuelle_Temperatur_1 < Temp1 )
        {  LCD.setCursor(0, 1); LCD.print((char)0); } 
                                        
        if ( Aktuelle_Temperatur_1 > Temp1 )
        {  LCD.setCursor(0, 1); LCD.print((char)1); }

         if ( Aktuelle_Temperatur_1 == Temp1 )
        {  LCD.setCursor(0, 1); LCD.print((char)3); }
                      
        LCD.setCursor(3, 1); 
        LCD.print(Temp1,1); 
        LCD.setCursor(8, 1); 
        LCD.print((char)2); 
  
        if ( Aktuelle_Temperatur_2 < Temp2 )
        {  LCD.setCursor(0, 3); LCD.print((char)0); }
                      
        if ( Aktuelle_Temperatur_2 > Temp2 )
        {  LCD.setCursor(0, 3); LCD.print((char)1); }

         if ( Aktuelle_Temperatur_2 == Temp2 )
        {  LCD.setCursor(0, 3); LCD.print((char)3); }
        
                      
        LCD.setCursor(3, 3); 
        LCD.print(Temp2,1); 
        LCD.setCursor(8, 3); 
        LCD.print((char)2); 



        Aktuelle_Temperatur_1 = Temp1;
        Aktuelle_Temperatur_2 = Temp2;

        Timer1 = millis() + 10000;                          

        counter = 0;


     
     }




         if( millis() >= Timer2 ) 
          {
             if (counter!=0){
             map_counter = map(counter,255,247,9,1);
             LCD.setCursor(19, 0); 
             LCD.print(map_counter);
             Serial.println(map_counter);
          }

             else

          {           
             LCD.setCursor(19, 0); 
             LCD.print("0");
             Serial.println("0");
          }


             Timer2 = millis() + 1000; 
             counter --;
            
          }
    

 }

K.A. wo du das her hast. Das ist def. keine Lösung.
Der I2C-Bus benötigt eine einheitlich Spannung, sonst spielt der verrückt.
Dann ist dein Problem eben an einer anderen Stelle.
Den Sketch schau ich mir an.
Allerdings solltest du die unnötigen Leerzeilen rausnehmen, dann wird der lesbarer.

Achja....da haben wir hier schon andere Dinge erlebt. Wenn du so überzeugt davon bist, warum geht es nicht ?

Nunja...auch ich habe schon komplexere Schaltungen als diese aufgebaut....
und dann sollte es ja, wie schon bemerkt, gar nicht funktionieren, wenn da wo der Wurm im Aufbau läge.
wie schon erwähnt geht es mit der RTC an 5 Volt ebensowenig !

PS: wie fügt man hier eigentlich Bilder ein ?

Ich tippe mal, dass dein "seltsamer Timer" nicht funktioniert und den Sketch blockiert.

Alles andere ist etwas dubios, da jegliche Erklärung im Sketch fehlt.

Du musst dich nicht immer wiederholen. Es geht hier um Grundsätzliches.
Der I2C Bus braucht zum richtigen stabilen arbeiten einheitliche Spannungen.
Da muss du dich schon an die Spezifikationen halten, auch wenn das nicht dein Fehler ist.

Ich lasse mir ja die Daten welche auf dem LCD angezeigt werden ( solang eben nicht die RTC dranhängt ) ebenfalls auf dem Seriellen Monitor zurückgeben.....
und dort werden sie auch dann ( also mit RTC ) ausgegeben !

Der " seltsame Timer " dürfte also nichts blockieren
Timer 1 wird für eine Messung alle 10 Sekunden verwendet und
Timer 2 zählt nur eine Variable im Sekundentakt runter
machen also was sie sollen

Wenn Du mit Zeiten und millis() hantierst, sollten diese beiden unsigned long oder uint32_t sein.

okay, weil dann der Überlauf erst später auftritt ?!?

Im Prinzip ja.
Nach einer gewissen Zeit können durch die fortlaufenden Additionen millis() + X die Ergebnisse Timer1 bzw. Timer2 negativ werden. Dann gehen die Bedingungen if( millis() >= TimerN ) in die Hose.
Solche komischen Seiteneffekte, die u.U. erst sehr viel später zu komischem Programmverhalten führen, würde ich (persönliche Meinung!) von Anfang an vermeiden.

@combie hat das Ganze hier einmal ausführlich aufgdröselt.

Hat übrigens nix mit dem möglichen Hardware-Problem 3.3V bzw. 5V auf dem I2C zu tun.

Schau mall genau auf die I²C Pins (SCL, SDA) an der RTC und LCD manchmal ist Denkfehler die Ursache

Clock auf Clock....
Daten auf Daten....

Denkfehler ???

Nein :wink:
Ist aber der meister Fehler, deshalb die nachfrage.