Como ligar um display LCD 16x2 I2C no Arduino Uno

Eletrônica Arduino 17 de Novembro de 2019 às 14:21

A interação entre humano e máquina é essencial nos dias atuais, onde existem projetos que entregam uma interface rica em informações e entrada de dados. E uma das formas de mostrar os dados é utilizando o display LCD 16x2. No tutorial de Como ligar um display LCD no Arduino Uno aprendemos um método que utiliza muitas portas digitais de uma placa de desenvolvimento Arduino, o que pode ser um inconveniente em projetos maiores. Porém podemos utilizar o módulo serial I2C para displays 16x2 e 20x4 para resolver este problema de uma forma extremamente prática.

Módulo serial I2C para display LCD.

O protocolo I2C é largamente utilizado no desenvolvimento embarcado para realizar comunicações entre plataformas iguais ou diferentes utilizando apenas duas linhas seriais, como a de dados (SDA) e a linha de clock (SCL).

Este protocolo foi desenvolvido pela Philips Semiconductors com o intuito de construir um barramento bidirecional usando apenas duas linhas de comunicação, aplicando um  ou vários dispositivos mestres (Masters) que se comunicam com um ou vários dispositivos escravos (Slaves). É comum encontrar este tipo de padrão em EEPROMs como a AT24C02, portas analógicas e digitais (ADCs/DACs) disponíveis no Arduino, NodeMCU e módulos, e em controle de displays OLEDs e LCDs.

Protocolo de comunicação I2C com Arduino e NodeMCU

Neste tutorial será mostrado como ligar o display LCD de 16x2 com o módulo I2C no Arduino Uno, também como descobrir seu endereço de comunicação.

Materiais e montagem

Separe a lista de materiais necessários abaixo e realize as ligações conforme pinagem fornecida.

  • 1 Arduino Uno R3 com cabo USB
  • 1 Display LCD 16x2
  • 1 Módulo serial I2C PCF8574A para display
  • Fios jumper Macho-Fêmea
Esquema Arduino Uno e display LCD 16x2 com módulo I2C.

O primeiro passo é soldar o módulo na pinagem do display, facilitando a sua utilização.

Modulo I2C para display LCD 16x2.

Este módulo possui um jumper LED para a ativação de seu backlight e um trimpot de ajuste de contraste das letras no display, sendo configurações bem úteis para projetos.

Após conectar os pinos de GND no GND, VCC no 5V, SDA no pino analógico A4 e SCL no pino analógico A5, é necessário descobrir o endereço do módulo I2C para realizar a comunicação com o Arduino. Para isso compile e envie este código do I2C Scanner para o Arduino.

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not known.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

Abra o monitor serial em 9600 de velocidade (baud rate) para visualizar o endereço em hexadecimal do módulo I2C. No módulo utilizado para este tutorial o endereço é 0x3F.

I2C Scanner no Arduino.

Com este endereço podemos desenvolver um código para imprimir uma mensagem no display. Para isso crie um novo Sketch com o nome de "display-lcd-i2c". A biblioteca para displays LCD na configuração padrão é a LiquidCrystal, porém como estamos utilizando o módulo I2C a biblioteca será a NewLiquidCrystal.

Após realizar o download da pasta zipada, navegue pelo menu superior da IDE Arduino em Sketch/Incluir Biblioteca/Adicionar biblioteca .ZIP, para adicionar ao Sketch criado.

Copie e cole este código, compile e envie ao Arduino.

/**
 * Firmware para controlar um display LCD 16x2 com I2C
 * 
 * Autor: tecdicas
 * 
 * 16/10/2019
 * 
 */

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// Alterar o endereço conforme modulo I2C
LiquidCrystal_I2C lcd(0x3F, 2,1,0,4,5,6,7,3, POSITIVE); 

void setup()
{
  lcd.begin (16,2);
}
 
void loop()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("tecdicas.com");
  lcd.setCursor(0,1);
  lcd.print("Modulo I2C");
  delay(2000);
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("Ola mundo!");
  delay(1000);
}

Inicialmente o display é limpado, logo em seguida irá escrever "tecdicas.com" na primeira linha e "Modulo I2C" na segunda linha, após 2 segundos o display é limpado novamente e irá escrever "Ola mundo!" ao centro da primeira linha, após 1 segundo o processo é repetido infinitamente.