Descripción
Hasta ahora hemos utilizado un dispositivo I2C, pero 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.
Hasta ahora hemos utilizado un dispositivo I2C, pero 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.
En esta ocasión utilizaremos el display LCD 1602A I2C y un Reloj RTC I2C juntos, 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.
Materiales
Placa de Arduino
1 Reloj Digital I2C Tiny RTC con Respaldo de Batería.
1 Display LCD 1602A I2C
Protoboard, Cables para Conexiones, un Cable USB para conectar Arduino al PC y que sirve
además de alimentación.
Esquema
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
Código
PROGRAMACIÓN
Lo primero es descargar e instalar las librerías DS1307RTC de Michael Margolis y Time también de Michael Margolis
PROGRAMACIÓN
Lo primero es descargar e instalar las librerías DS1307RTC de Michael Margolis y Time también de Michael Margolis
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 <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);
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);
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);
}
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
setSyncProvider(RTC.get);
setTime(15, 27, 0, 23,05, 2026);
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.setCursor(0,0);
lcd.print(hour());
lcd.print(":");
printDigits(minute());
lcd.print(":");
printDigits(second());
lcd.setCursor(0, 1);
lcd.print(day());
lcd.print("/");
lcd.print(month());
lcd.print("/");
lcd.print(year());
}
void printDigits(int digits) {
if (digits < 10) lcd.print('0');
lcd.print(digits);
}
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.
No hay comentarios:
Publicar un comentario