Arduino Tutorial - LDC - Menu
by Crazy Taz Projects in Circuits > Arduino
10044 Views, 11 Favorites, 0 Comments
Arduino Tutorial - LDC - Menu
Este é um tutorial onde iremos mostrar-vos uma montagem em que o principal propósito é explicar o funcionamento do seu código, tendo este o objectivo de conceber uma estrutura de funcionamento para um conjunto de páginas vulgarmente chamado de menu. A sua disposição organizada a facilitar a visualização e navegação entre as suas páginas como também ajuda na elaboração dos códigos de Arduino.
Para visualizar as páginas deste menu será utilizado um LCD1602 e para podermos navegar entre as páginas do nosso menu são utilizados alguns botões de pressão ou "Push Button", podendo saltar entre páginas visualizando a alterando a sua informação.
A estrutura e interligação entre as páginas do menu deve ser elaborada previamente ajustando-as às suas funcionalidades, este procedimento deverá ser utilizado em qualquer tipo montagem, mesmo que esta seja pequena, pois facilita a organização do código a quando da sua elaboração. (Ver imagem acima).
Caso tenham duvidas ou queiram saber mais sobre as características e configurações de LCD1602, vejam os seguintes tutoriais e a sua datasheet (Ver ficheiros abaixo):
Arduino Tutorial - Clock - LCD
https://www.instructables.com/id/Arduino-Tutorial-Clock-LCD/
ou
Arduino Tutorial - LCD - Temperature Sensor
https://www.instructables.com/id/Arduino-Tutorial-LCD-Temperature-Sensor/
Downloads
Montagem
Como sempre em montagem complexas utilizamos na montagem uma pequena "Breadboard" onde colocamos as alimentações positivas e negativas distribuindo-as mais facilmente para os todos os componentes da montagem.
Depois começamos por colocar o LCD na montagem, pois este é o componente que necessita de mais ligações e por fim colocamos os botões e as suas respectivas resistências eléctricas ligando-os aos pinos de sinal digital do Arduino (Ver imagem acima).
Material necessário:
- 1x Arduino UNO;
- 1x Cabo USB;
- 1x Breadboard;
- 1x LCD1602;
- 1x Resistência 220Ω;
- 1x Potenciómetro 10KΩ;
- 3x Botões (Push Button);
- 3x Resistências 1KΩ.
Instalação do LCD1602:
Cada pino do LCD tem uma função especifica e como podem observar na imagem da montagem completa não são utilizamos todos os seus pinos, assim para explicar mais facilmente o funcionamento do LCD, agrupamos os seus pinos em 3 grupos, o grupo Pinos de Alimentação, o de Pinos de Comunicação e de Pinos de Informação (Ver legenda acima).
Pinos de Alimentação:
- GND;
- VCC;
- V0;
- LED - ou A (Anodo);
- LED + ou K (Catodo).
A alimentação do LCD é realizada através dos pinos GND e VCC, devendo ter o pino VCC uma tensão de 5V que será fornecida pelo Arduino UNO, pois este os seus pinos de alimentação tem tensões estáveis e protegidas não permitindo que existam sobrecargas ou curto-circuitos.
O Pino V0 tem como função ajustar o contraste dos caracteres do LCD, para podermos controlar esse ajuste ligamos neste pino uma resistência variável de 10KΩ com uma montagem de um divisor de tensão, alterando assim a tensão a tensão no pino V0 entre os 0 e 5V (Ver imagem acima).
Este tipo de LCD tem um LED como luz de fundo sendo este alimentado através dos pinos A e K fornecida também pelo Arduino, no entanto, como explicado em tutoriais anteriores devemos ligar o LED em série com uma resistência de 220Ω, para que o brilho não seja demasiado intenso e reduzir a probabilidade de este se danificar.
Pinos de Comunicação:
- RS (Register Select);
- R/W (Read / Write);
- E (Enable).
Nos pinos de comunicação apenas teremos de ter mais atenção ao pino R/W, pois este deve estar ligado a GND para que seja permitido escrever no LCD, aparecendo assim os caracteres, caso contrario podemos estar a ler o dados guardados na sua memoria interna ficando o LCD em branco.
Pinos de Informação:
- D0;
- D1;
- D2;
- D3;
- D4;
- D5;
- D6;
- D7.
Nesta montagem são utilizados todos os pinos de alimentação e comunicação, no entanto, apenas utilizamos metade dos pinos de informação, isto é possível através da utilização no código da biblioteca LiquidCrystal.h, esta permite ler o "Byte" ou 8bits de informação enviado pelo Arduino, através da divisão deste em 2 partes, ou seja, são lidos 4bits de cada vez.
Para isso esta biblioteca utiliza os pinos de comunicação, de modo a que o LCD consiga saber qual é a forma que irá receber a informação, ou seja, se com 8bits através dos pinos D0 a D7 ou com 4bits através dos pinos D4 a D7).
Instalação dos botões:
Terminada a instalação do LCD, colocamos na "Breadboard" os 3 botões de pressão e as suas respectivas resistências de 1KΩ e ligamos cada um dos botões a um dos pinos de sinal digital do Arduino, sendo assim estes os nossos controlos de navegação entre as várias páginas do menu. Para tornar mais intuitiva a utilização dos botões, estes devem ser dispostos e identificados consoante a sua função, como por exemplo, botão MENOS ou "BACK", botão MENU ou "SELECT" e ainda botão MAIS ou "FORWARD".
Para saber mais sobre os pinos de sinal digital do Arduino definidos como entradas e onde são explicamos esta características mais detalhadamente, verifiquem um tutorial anterior:
Arduino Tutorial - Digital Input - Button - Monitor Serial
https://www.instructables.com/id/Arduino-Tutorial-Digital-Input-Button-Monitor-Seri/
Código
Estando a montagem completa ligamos o cabo USB e carregamos o código na placa do Arduino, mas primeiro aqui vai a sua explicação, como sempre começamos por importar a biblioteca LiquidCrystal.h através do gestor de bibliotecas do Arduino IDE. Esta biblioteca facilita muito a programação do código para o LCD, sendo apenas necessário configurar 2 funções para que o LCD fique a funcionar em pleno, que caso contrario seria muitas mais.
//Definir os pinos de comunicação e informação do LCD: LiquidCrystal lcd ("RS", "E", "D7", "D6", "D5", "D4");
e
void setup(){ //Inicia a comunicação com LCD 16x2: lcd.begin(2, 16); }
Depois para escrever no LCD será necessário primeiro definir o local onde se começará a escrever, ou seja, qual a coluna e a linha, só depois imprimimos o texto que queremos, tendo em atenção que este LCD apenas tem 16 colunas e 2 linhas, no caso do texto passar esses limites do LCD não serão visíveis todos caracteres.
void loop(){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print("Texto"); }
Agora para configurar os pinos de sinal digital do Arduino como entradas utilizamos da função PinMode colocando a palavra "INPUT", bastando colocar esta função para cada um dos nossos botões do menu.
//Definição do tipo de pino (Entrada): pinMode(Botao_Menos, INPUT); pinMode(Botao_Menu, INPUT); pinMode(Botao_Mais, INPUT);
Depois de definir quais os pino do Arduino como entradas, utilizamos a função DigitalRead tendo esta como objectivo ler o estado dos pinos de entrada, verificando assim se estes estão em nível baixo ou nível alto "LOW" ou "HIGH".
//Se a leitura do pino for LOW ou nível baixo: if (digitalRead(Pino_Entrada) == LOW){ }
ou
//Se a leitura do pino for HIGH ou nível alto: if (digitalRead(Pino_Entrada) == HIGH){ }
Eis então o código completo para da nossa montagem, onde são utilizados todos os conceitos descritos anteriormente, criando um menu onde é possível navegar pelas suas páginas e visualizar suas diferentes informações num LCD e tudo isto através dos 3 botões da montagem.
#include <LiquidCrystal.h> //Importar a LCD library. //Definir os pinos de comunicação e informação do LCD. LiquidCrystal lcd(8, 9, 10, 11, 12, 13); int Botao_mais = 2; //Variável para selecção do pino digital (Botão 1). int Botao_menu = 3; //Variável para selecção do pino digital (Botão 2). int Botao_menos = 4; //Variável para selecção do pino digital (Botão 3). int Num_Menu = 0; //Variável para selecção da página. int Num_titulo = 1; //Variável para selecção do titulo da página. //Variável para os títulos das páginas. char* Titulo_Menu[] = {"Menu - 0", "Pagina - 1", "Menu - 2", "Menu - 3", "Pagina - 4", "Pagina - 2.1", "Pagina - 2.2", "Pagina - 3.1", "Pagina - 3.2", "Pagina - 3.3"}; //Correr a função SETUP apenas uma vez após ser pressionado Reset: void setup(){ //Iniciar a Comunicação com LCD: lcd.begin(2, 16); //Definição do tipo de pino (Saída ou entrada): pinMode(Botao_mais, INPUT); //Definição do tipo de pino (Saída ou entrada): pinMode(Botao_menu, INPUT); //Definição do tipo de pino (Saída ou entrada): pinMode(Botao_menos, INPUT); } //Correr a função LOOP repetidamente: void loop(){ //Correr a função: Pagina_Menu_0(); //Correr a função: Pagina_1(); //Correr a função: Pagina_Menu_2(); //Correr a função: Pagina_2_1(); //Correr a função: Pagina_2_2(); //Correr a função: Pagina_Menu_3(); //Correr a função: Pagina_3_1(); //Correr a função: Pagina_3_2(); //Correr a função: Pagina_3_3(); //Correr a função: Pagina_4(); //Atraso para o próximo passo: delay(800); } //Página do Menu - 0: void Pagina_Menu_0(){ //Condição para abrir página: if (Num_Menu == 0){ //Apaga a informação do LCD. lcd.clear(); //Condição para escrever no LCD os nomes das páginas: if (Num_titulo > 0 & Num_titulo < 3){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 0); //Escreve no LCD: lcd.print(Titulo_Menu[1]); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 1); //Escreve no LCD: lcd.print(Titulo_Menu[2]); } //Condição para escrever no LCD os nomes das páginas: else if (Num_titulo > 2 & Num_titulo < 5){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 0); //Escreve no LCD: lcd.print(Titulo_Menu[3]); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 1); //Escreve no LCD: lcd.print(Titulo_Menu[4]); } //Condição para selecionar página 1 e 3: if (Num_titulo == 1 || Num_titulo == 3){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print(">"); } //Condição para selecionar página 2 e 4: else if (Num_titulo == 2 || Num_titulo == 4){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 1); //Escreve no LCD: lcd.print(">"); } //Condição para acção dos botões na página: if (digitalRead(Botao_mais) == HIGH){ //Condição para selecionar página: if (Num_titulo >= 1){ //Altera o valor de selecção do título do menu. Num_titulo = Num_titulo + 1; } //Condição para selecionar página: if (Num_titulo > 4){ //Altera o valor de selecção do título do menu. Num_titulo = 4; } } //Condição para acção dos botões na página: if (digitalRead(Botao_menos) == HIGH){ //Condição para selecionar página: if (Num_titulo < 1){ //Altera o valor de selecção do título do menu. Num_titulo = 1; } //Condição para selecionar página: if (Num_titulo <= 4){ //Altera o valor de selecção do título do menu. Num_titulo = Num_titulo - 1; } } //Condição para acção dos botões na página: if (digitalRead(Botao_menu) == HIGH){ //Condição para selecionar página: if (Num_titulo == 1){ //Altera o valor de selecção do menu. Num_Menu = 1; } //Condição para selecionar página: else if (Num_titulo == 2){ //Altera o valor de selecção do título do menu. Num_titulo = 5; //Altera o valor de selecção do menu. Num_Menu = 2; } //Condição para selecionar página: else if (Num_titulo == 3){ //Altera o valor de selecção do título do menu. Num_titulo = 7; //Altera o valor de selecção do menu. Num_Menu = 3; } //Condição para selecionar página: else if (Num_titulo == 4) { //Altera o valor de selecção do menu. Num_Menu = 4; } } } } //Pagina do Menu - 1: void Pagina_1(){ //Condição para abrir página: if (Num_Menu == 1){ //Apaga a informação do LCD. lcd.clear(); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print(Titulo_Menu[Num_titulo]); lcd.print(":"); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 1); //Escreve no LCD: lcd.print("Info:TEXTO..."); //Condição para acção dos botões na página: if (digitalRead(Botao_menos) == HIGH){ //Altera o valor de selecção do menu. Num_Menu = 0; } //Condição para acção dos botões na página: if (digitalRead(Botao_menu) == HIGH){ //Não realiza nenhuma acção. } //Condição para acção dos botões na página: if (digitalRead(Botao_mais) == HIGH){ //Não realiza nenhuma acção. } } } //Página do Menu - 2: void Pagina_Menu_2(){ //Condição para abrir página: if (Num_Menu == 2){ //Apaga a informação do LCD. lcd.clear(); //Condição para escrever no LCD os nomes das páginas: if (Num_titulo == 5 || Num_titulo == 6){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 0); //Escreve no LCD: lcd.print(Titulo_Menu[5]); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 1); //Escreve no LCD: lcd.print(Titulo_Menu[6]); } //Condição para selecionar página 2.1: if (Num_titulo == 5){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print(">"); } //Condição para selecionar página 2.2: else if (Num_titulo == 6){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 1); //Escreve no LCD: lcd.print(">"); } //Condição para acção dos botões na página: if (digitalRead(Botao_mais) == HIGH){ //Condição para selecionar página: if (Num_titulo == 5){ //Altera o valor de selecção do título do menu. Num_titulo = Num_titulo + 1; } //Condição para selecionar página: else if (Num_titulo == 6){ //Altera o valor de selecção do título do menu. Num_titulo = Num_titulo - 1; } } //Condição para acção dos botões na página: if (digitalRead(Botao_menos) == HIGH){ //Altera o valor de selecção do título do menu. Num_titulo = 2; //Altera o valor de selecção do menu. Num_Menu = 0; } //Atraso para o próximo passo: delay(800); //Condição para acção dos botões na página: if (digitalRead(Botao_menu) == HIGH){ //Condição para selecionar página: if (Num_titulo == 5){ //Altera o valor de selecção do menu. Num_Menu = 5; } //Condição para selecionar página: else if (Num_titulo == 6){ //Altera o valor de selecção do menu. Num_Menu = 6; } } } } //Página do Menu - 2.1: void Pagina_2_1(){ //Condição para abrir página: if (Num_Menu == 5){ //Apaga a informação do LCD. lcd.clear(); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print(Titulo_Menu[5]); lcd.print(":"); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 1); //Escreve no LCD: lcd.print("Info:TEXTO..."); //Condição para acção dos botões na página: if (digitalRead(Botao_menos) == HIGH) { //Altera o valor de selecção do menu. Num_Menu = 2; } //Condição para acção dos botões na página: if (digitalRead(Botao_menu) == HIGH) { //Não realiza nenhuma acção. } //Condição para acção dos botões na página: if (digitalRead(Botao_mais) == HIGH) { //Não realiza nenhuma acção. } } } //Página do Menu - 2.2: void Pagina_2_2() { //Condição para abrir página: if (Num_Menu == 6){ //Apaga a informação do LCD. lcd.clear(); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print(Titulo_Menu[6]); lcd.print(":"); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 1); //Escreve no LCD: lcd.print("Info:TEXTO..."); //Condição para acção dos botões na página: if (digitalRead(Botao_menos) == HIGH) { //Altera o valor de selecção do menu Num_Menu = 2; } //Condição para acção dos botões na página: if (digitalRead(Botao_menu) == HIGH) { //Não realiza nenhuma acção. } //Condição para acção dos botões na página: if (digitalRead(Botao_mais) == HIGH) { //Não realiza nenhuma acção. } } } //Página do Menu - 3: void Pagina_Menu_3(){ //Condição para abrir página: if (Num_Menu == 3){ //Apaga a informação do LCD. lcd.clear(); //Condição para escrever no LCD os nomes das páginas: if (Num_titulo > 6 & Num_titulo < 9){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 0); //Escreve no LCD: lcd.print(Titulo_Menu[7]); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 1); //Escreve no LCD: lcd.print(Titulo_Menu[8]); } //Condição para escrever no LCD os nomes das páginas: else if (Num_titulo == 9){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 0); //Escreve no LCD: lcd.print(Titulo_Menu[9]); } //Condição para selecionar pagina 3.1: if (Num_titulo == 7 || Num_titulo == 9){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print(">"); } //Condição para selecionar pagina 3.2: else if (Num_titulo == 8){ //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 1); //Escreve no LCD: lcd.print(">"); } //Condição para acção dos botões na página: if (digitalRead(Botao_mais) == HIGH){ //Condição para selecionar página: if (Num_titulo >= 7){ //Altera o valor de selecção do título do menu. Num_titulo = Num_titulo + 1; } //Condição para selecionar página: if (Num_titulo > 9){ //Altera o valor de selecção do título do menu. Num_titulo = 7; } } //Condição para acção dos botões na página: if (digitalRead(Botao_menos) == HIGH){ //Altera o valor de selecção do titulo do menu. Num_titulo = 3; //Altera o valor de selecção do menu. Num_Menu = 0; } //Atraso para o próximo passo: delay(800); //Condição para acção dos botões na página: if (digitalRead(Botao_menu) == HIGH){ //Condição para selecionar página: if (Num_titulo == 7){ //Altera o valor de selecção do menu. Num_Menu = 7; } //Condição para selecionar página: else if (Num_titulo == 8){ //Altera o valor de selecção do menu. Num_Menu = 8; } //Condição para selecionar pagina: else if (Num_titulo == 9){ //Altera o valor de selecção do menu. Num_Menu = 9; } } } } //Página do Menu - 3.1: void Pagina_3_1() { //Condição para abrir página: if (Num_Menu == 7){ //Apaga a informação do LCD. lcd.clear(); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print(Titulo_Menu[7]); lcd.print(":"); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 1); //Escreve no LCD: lcd.print("Info:TEXTO..."); //Condição para acção dos botões na página: if (digitalRead(Botao_menos) == HIGH) { //Altera o valor de selecção do menu. Num_Menu = 3; } //Condição para acção dos botões na página: if (digitalRead(Botao_menu) == HIGH) { //Não realiza nenhuma acção. } //Condição para acção dos botões na página: if (digitalRead(Botao_mais) == HIGH) { //Não realiza nenhuma acção. } } } //Página do Menu - 3.2: void Pagina_3_2() { //Condição para abrir página: if (Num_Menu == 8){ //Apaga a informação do LCD. lcd.clear(); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print(Titulo_Menu[8]); lcd.print(":"); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 1); //Escreve no LCD: lcd.print("Info:TEXTO..."); //Condição para acção dos botões na página: if (digitalRead(Botao_menos) == HIGH) { //Altera o valor de selecção do menu. Num_Menu = 3; } //Condição para acção dos botões na página: if (digitalRead(Botao_menu) == HIGH) { //Não realiza nenhuma acção. } //Condição para acção dos botões na página: if (digitalRead(Botao_mais) == HIGH) { //Não realiza nenhuma acção. } } } //Página do menu - 3.3: void Pagina_3_3() { //Condição para abrir página: if (Num_Menu == 9){ //Apaga a informação do LCD. lcd.clear(); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print(Titulo_Menu[9]); lcd.print(":"); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 1); //Escreve no LCD: lcd.print("Info:TEXTO..."); //Condição para acção dos botões na página: if (digitalRead(Botao_menos) == HIGH) { //Altera o valor de selecção do menu. Num_Menu = 3; } //Condição para acção dos botões na página: if (digitalRead(Botao_menu) == HIGH) { //Não realiza nenhuma acção. } //Condição para acção dos botões na página: if (digitalRead(Botao_mais) == HIGH) { //Não realiza nenhuma acção. } } } //Página do Menu - 4: void Pagina_4() { //Condição para abrir página: if (Num_Menu == 4){ //Apaga a informação do LCD. lcd.clear(); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(0, 0); //Escreve no LCD: lcd.print(Titulo_Menu[Num_titulo]); lcd.print(":"); //Define a coluna (em 16) e a linha (em 2) do LCD onde escrever: lcd.setCursor(1, 1); //Escreve no LCD: lcd.print("Info:TEXTO..."); //Condição para acção dos botões na página: if (digitalRead(Botao_menos) == HIGH){ //Altera o valor de selecção do menu. Num_Menu = 0; } //Condição para acção dos botões na página: if (digitalRead(Botao_menu) == HIGH){ //Não realiza nenhuma acção. } //Condição para acção dos botões na página: if (digitalRead(Botao_mais) == HIGH){ //Não realiza nenhuma acção. } } }
Caso queiram saber mais ou tenham dúvidas sobre estas ou outras referências no código, vejam a sua explicação detalhada no site oficial do Arduino, através da ligação https://www.arduino.cc/en/Reference/HomePage.
Procurem os nossos tutoriais acerca do Arduino, onde são explicadas diversas montagens e o funcionamento dos seus componentes, já agora visitem também o nosso canal no Youtube, Instagram, Facebook ou Twitter.
Abraço e bons projectos.