O assunto deste post é o módulo LCD Keypad, que permite usar um display LCD com botões sem a necessidade de fios e protoboard.
Post sobre o funcionamento do LCDClique aqui
Post sobre a fabricação do LCDClique aqui
Funcionamento e uso
Em alguns módulos, o LED de fundo não funciona. Eu tenho um com este problema e ainda não descobri como resolver.
Exemplos de projeto
Testando o LCD Keypad
Simplesmente testa o display LCD e os botões. É preciso usar a biblioteca ‘LiquidCrystal.h’. A parte 7 do tutorial de Arduino mostra como usar esta biblioteca. O algoritmo abaixo para testar o módulo.
#include <LiquidCrystal.h>
//**Configurações do projeto**/**Project settings**
//Estão de acordo com a shield./They are according to shield.
#define allButtons A0
#define Nobtpressed 0
#define btSELECT 1
#define btLEFT 2
#define btUP 3
#define btDOWN 4
#define btRIGHT 5
//Define as conexões e cria o objeto para acesso.
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
const int backLight = 10;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup(){
pinMode(backLight,OUTPUT);
lcd.begin(16,2);
digitalWrite(backLight,HIGH); //Para o LED de fundo ficar aceso.
}
void loop(){
int valButton=analogRead(allButtons); //Leitura analógica de A0.
if ((valButton < 800) && (valButton >= 600)) {
lcd.clear();
lcd.print("Select");
} else if ((valButton < 600) && (valButton >= 400)) {
lcd.clear();
lcd.print("Left");
} else if ((valButton < 400) && (valButton >= 200)) {
lcd.clear();
lcd.print("Down");
} else if ((valButton < 200) && (valButton >= 60)) {
lcd.clear();
lcd.print("Up");
} else if (valButton < 60) {
lcd.clear();
lcd.print("Right");
}
}
Ao pressionar um botão, deve aparecer o nome deste no LCD. O botão reset (RST) reinicia o programa.
Simulador de roda fônica
O que é uma roda fônica? É uma roda dentada, que é ligada ao virabrequim e possui um sensor indutivo ou de efeito Hall para medir o ângulo de rotação do virabrequim. O sensor envia sinais elétricos para uma central eletrônica ou ECU, informando sobre os estágios do motor a combustão e os pontos onde as válvulas abrem e fecham.
Atendendo a pedidos, este é um projeto que gera um sinal de uma roda fônica com um sensor de efeito Hall a 5 volts.
Neste projeto, você escolhe o número de dentes e falhas da roda fônica. O número máximo de dentes é 58 e o número de falhas não deve ser maior que o número de dentes. O potenciômetro varia a frequência do sinal de 1Hz a 170Hz. 170Hz é a frequência de um motor a 10.200 rpm (rotações por minuto).
#include <LiquidCrystal.h>
//**Configurações do projeto**/**Project settings**
//Estão de acordo com a shield./They are according to shield.
#define allButtons A0
#define Nobtpressed 0
#define btSELECT 1
#define btLEFT 2
#define btUP 3
#define btDOWN 4
#define btRIGHT 5
// Define as conexões e cria o objeto para acesso
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
const int backLight = 10;
int signal=11;
unsigned int Tnumber=0; //Número de dentes.
unsigned int Fnumber=1; //Número de falhas.
const int pot=A1;
int potstate=0;
int frequency=0;
int halfPeriod=0;
int running=0;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup(){
pinMode(backLight,OUTPUT);
pinMode(signal,OUTPUT);
pinMode(pot,INPUT);
lcd.begin(16,2);
lcd.print("Phonic wheel:");
digitalWrite(backLight,HIGH);
Serial.begin(9600);//só para testar o potenciômetro.
}
void loop(){
lcd.setCursor(0,1);
lcd.print("Teeth:");
lcd.print(Tnumber);//Mostra o número de dentes.
lcd.setCursor(8,1);
lcd.print("Fails:");
lcd.print(Fnumber);//Mostra o número de falhas.
potstate=analogRead(pot);
frequency=map(potstate,0,1023,1,170);//A função map faz com que a variação do //potenciômetro seja de 1Hz a 170Hz.
halfPeriod=1000000/(2*frequency); //Calculando o meio periodo.
int valButton=analogRead(allButtons);
if ((valButton < 800) && (valButton >= 600)) { //Botão SELECT
running=1; //Transmite o sinal ao apertar SELECT.
} else if ((valButton < 600) && (valButton >= 400)) { //Botão LEFT
Tnumber=Tnumber-1;
delay(500);
} else if ((valButton < 400) && (valButton >= 200)) {//Botão DOWN
Tnumber=Tnumber-1;
delay(500);
} else if ((valButton < 200) && (valButton >= 60)) {//Botão UP
Fnumber=Fnumber+1;
delay(500);
} else if (valButton < 60) { //Botão RIGHT
Tnumber=Tnumber+1;
delay(500);
}
if(Fnumber>=Tnumber){
Tnumber=1;
Fnumber=0;
}
if(Tnumber>58){
Tnumber=0;
lcd.setCursor(7,1);
lcd.print(" ");
}
if(running==1){
phonicwheel();
}
}
void phonicwheel(){
lcd.setCursor(0,1);
lcd.print("Running... ");
for(int i=0;i<(Tnumber-Fnumber);i++){
digitalWrite(signal,HIGH);
delayMicroseconds(halfPeriod);
digitalWrite(signal,LOW);
delayMicroseconds(halfPeriod);
}
}
Eu não testei este simulador em uma ECU de um veículo. Fiz este projeto apenas para fins didáticos. Portanto, não sei se funcionaria em uma ECU de verdade. Se quiser, você pode testar por sua conta e risco.