Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


Arduino e ESP8266 com Display i2c LCD





Nosso principal objetivo aqui é mostrar o funcionamento do módulo serial i2c para Display LCD 2x16 ou 20x4. Com esse módulo podemos controlar os displays citados acima, utilizando apenas dois pinos (SDA e SCL), torna muito simples a comunicação, deixando ainda vários outros GPIOs de nosso microcontrolador livres.
Vamos mostrar o funcionamento tanto no arduino UNO como no ESP8266. Acompanhe!





Arduino Uno




WiFi ESP8266 NodeMcu ESP-12E





Display LCD 16x2 Serial





Módulo Serial i2c




Nesta parte mostramos o adaptador que foi comprado separadamente, no qual soldamos ao display paralelo na parte de trás. Através dos pinos i2c, o display, então, vai comunicar direto com o Arduino. Portanto, através de um microcontrolador, esse Arduino vai gerenciar todos os comandos para o display, facilitando tanto sua conexão quanto sua programação.



Módulo Serial i2c conectado no Display LCD




Montagem com Arduino





Montagem com ESP8266





Biblioteca

Adicione a biblioteca “LiquidCrystal_I2C” para comunicação com o display LCD.
Acesse o linke faça download da biblioteca.
Descompacte o arquivo e cole na pasta de bibliotecas da IDE do arduino.
C:/Program Files (x86)/Arduino/libraries



Código Fonte


Começamos definindo as bibliotecas e constantes que utilizaremos durante nosso código.


#include <Wire.h> // responsável pela comunicação com a interface i2c
#include <LiquidCrystal_I2C.h> // responsável pela comunicação com o display LCD

// Inicializa o display no endereço 0x27
//os demais parâmetros, são necessários para o módulo conversar com o LCD
//porém podemos utilizar os pinos normalmente sem interferência
//parâmetro: POSITIVE > > Backligh LIGADO | NEGATIVE > > Backlight desligado

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);



Setup


Aqui apenas inicializaremos nosso objeto para comunicação com o display.


void setup()
{
//inicializa o display (16 colunas x 2 linhas)
lcd.begin (16,2); // ou 20,4 se for o display 20x4
}




Loop

Nosso programa fará com que o display fique piscando a cada 1 segundo. Um programa simples, mas que já envolve tudo que precisamos para nos comunicar com o display.
Acender/apagar backlight, posicionar cursor para escrita e escrever.

void loop()
{
//acende o backlight do LCD
lcd.setBacklight(HIGH);
//posiciona o cursor para escrita
//.setCursor(coluna, linha)
lcd.setCursor(0,0);
lcd.print("FERNANDOK.COM");
lcd.setCursor(0,1);
lcd.print("ACESSE!!!");
delay(1000); //intervalo de 1s
//desliga o backlight do LCD
lcd.setBacklight(LOW);
delay(1000); //intervalo de 1s
}


Arquivos para download:





Postar um comentário

14 Comentários

  1. Legal! Parabéns pelo vídeo. Explicação muita clara e objetiva!

    ResponderExcluir
  2. Como o arduino sabe que as portas A4 e A5 são para comunicação? Como mudar o end do conversor?

    ResponderExcluir
  3. exit status 1
    'POSITIVE' was not declared in this scope

    ResponderExcluir
    Respostas
    1. Boa tarde
      o meu está dando o mesmo erro.
      conseguiu resolver? como?
      Grato

      Excluir
    2. Tenta mudar o nome da pasta da biblioteca do I2C para "LiquidCristal_I2C"

      Excluir
  4. O meu esta dando um erro na wire, o código funciona ´perfeitamente no arduino mas no nodemcu da um erro: C:\Users\Tales\Documents\Arduino\libraries\Wire\utility\twi.c:25:20: fatal error: avr/io.h: No such file or directory

    #include

    ResponderExcluir
  5. Tenho que mudar alguma configuração no código quando se usa outra porta no NodeMCU (ESP8266)?

    ResponderExcluir
  6. O meu deu esse erro:

    Arduino/libraries/LiquidCrystal/LiquidCrystal.cpp:179:48: error: 'analogWrite' was not declared in this scope
    analogWrite ( _backlightPin, value );

    ResponderExcluir
    Respostas
    1. Comigo deu o mesmo erro, é só abrir o arquivo LiquidCrystal.cpp e ir até a parte onde o analogWrite está escrito e colocar como comentário, ou simplesmente apagar esse trecho

      Excluir
  7. Aqui o código compila normalmente, mas o lcd não liga

    ResponderExcluir
    Respostas
    1. Se conseguiu fala, está dando o mesmo problema cmg

      Excluir
  8. na ESP não funciona. Ele acende e apaga a luz de fundo, mas escrever não escreve nada. Desconfio que seja por conta dos pinos SDA e SCL

    ResponderExcluir
  9. Fernando, muito bom o conteúdo, como sempre.
    Estou com dificuldades para usar dois módulos I2C simultaneamente em um ESP8266 NodeMcu ESP-12E.
    Estou tentando usar um display oled e um sensor de temperatura hdc10880, a ligação segue o seu exemplo,
    os pinos SDA do sensor e do display estão ligados na GPIO D2 e os pinos SDL estão ligados na GPIO D1.

    Não consigo fazer os dois funcionarem simultaneamente.
    Consegue me dar uma ajuda, por favor?

    Abaixo segue o código.
    No exemplo abaixo as linhas relacionadas ao Display estão comentadas e dessa forma o sensor funciona e o scan dos dispositivos I2C retorna o endereço do sensor. Quando descomento as linhas do display, o display funciona, o sensor para de funcionar e o scan retorna apenas o endereço do display.
    #include
    #include
    #include "SSD1306Wire.h"
    ClosedCube_HDC1080 hdc1080;
    //SSD1306Wire display(0x3c);
    void setup()
    {
    Wire.begin();
    Serial.begin(115200);
    hdc1080.begin(0x40);
    Serial.println("Sensor HDC1080 com Arduino");
    //display.init();
    // display.flipScreenVertically();
    }
    void loop()
    {
    //Le os valores de temperatura e umidade
    float t = hdc1080.readTemperature();
    float h = hdc1080.readHumidity();
    Serial.print("Temperatura: ");
    Serial.print(t);
    Serial.print(" C, Umidade: ");
    Serial.print(h);
    Serial.println(" %");
    // display.clear();
    // display.setFont(ArialMT_Plain_10);
    // display.drawString(10, 15, String(t));
    // display.drawString(10, 30, String(millis()));
    // display.display();
    delay(3000);
    scan();
    }
    void scan()
    {
    byte error, address;
    int nDevices;
    Serial.println("Scanning...");
    nDevices = 0;
    for(address = 1; address < 127; 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");
    }

    ResponderExcluir