bclose

Combinar varios dispositivos I2C

Mostrando la hora y la fecha en un display LCD

Objetivos

 

 

    • Utilizar el bus I2C para varios componentes.
    • Conectar varios componentes I2C.
    • Visualizar en un LCD la hora y la fecha leídas en un RTC.

 

Material requerido.

Imagen de Arduino UNO

Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.

Protoboard

Una Protoboard.

conexiones

Cables  de protoboard macho macho y macho hembra.

Reloj con bateria RTC clock Un reloj digital I2C TinyRTC con respaldo de batería.
Display LCD

Un display LCD de 16×2 I2C.

 

INTRODUCCIÓN Y  MONTAJE

 

Ya hemos utilizado en varias sesiones diferentes dispositivos I2C, pero hasta ahora siempre lo hemos hecho de forma aislada. Y si algo tiene de bueno la interfaz I2C es que nos permite conectar y controlar varios dispositivos de este tipo de una forma muy sencilla. Si no estáis familiarizados con este bus os recomendamos que antes de seguir echéis un vistazo a la sesión en la que explicamos con bastante detalle qué es y como funciona el bus I2C, utilizando precisamente el display LCD que usaremos también en esta sesión. Y de la misma forma, si no os suena esto de los RTC, aquí tenéis su sesión correspondiente.

Si ya tenéis controlados esos dos temas, veréis como integrar los dos componentes en un sólo montaje y programa es muy fácil. Lo único que tenéis que tener claro es qué dirección tiene asociada cada dispositivo, y definirla correctamente en el programa. Y en el caso de este RTC ni siquiera eso, ya que la propia librería es capaz de gestionarlo por sí misma.

En cuanto al montaje, los dos componentes tienen los mismos pines Vcc y GND para la alimentación, y por supuesto los pines correspondientes al bus I2C: SCA y SCL, que en el caso del Arduino UNO corresponden a los pines A4 y A5. Como podéis ver, gracias a este bus nos ahorramos un montón de cables y nos facilita mucho la inclusión de nuevos dispositivos de este tipo en caso de que vayamos ampliando nuestro proyecto.

montaje componentes I2C

 

PROGRAMACIÓN

 

Si el montaje no tenía demasiado misterio, la programación es igual de sencilla. Para empezar incluiremos las librerías que vamos a usar, definiremos una variable con la dirección del LCD (en el caso del RTC no es necesario) y crearemos una instancia de tipo LiquidCrystal_I2C:

#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR 0x27

LiquidCrystal_I2C lcd(I2C_ADDR, 2, 1, 0, 4, 5, 6, 7);

Ya en el setup inicializamos el LCD indicando que es de 16×2 y el RTC estableciendo la fecha y la hora correcta:

void setup()
{
 Serial.begin(115200);
 lcd.begin (16, 2); // Inicializar el display con 16 caraceres 2 lineas
 lcd.setBacklightPin(3, POSITIVE);
 lcd.setBacklight(HIGH);
 // while (!Serial) ; // Solo para el Leonardo
 setSyncProvider(RTC.get); // Vamos a usar el RTC
 setTime(10, 40, 00, 19, 9, 2016); // Las 10:40:00 del dia 19 de Sep de 2016
 if (timeStatus() != timeSet)
 Serial.println("Unable to sync with the RTC");
 else
 Serial.println("RTC has set the system time");
}

Y una vez hecho esto vamos a reutilizar las funciones que utilizamos en la sesión del RTC, pero en vez de mostrarlo en pantalla utilizaremos la libería del LCD para mostrar la hora y la fecha en el LCD:

void digitalClockDisplay()
{
 lcd.home (); // go home
 lcd.print(hour());
 printDigits(minute());
 printDigits(second());
 lcd.setCursor ( 0, 1 ); // go to the 2nd line
 lcd.print(day());
 lcd.print("/");
 lcd.print(month());
 lcd.print("/");
 lcd.print(year());
}

void printDigits(int digits)
{
 lcd.print(":");
 if (digits < 10)
 lcd.print('0');
 lcd.print(digits);
}

Y ya con esto sólo tenemos que llamar a está función cada segundo para que vaya mostrando la hora y la fecha:

void loop()
{
 digitalClockDisplay();
 delay(1000);
}

Podéis descargar el programa completo aquí: rtc_y_lcd_i2c.

lcd y rtc

QUÉ HACER SI VARIOS COMPONENTES TIENEN LA MISMA DIRECCIÓN

 

A estas alturas a alguno se le habrá podido pasar por la cabeza qué pasaría si queremos conectar varios dispositivos iguales y que tengan la misma dirección. Pues como casi todo, esto ya le ha pasado a alguien anteriormente, y por eso los dispositivos I2C suelen tener un par de conexiones rotuladas como C1 y C2, de forma que puedes cambiar la dirección soldando o cortando estas pistas, lo que permite hasta 4 direcciones distintas.

c1 y c2 i2c

Una vez que lo cambiado sólo tenéis que utilizar el programa I2C scanner y ver cuál es la nueva dirección para asignársela.

 

Resumen de la sesión

 

En esta sesión hemos aprendido varias cosas importantes:

 
    • Hemos aprendido a conectar varios dispositivos I2C.
    • Es muy fácil incluir varios de estos dispositivos en un sólo programa.
    • Sabemos cambiar la dirección de este tipo de componentes.
 

(12) Comments

  • Hola que tal, mira soy un poco nuevo en esto y por proyecto escolar debo manejar un sensor biometrico que este siempre escuchando y también el modulo bluetooth hc-06 que este a la espera de algún dato, mi pregunta es de que manera puedo estar escuchando los dos módulos al mismo tiempo en caso de que se ocupe uno o el otro, agradecería mucho tu respuesta, gracias.

    • Hola Arnulfo, no tendrías que hacer nada especial. Si el tiempo de respuesta no es crítico simplemente leelos uno detrás de otro en el loop. Si no tendrías que trabajar con interrupciones. Un saludo.

    • William

    Hola a todos,
    Quisiera conectar por I2C 100 pantallas led de siete segmentos preparadas para ello, leyendo esta entrada estoy viendo que al tener todas la misma dirección I2C (o pocas direcciones para repartir) no tengo ningún futuro. Conocen de alguna solución para este caso? Existe otro protocolo que me permita solucionarlo?
    Gracias por adelantado

    • Hola William,

      Normalmente los equipos I2C viene con una direccion predeterminada, pero tu puedes cmabiarla mediante unos conectores que traen para ello. En el caso de las pantallas LCD suelen traer 3 puentes con los que puedes hacer 8 combinaciones. Por tanto para poder manejar 100 de ellas necesitarias como 13 arduinos gobernandolas

  • Buenas noches amigos: Por favor, me gustaría que alguien me aclarase, el porqué me da error al compilar este
    programa.
    El error, es el siguiente: lcd.setBacklight Pin(3, POSITIVE);
    Trabajo con Arduino Mega2560.
    Agradecería enormemente, la colaboración. Muchas gracias.

    #include
    #include
    #include // a basic DS1307 library that returns time as a time_t
    #include
    #include

    #define I2C_ADDR 0x27

    LiquidCrystal_I2C lcd(I2C_ADDR, 2, 1, 0, 4, 5, 6, 7);

    void setup()
    {
    Serial.begin(115200);
    lcd.begin (16, 2); // Inicializar el display con 16 caraceres 2 lineas
    lcd.setBacklight(HIGH);
    // while (!Serial) ; // Solo para el Leonardo
    setSyncProvider(RTC.get); // Vamos a usar el RTC ——– (EN ESTE PUNTO ME DA ERROR)
    setTime(10, 40, 00, 19, 9, 2016); // Las 10:40:00 del dia 19 de Sep de 2016
    if (timeStatus() != timeSet)
    Serial.println(“Unable to sync with the RTC”);
    else
    Serial.println(“RTC has set the system time”);
    }

    void loop()
    {
    digitalClockDisplay();
    delay(1000);
    }

    void digitalClockDisplay()
    {
    lcd.home (); // go home
    lcd.print(hour());
    printDigits(minute());
    printDigits(second());
    lcd.setCursor ( 0, 1 ); // go to the 2nd line
    lcd.print(day());
    lcd.print(“/”);
    lcd.print(month());
    lcd.print(“/”);
    lcd.print(year());
    }

    void printDigits(int digits)
    {
    lcd.print(“:”);
    if (digits < 10)
    lcd.print('0');
    lcd.print(digits);
    }

    • ¿Cuál es el mensaje de error que te da?

    • Fernando

    hola a todos tengo una duda. hago uso de estos dos dispositivos en un arduino mega y algunos códigos mas en mi programación. En mi pantalla aveces se saltan los segundos del reloj aveces va en 15 segundos y de repente pasa a 20segundos no se que error pueda existir. ya que la programación esta correcta. La pantalla también presenta una alteración después de un rato aparecen símbolos extraños y no vuelve a mostrar la hora.
    cual puede ser el problema?

    • Hola Fernando, puede ocurrir que si tienes delays tarde más de un segundo en volver a ejecutar el loop y por eso no lo refresque cada segundo. UN saludo.

    • Juan

    Hola, saben cual es la dirección del reloj? solo se me ocurre por molestar.
    gracias.

    • Me parece que es la 0x68, pero puedes usar el I2C scanner para asegurarte. Un saludo,

  • Hola tengo hecho un reloj pero cuando cambia de las 15 hora a las 16horas me aparece 10h y luego 11h
    Me gustaria me ayudarais

  • Hola a todos. Apuntar que algunos módulos LCD I2C traen la posibilidad de cambiar la dirección 0x27 que traen por defecto con tan solo añadir unos puntos de soldadura, teniendo 8 posibles. Podemos así conectar más de un display.

    Saludos.

Give a Reply

WordPress Anti-Spam by WP-SpamShield