Como usar un RTC y una LCD en IC2

Hola buen día...

Resulta que tengo este y varios proyectos esperando para usar un RTC junto con la LCD obviamente, asi que pense que no habria mucho problema...

Conecto la lcd al bus ic2 y funciona se ven correctamente las impresiones
conecto el rtc y funciona correctamente. lo reviso en el monitor serial
El bus tiene sus resistencias pullup, estoy usando una breadboar y cables de 5plg, en mi escritorio, nada de ruido electrico por el momento.

EL problema surge cuando necesito usar los dos en el mismo bus.

Me he buscado el scanner de direcciones de IC2 y he encontrado 3;

0x27 // esta corresponde a la pantalla lcd
0x50 // estas dos aparantemente son del rtc por que si lo remuevo del bus ambas desaparecen
0x68 // rtc de nuevo?

Bueno, dejando de lado esa rareza, si conecto los dos dipositivos a Ic2 la pantalla no muestra texto...
Pero el RTC si refeleja la hora y fecha en el serial monitor.

Para hacer las cosas mas interesantes...
Mando encender y apagar la luz del display al incio y esa parte del codigo si me funciona, pero nada de letras o numero o simbolos ni nada.

Me he visto varios ejemplos:

Usar leer y escribir en Wire
Un codigo que hace lo que necesito
Un tuto mas extenso

Ahora bien... lo que no encuentro por ningun lado es una guia, una secuencia de pasos logicos que me permita a mi, armar mi codigo como yo lo necesite. Si alguien sabe de alguna se lo agradeceria.

Por el momento entiendo que para que el bus funcione, debo "hablar" con cada dispositivo individualmente, es por eso que se usa una funcion como;

Wire.beginTransmission(redchip);
Wire.write(0);
Wire.endTransmission();

Wire.beginTransmission( direccion del sispositivo)
Wire.write(0) // esto es necesario cada vez para borrar el registro, creo
Wire.endTransmission(); // empieza a volcar los datos en la direccion selecciona.

Ahora bien, si quiero imprimir en mi LCD es algo asi:

void imprimeLCD()
{
 Wire.beginTransmission(0x27);
 Wire.write(0); 
 Wire.endTransmission();

 lcd.setCursor(0,0); lcd.print("thi is a " ); 
 lcd.setCursor(0,1); lcd.print("das probe" ); 

}

o asi?

void imprimeLCD()
{
 Wire.beginTransmission(0x27);
 Wire.write(0); 
 lcd.setCursor(0,0); lcd.print("thi is a " ); 
 lcd.setCursor(0,1); lcd.print("das probe" ); 
 Wire.endTransmission();
}

La verdad que no encuentro como desarmar este problema, se lo basico, que debo leer o escribir en cada dispositivo del bus, pero como? como se usa el printlcd si tengo varios dispositivos en IC2?

Alguna ayuda ??

Gracias.

-Alex

Momento Alexpd, si no permite que ambos esten en el bus es por alguna de estas dos razones.

  1. O alguno esta bajando demasiado la R pullup al punto que uno de los dispositivos (el LCD) no funciona adecuadamente. En ese caso considera si te es posible retirar la R o analizar ambos circuitos para ver si ambos tienen R pull up.
  2. Puede ser que alguno trabaje a 5V y el otro a 3.3V y al ponerlos juntos no van. Mira eso también.

Ya he leído este problema antes.

Gracias por el dato @Surbyte

Estyo revisando el RTC que uso es este;

RTC1307 version tiny

Dice que es operativo a 5V.

Intentare remover las resistencias del bus IC2 a ver que sucede.

Alguna idea de com escribir el codigo para mandar imprimir/ leer del RTC?
Es algo que no veo por ningun lado, solo codigo completos, pero obviamente dependen de librerias y de demas cosas.

Gracias.
-Alex.

Tienes razon @Surbyte removi las reistencias y funciona
ahora solo necesito pasarle la hora a la pantalla
para saber que todo esta bien.

Gracias!..

Este es el codigo que estaba usando, sin muchos resultados, tu que me recomiendas?

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>       //Libreria IC2 

#define screen 0x27                  //adress to print data 
#define rtc    0X50                  //adress to read data 


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

/*
#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif
*/

RTC_DS1307 RTC;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

//////////////////////////////////////////variables globales 
int  Ryear; 
byte Rmonth; 
byte Rday; 
byte Rhour; 
byte Rminute; 
byte Rsec; 
char date[30];


void setup() 
{
  Serial.begin(9600);
  Wire.begin();
  lcd.begin(20,4);

/*
    // part code from http://tronixstuff.wordpress.com/
    Wire.beginTransmission(0x68);
    Wire.write(0x07); // move pointer to SQW address
    Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave
    Wire.endTransmission();
    // end part code from http://tronixstuff.wordpress.com/
 */   
  
  RTC.begin();
    #ifndef ESP8266
    while (!Serial); // for Leonardo/Micro/Zero
    #endif
      
      if (! RTC.begin()) 
          {
            Serial.println("Couldn't find RTC");
            delay (1000);
          }


    //    Wire.beginTransmission(0x27);
    //    byte zero = 0x00;
    //    Wire.write(zero);
        
        
        lcd.setCursor(0,0); lcd.print("thi is a " ); 
        lcd.setCursor(0,1); lcd.print("das probe" ); 

     //   Wire.endTransmission();

}

void loop() 
{
   
    DateTime now = RTC.now();

    Ryear =  now.year();
    Rmonth =  now.month(); 
    Rday =  now.day();
    Rhour = now.hour();    
    Rminute=  now.minute();
    Rsec =  now.second();

    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    sprintf(date, "  %d/%d/%d %d:%d", Ryear, Rmonth, Rday, Rhour, Rminute); 
    Serial.println("   "); 
    Serial.println(date); 
   
    
    delay(3000);
}

void printLCD()
    {
        Wire.beginTransmission(screen);
        byte zero = 0x00;
        Wire.write(zero);
        Wire.endTransmission();
        
        lcd.setCursor(0,0); lcd.print(date); 
        lcd.setCursor(0,1); lcd.print("das probe" ); 
    }

//end of program

Bueno pues si funciono, pero en cuento lo cambie, me dejo de imprimir.

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>       //Libreria IC2 

#define screen 0x27                  //adress to print data 
#define rtc    0X50                  //adress to read data 


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

/*
#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif
*/

RTC_DS1307 RTC;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

//////////////////////////////////////////variables globales 
int  Ryear; 
byte Rmonth; 
byte Rday; 
byte Rhour; 
byte Rminute; 
byte Rsec; 
byte RpasSec; 
char date[30];


void setup() 
{
  Serial.begin(9600);
  Wire.begin();
  lcd.begin(20,4);


  RTC.begin();
      
      if (! RTC.begin()) 
          {
            Serial.println("Couldn't find RTC");
            delay (1000);
          }
     
}

void loop() 
{
    
    DateTime now = RTC.now();
    Ryear =  now.year();
    Rmonth =  now.month(); 
    Rday =  now.day();
    Rhour = now.hour();    
    Rminute=  now.minute();
    Rsec =  now.second();

    sprintf(date, "%02d/%02d/%d  %02d:%02d:%02d", Rday, Rmonth, Ryear, Rhour, Rminute, Rsec); 
    
    
    Serial.println("   "); 
    Serial.println(date);     
        
    
    delay(1000);    
    
    //printTime();
    
}

void printTime()
    {  
    Wire.beginTransmission(screen);
    byte zero = 0x00;
    Wire.write(zero);
    Wire.endTransmission();
    delay(10); 
        
    lcd.setCursor(0,0); lcd.print(date); 
    }


    

//end of program

Que es lo que cambiaste? Mira el mensaje privado que te envié

Pues es lo no veo, todas las funciones estan igual,
lo hice trabajar, y logre que imprimiera correctamente todo,
hice una modificiacion para separarla en funciones y ya no jalo

Lo que si vi, fueron unos valores corruptos en la lcd, quizas si le falten
las resistencias pull ups, aqui veo que dice que 10k, a ti cuales te han dado mas
resultado?

Gracias.

-Alex.

No puede no haber resistencias.
El tema es que si todos ponen Resistencias Pull up, el paralelo de todas hace que la R equivalente caiga en valor y no recuerdo ahora cual valor compromete los niveles.
Verifica que al menos haya 10k en cada linea A4 y A5.

Hecho,, ya lo heche ha andar, por el momento todo bien... Gracias!

maana pego mi codigo completo en caso de que algo se me escape.

Gracias.

-Alex.

Bueno, ya quedo esto...

El codigo:

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>       //Libreria IC2 

#define screen 0x27                  //adress to print data 
#define rtc    0X50                  //adress to read data 


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif


RTC_DS1307 RTC;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

//////////////////////////////////////////variables globales 
int  Ryear; 
byte Rmonth; 
byte Rday; 
byte Rhour; 
byte Rminute; 
byte Rsec; 
byte RpasSec; 
char date[30];
byte pasMin; 

boolean taketime = true; 
byte timeToref;

void setup() 
{
  Serial.begin(9600);
  Wire.begin();
  lcd.begin(20,4);


  RTC.begin();
      
  if (! RTC.begin()) 
     {
      Serial.println("Couldn't find RTC");
      delay (1000);
      }


     lcd.clear(); 
     lcd.setCursor(0,0); lcd.print("das test"); 
     delay(3000); 
     
}

void loop() 
{
    DateTime now = RTC.now();
    Ryear =  now.year();
    Rmonth =  now.month(); 
    Rday =  now.day();
    Rhour = now.hour();    
    Rminute=  now.minute();
    Rsec =  now.second();
    sprintf(date, "%02d/%02d/%d  %02d:%02d:%02d", Rday, Rmonth, Ryear, Rhour, Rminute, Rsec); 
    Serial.println(date);     
    
    delay(1000);    
    
    Wire.beginTransmission(screen);
    byte zero = 0x00;
    Wire.write(zero);
    Wire.endTransmission();
            
    lcd.setCursor(0,0); lcd.print(date); 

    if(Rminute >= 1 && Rminute <= 2) 
      {
        lcd.setCursor(0,1); lcd.print("  APAGADO POR "); 
        lcd.setCursor(0,2); lcd.print("    TIEMPO    "); 
      }

}//end of program

bueno pero explica como quedaron las resistencias del bus I2C