Ligando um display LCD no NodeMCU sem utilizar I2C

 

A grande maioria das pessoas que utiliza o NodeMCU já utilizava algum outro microcontrolador antes (o Arduino por exemplo), e portanto possui diversos componentes que foram adquiridos juntamente com ou para o hardware em questão. Pois bem, acontece que em alguns raros casos a ligação de um componente em hardwares diferentes não se dá de forma fácil, eu estive procurando bastante sobre como ligar um módulo LCD no NodeMCU e não encontrei nenhum artigo satisfatório. Todos os artigos que eu encontrei faziam apenas alusão ao método de ligar o LCD utilizando o protocolo I2C (I²C) que utiliza apenas 4 fios mas tem a desvantagem de necessitar de uma placa extra, o que a maioria dos LCDs não possui. Após algumas tentativas frustradas, consegui fazer essa ligação (que honestamente é praticamente igual ao Arduino), que não é tão complicada e explico melhor adiante.

Display LCD

Display LCD

 

Algumas informações

Os módulos LCD ou displays de cristal líquido (Liquid Crystal Display – LCD) são componentes eletrônicos bastante comuns e úteis. Consistem de um cristal líquido que é eletricamente controlado e fica enclausurado entre duas lâminas polarizadoras e entre os vidros, além de possuir um eletrodo, que controla os impulsos elétricos. Basicamente esse líquido é transparente quando não está energizado e se torna opaco quando há corrente elétrica, possibilitando assim que os pontos sejam marcados no visor e então palavras ou símbolos possam ser formados.

Os displays LCD como os que usamos hoje nos protótipos eram o que havia de mais avançado em miniaturização e “qualidade” de imagem, não a toa povoaram os celulares por um longo período, até que telas mais modernas surgiram (a maioria ainda é de LCD, mas com novas tecnologias empregadas), ainda está bem vivo na memória de muita gente o famigerado jogo Snake naquela tela monocromática e com pouca iluminação.

No Arduino, os módulos mais utilizados são os que chamamos de 16×2 que levam esse nome por possuírem 16 colunas e 2 linhas (existem outros displays como 20×2, 20×4 e 40×2…). Eles normalmente já possuem um microchip que traduz os dados enviados à ele para letras e números comuns no nosso alfabeto mas existem outros em que se pode colocar qualquer informação em qualquer ponto da tela, guardadas as devidas proporções e a qualidade (vide os displays dos Nokias antigos, 1100, 3310…). Um outro detalhe é que alguns displays possuem backlight e outros não, o backlight como é de se perceber, é uma luz que fica por trás do display e torna mais nítido a sua leitura (retroiluminação) e essa pode ter sua intensidade regulada, dependendo de como for feita a montagem.

Jogo Snake

Jogo Snake

 

Mão na massa

Agora vamos ver na prática como a ligação é feita, como foi dito, é feita de maneira análoga ao Arduino, onde ligamos os pinos de alimentação, de intensidade do display e do backlight e os conectores de comunicação, a única ressalva é que as portas de saída do NodeMCU são de 3,3V, isso não interfere na comunicação, mas a alimentação do display precisa ser de 5V, num primeiro momento fiz alguns testes com 3,3V mas não conseguia ver nenhuma letra na tela, então, troquei a alimentação positiva que estava ligada na porta 3,3V e liguei na porta VIN, lembrando que só foi possível pois estava com o NodeMCU ligado no USB do computador (ou fonte) que entrega os 5V necessários, se a alimentação for feita com algum tipo de bateria com tensão mais baixa, poderá cair no mesmo caso em que a alimentação foi em 3,3V. O cuidado deve ser redobrado quando for utilizada uma tensão maior, e analisar o datasheet do display para conferir a tensão máxima suportada.

Alguns displays possuem muito bem identificados na parte posterior o que são os pinos, mas não são todos, apesar de seguirem o mesmo padrão:

Display 16x2 - Costas

Display 16×2 – Costas

 

 

Nos exemplos da biblioteca LiquidCrystal podemos ver quais são os pinos utilizados para se fazer a conexão com o Arduino:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Então, podemos inferir que os valores a serem passados na inicialização da biblioteca são, nessa ordem: (RS, E (enable), D4, D5, D6, D7), e olhando na tabela das costas do LCD vemos que são os pinos 4, 6, 11, 12, 13, 14 respectivamente, lembrando que esses são os pinos do módulo, os que devem ser subtituídos na biblioteca são os pinos do NodeMCU aos quais eles serão ligados.

 

Pinagem LCD

Pinagem LCD

 

 

Agora analisando os pinos do LCD e os pinos do NodeMCU aos quais eles deverão ser ligados, podemos montar uma tabela:

Função Pino LCD Pino NodeMCU
VSS 1 GND
VCC 2 5V
VEE 3 GND*
RS 4 5 (D1)
RW 5 GND
E 6 4 (D2)
DB4 11 0 (D3)
DB5 12 2 (D4)
DB6 13 14 (D5)
DB7 14 12 (D6)
LED+ 15 5V
LED- 16 GND

 

*O pino VEE corresponde ao controle de brilho dos caracteres no display, é comum ligarmos o terminal central de um potênciometro à esse pino para que possamos regular esse brilho (os outros terminais do potênciometro são ligados ao VCC e GND).

Lembrando que não utilizaremos os pinos DB0, DB1, DB2 e DB3 e os pinos 15 e 16 são destinados à iluminação traseira do display, alguns módulos não contém essa iluminação (backlight).

A ligação do LCD via protoboard no NodeMCU ficaria assim:

Esquema de Montagem

Esquema de Montagem

 

 

Software

As mudanças no código de exemplo são pouquíssimas, utilizando qualquer código que utiliza a biblioteca LiquidCrystal (a mais usada), devemos apenas trocas os pinos na inicialização da biblioteca, de acordo com a tabela acima os pinos RS, E (enable),DB0, DB1, DB2 e DB3 seriam os correspondentes no NodeMCU a: 5, 4, 0, 2, 14, 12, então, no código teremos a seguinte linha:

LiquidCrystal lcd(5, 4, 0, 2, 14, 12);

No mais, não é esperado que haja nenhum problema maior com a execução dos exemplos, segue o código utilizado para testes, baseado no exemplo LiquidCrystal > HelloWorld:


#include <LiquidCrystal.h>

//Aqui ocorreu a mudança dos pinos
LiquidCrystal lcd(5, 4, 0, 2, 14, 16);

void setup() {
lcd.begin(16, 2);
lcd.print(" irving.com.br");
//Seta o cursor para a segunda coluna e segunda linha
lcd.setCursor(1, 1);
lcd.print("NodeMCU + LCD");

}

void loop() {
}

Resultado

 

O circuito montado ficou assim:

Circuito Montado

Circuito Montado