Objetivos
Material requerido.
Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino./p> |
|
Una Protoboard. |
|
Cables de protoboard macho macho y macho hembra. | |
Un reloj digital I2C TinyRTC con respaldo de batería. | |
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.
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 <TimeLib.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í:
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.
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: