L'interfaccia I²C è un protocollo di comunicazione seriale sincrono che permette a molti dispositivi di scambiarsi dati fra loro utilizzando solo due fili, uno per i dati SDA (Serial Data) ed uno per sincronizzare la comunicazione SCL (Serial Clock).
Tutti questi dispositivi si collegano alla stessa coppia di cavi SDA e SCL e ad ognuno viene assegnato un indirizzo seriale diverso.
I dispositivi I²C collegati avranno la funzione di SLAVE e eseguono i comandi impartiti dal MASTER, nel nostro caso la scheda di Arduino.
In questo post vedremo come collegare un display LCD I²C 20x4 e un RTC DS1307.
Vediamo un primo esempio :
Come possiamo vedere i collegamenti sono semplici, pin GND al GND di Arduino, pin VCC al pin 5V e infine nella scheda di Arduino Uno per il bus I²C vengono utilizzati i Pin A4 e A5 rispettivamente per SDA e SCL.
Il potenziometro blu serve ad aggiustare il contrasto del display, mentre il jumper tra i due piedini serve per la luminosità, vedremo anche come impostarla da sketch.
Per prima cosa occorre controllare se nella cartella libraries di Arduino IDE esiste la libreria Arduino-LiquidCrystal-I2C-library altrimenti la possiamo installare direttamente dall' IDE gestione librerie oppure https://github.com/johnrickman/LiquidCrystal_I2C
Lo sketch sotto alla riga LiquidCrystal_12c lcd(0x27, 20, 4) imposta l'indirizzo dell'LCD, che di default è 0x27, possiamo comunque verificare l'indirizzo sul Monitor seriale di Arduino caricando lo sketch nella libreria esempi i2c_scanner di Wire.
// ardurob
// https://ardurob.wixsite.com/roboticaeducativa
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Impostare l'indirizzo LCD su 0x27 per un display a 20 caratteri e 4 righe
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup()
{
// inizializzare l'LCD
lcd.begin();
// Accendere la retroilluminazione e stampa un messaggio.
lcd.backlight();
lcd.setCursor(2, 1);
lcd.print("Display LCD con");
lcd.setCursor(2, 2);
lcd.print("interfaccia I2C");
}
void loop()
{
}
Vediamo un altro esempio di sketch, in questo regoliamo la luminosità tramite il PIN PWM 3 di Arduino e stampiamo le scritte sul display con l'effetto typewriting.
Togliamo il jumper retroilluminazione e colleghiamo il piedino al PIN PWM 3.
String riga 1 e 2 indicano cosa stampare, analogWrite(LED_PIN, 50) imposta il valore della luminosità 0-255 (255 luminosità max), mentre il delay(150) è il ritardo tra le lettere.
#include <LiquidCrystal_I2C.h>
#define LED_PIN 3
LiquidCrystal_I2C lcd(0x27, 20, 4);
String riga1 = "Display LCD con";
String riga2 = "interfaccia I2C";
void setup(){
lcd.begin();
lcd.backlight();
pinMode(LED_PIN, OUTPUT);
analogWrite(LED_PIN, 50);
}
void loop(){
lcd.clear();
lcd.setCursor(2, 1);
typewriting(riga1);
lcd.setCursor(2, 2);
typewriting(riga2);
delay(1000);
}
void typewriting(String messaggio){
int lunghezza = messaggio.length();
for(int i = 0; i < lunghezza; i++){
lcd.print(messaggio[i]);
delay(150);
}
}
In questo esempio utilizzo insieme al display i2c il modulo RTC DS 1307.
Il collegamento del RTC è molto semplice, sarà in parallelo, quindi pin GND al GND di Arduino, pin VCC al pin 5V e infine nella scheda di Arduino Uno per il bus I²C vengono utilizzati i Pin A4 e A5 rispettivamente per SDA e SCL.
Se proviamo a caricare lo sketch i2c_scanner dalla libreria Wire, nel Monitor seriale possiamo vedere i relativi indirizzi seriali del display 0x27 e del DS1307 0x50.
// https://ardurob.wixsite.com/roboticaeducativa
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// La data e l'ora funzionano usando un RTC DS1307 collegato tramite I2C e Wire lib
#include "RTClib.h"
RTC_DS1307 rtc;
char stringa1[8]; // per memorizzare la stringa che include la data (dimensione massima data: 8 caratteri)
char stringa2[6]; // per memorizzare la stringa che include l'ora (dimensione massima ora: 6 caratteri)
// Variabile per la verifica della cancellazione del display
int chiaveCancella = 0;
// Array multidimensionale costituito
// da 7 righe (giorni della settimana)
// 4 colonne (le lettere che compongono il giorno più il carattere null con cui deve terminare una stringa)
char giornoDellaSettimana[7][4] = {"Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"};
// Inizializzazione della libreria in cui è descritta la modalità di utilizzo dei pin dell'LCD,
// impostazione dell'indirizzo dell'LCD 0x27 di 20 colonne e 4 linee
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup () {
lcd.begin(); // inizializzazione dell'LCD
lcd.backlight(); // attivazione della retroilluminazione
if (!rtc.isrunning()) {
lcd.setCursor(0, 0);
lcd.print("RTC non funzionante!");
// la riga che segue permette di impostare data e ora prendendo l'informazione
// dal computer a cui è collegato Arduino
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// la riga che segue permette di impostare
// esplicitamente da parte dell'utente data e ora
// Gennaio 21, 2014 alle 3 del pomeriggio ybisognrà scrivere:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
}
void loop () {
if (!rtc.isrunning()) {
lcd.setCursor(0, 0);
lcd.print("RTC non risponde");
lcd.setCursor(0, 1);
lcd.print(" ");
chiaveCancella = 1;
}
else
{
if (chiaveCancella == 1) {
lcd.clear();
chiaveCancella = 0;
}
DateTime now = rtc.now();
lcd.setCursor(3, 1);
// estrae dall'array giornoDellaSettimana il nome del giorno
lcd.print(giornoDellaSettimana[now.dayOfTheWeek()]);
lcd.setCursor(7, 1);
sprintf(stringa1, "%2d/%02d/%d", now.day(), now.month(), now.year());
lcd.print(stringa1);
lcd.setCursor(5, 2);
sprintf(stringa2, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.print(stringa2);
delay(1000);
}
}
Comentarios