Arduino MKR1000 :: Interface a Display de Cristais Lı́quidos (LCD)
SDM/SE/TSE
Novembro 2023
1 Objectivo
Elaborar um circuito de teste e respectivo programa de exploração para um interface com um display de
cristais lı́quidos (LCD) de 16 colunas e 2 linhas (16x2). Á semelhança do trabalho da semana anterior,
o presente trabalho deve ser encarado como preparatório para um trabalho futuro mais elaborado. Para
tal o aluno necessita de compreender como funciona o display LCD e como é realizado o seu interface e
programação.
1.1 Enquadramento
O LCD 16x2 que usaremos neste trabalho não possui um controlador com interface em bus série (I2C ou SPI).
Estas normas de comunicação são muitas vezes usadas para comunicar com sensores e actuadores (como o
caso deste LCD) permitindo uma simplificação do esquema de ligações. Ao invés, o interface com o LCD é
realizada por intermédio de linhas digitais dedicadas num protocolo de comunicação de 4 bits de dados.
O esquema de ligações desta componente é semelhante ao da figura (e standard para este tipo de displays de
controlo por 4 ou mais bits).
Da observação do esquema de ligações é possı́vel encontrar conjuntos de sinais
1 e 2 são pinos de alimentação do LCD
3 (no esquema designado VEE mas no nosso LCD designado V0) é um pino de controlo de contraste
do display
4, 5 e 6 são sinais de controlo (Register Select, Read/Write e Enable, respectivamente)
7 até 14 são sinais de dados. Repare-se que nem todos são usados num protocolo de 4 bits.
15 e 16 são pinos de controlo de brilho da retroiluminação
1.2 Esquema de ligações do LCD
Atendendo a esta descrição, optamos por realizar a seguinte ligação de alguns dos pinos
1 - Vss → GND
2 - Vdd → +5V (nesta montagem usaremos os +5V disponı́veis no pino do Arduino)
3 - V0 (na figura VEE) → GND
4 - RS → IO digital do Arduino 0
1
1 OBJECTIVO
5 - R/W → GND (isto é sempre em modo de escrita - Write)
6 - E → IO digital do Arduino 1
7 - DB0 → não usada
8 - DB1 → não usada
9 - DB2 → não usada
10 - DB3 → não usada
11 - DB4 → IO digital do Arduino 2
12 - DB5 → IO digital do Arduino 3
13 - DB6 → IO digital do Arduino 4
14 - DB7 → IO digital do Arduino 5
15 - LED+ → usar uma resistência de 220R para ligar a +5V
16 - LED- → GND
Este esquema de ligações é o suficiente para efectuar a ligação ao módulo do Arduino (MKR1000). Repare-se
que os pinos 7 a 10 apenas são usados em protocolos de 8 bits de dados pelo que não usaremos no nosso caso
(não temos tantos sinais digitais disponı́veis no módulo usado).
2
3 PROGRAMAÇÃO DO LCD
1.3 Material
Módulo Arduino MKR1000. Iremos usar alguns componentes do kit
https://create.arduino.cc/projecthub/products/arduino-mkr-iot-bundle?f=1
Ambiente de desenvolvimento IDE do módulo Arduino.
Componentes electrónicos
– Display LCD 16x2
– Resistência 220R
– fios de ligação
2 Montagem do LCD
Siga os seguinte passos na montagem do display de cristais liquidos
a. Certifique-se que o Arduino se encontra desligado do computador garantindo que este não se encontra
alimentado (LEDs apagados)
b. Monte o LCD na breadboard onde tem o MKR1000. Neste circuito iremos usar uma breadboard maior
para garantir que temos espaço para ligar todos os pinos dos 2 elementos (MKR1000 e Arduino)
c. Faça as ligações descritas na listagen anterior (secção Esquema de ligações do LCD)
d. Confirme que todas as ligações estão correctas e não observa curto-circuitos. Se tiver dúvidas peça ao
professor para confirmar as ligações numa primeira tentativa.
e. Ligue o Arduino ao computador.
3 Programação do LCD
Para controlar o LCD vamos fazer uso de funções previamente definidas para o efeito. Vamos analisar o que
deve conter um exemplo básico de configuração e controlo do LCD
Exemplo Hello World
#include <LiquidCrystal.h>
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);
void setup()
{
lcd.begin(16,2);
lcd.setCursor(0, 0); // Lcd first row is 0
lcd.print("hello, world!");
3
3 PROGRAMAÇÃO DO LCD
void loop() {}
Assim devemos:
Incluir a biblioteca das funções pré-definidas para interagir com o LCD
#include <LiquidCrystal.h>
Inicializar o LCD
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);
Repare-se que lcd cria um objecto do tipo LiquidCrystal que recebe os parâmetros
LiquidCrystal(rs, enable, d4, d5, d6, d7)
ver https://www.arduino.cc/en/Reference/LiquidCrystalConstructor
Inicializar o LCD
lcd.begin(16,2);
Indicar qual a posição de inicio de escrita
lcd.setCursor(0, 0);
Escrever a mensagem
lcd.print(”hello, world!”);
Repare que a função loop() não tem instruções pelo que a mensagem que observa deve ser estática.
Experimente escrever outras mensagens no LCD em diferentes posições (primeira, segunda linha e em várias
colunas).
Por exemplo, tente reproduzir o seguinte aspecto da mensagem escrita
4
4 PROGRAMAÇÃO DE CARATERES ESPECIAIS
3.1 Sequência de Mensagens
Verifique o que observa com o seguinte código
#include <LiquidCrystal.h>
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);
void setup()
{
lcd.begin(16,2);
lcd.clear();
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
}
Verifique o que acontece quando junta numa mesma mensagem caracteres fixos e variáveis.
int time; % variavel global
void loop() {
lcd.setCursor(0, 1);
lcd.print("Segundos:");
lcd.print(millis() / 1000);
}
Verifique o que sucede quando adiciona outras funções da biblioteca de funções LiquidCrystal, como por
exemplo:
lcd.scrollDisplayLeft();
% ou
lcd.scrollDisplayRight();
Não se esqueço do delay!
4 Programação de carateres especiais
Para gerar caracteres especiais devemos criar um o caracter na forma de uma variável global de 8 elementos
binarios (cada rectângulo do display tem 5 por 8 pixels). Neste caso vamos criar um array de bytes com 8
elementos, sendo cada elemento composto por 5 bits. O prefizo 0b significa que a informação introduzida é
reconhecida como uma sequência de bits
byte Sino[8] = {
0b00100,
0b01110,
0b01110,
5
4 PROGRAMAÇÃO DE CARATERES ESPECIAIS
0b01110,
0b11111,
0b00000,
0b00100,
0b00000
};
Este array corresponde à seguinte matriz de pixels 5x8:
De seguida, necessita de criar este caractere para que o possa usar no programa. Isto deverá ser feito na
rotina de setup() após a inicialização do LCD.
lcd.createChar(0, Sino);
A partir deste momento podemos usar o caratere criado referenciando-se como byte(0). Verifique o que
observa se usar a função
lcd.setCursor(0, 1);
lcd.write(byte(0));
O byte(0) representa o caractere de um sino definido atrás. Poderá criar outros icones ou simbolos bastando
para tal criar outro(s) array(s) de bytes com a distribuição gráfica pretendida. Pode criar os bytes 0, 1, 2,
etc.