top of page
  • Immagine del redattoreRobNico

Arduino Interfaccia I²C

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);

}

}

 


 

263 visualizzazioni0 commenti

Post recenti

Mostra tutti

Comments


bottom of page