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 clockUn 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.
 

(1) Comment

  • 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