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./p>

    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 <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í:

    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.

    ¡Accede al contenido!

     

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

    Deja una respuesta