IoT e Makers

12 set, 2014

Método de entrada ASCII com um potenciômetro – Arduino

Publicidade

Esse é um projeto de método de entrada de caracteres ASCII para o Arduino utilizando um potenciômetro para escolher o caractere. Esse projeto pode ser ainda mais simples, utilizando apenas um botão e um potenciômetro para inserir qualquer caractere da tabela ASCII. Nesse aqui, no entanto, eu adicionei um botão para automaticamente inserir o caractere ESPAÇO, dividi a tabela ASCII em categorias (tipos) de caracteres e adicionei um botão para alternar entre essas/esses categorias/tipos, e ainda um terceiro botão que serve para apagar um caractere (ou, se pressionado por mais de meio segundo, toda a linha).

Esse método de entrada pode ser usado em substituição a um teclado para inserir pequenos grupos de caracteres, como para colocar senhas, por exemplo, em algum sistema de controle de acesso.

Seguem o código, o diagrama e um vídeo do projeto montado e funcionando.

#include <LiquidCrystal.h>

// configura os pinos do LCD

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

int inserir = 2;
int apagar = 3;
int espaco = 4;
int sel_tipo = 5;
int tipo = 0;
char palavra[16];
int i = 0;

void setup() {
lcd.begin(16,2);
pinMode(inserir, INPUT_PULLUP);
pinMode(apagar, INPUT_PULLUP);
pinMode(sel_tipo, INPUT_PULLUP);
pinMode(espaco, INPUT_PULLUP);
}

void loop() {

lcd.setCursor(0,0); // seta a posicao do cursor para o inicio

if(digitalRead(sel_tipo) == LOW){ // quando o botao ‘sel_tipo’ eh pressionado
delay(500); // o delay de meio segundo eh para evitar dupla execucao da funcao
if(tipo < 6){
tipo++;
} else {
tipo = 0;
}
}

int primeiro = 65; // valor que inicia o mapeamento da entrada analogica
int ultimo = 90; // valor que termina o mapeamento da entrada analogica

switch(tipo){ // esse switch vai definir as faixas de mapeamento pela tabela ASCII
case 0:
primeiro = 65;
ultimo = 90;
lcd.print(“ABC”);
break;

case 1:
primeiro = 97;
ultimo = 122;
lcd.print(“abc”);
break;

case 2:
primeiro = 48;
ultimo = 57;
lcd.print(“123”);
break;

case 3:
primeiro = 33;
ultimo = 47;
lcd.print(“!*.”);
break;

case 4:
primeiro = 58;
ultimo = 64;
lcd.print(“>?@”);
break;

case 5:
primeiro = 91;
ultimo = 96;
lcd.print(“[\\]“);
break;

case 6:
primeiro = 123;
ultimo = 126;
lcd.print(“{|}”);
break;
}

/* Esse bloco eh o responsavel pela selecao do caractere.
A funcao ‘map’ ira mapear o valor analogica lida em ‘A0′, que na transformacao
analogico-digital interna do ATMEGA varia de 0 a 1023, para a faixa escolhida pelo
‘switch’ logo acima, que eh escolhida pressionando o botao ‘sel_tipo’. Por exemplo,
se ‘tipo’ for igual a 0, o valor de ‘analogRead(A0)’ sera transportado da faixa de
0 a 1023 para a faixa de 65 a 90, ou seja, de A a Z.
*/
char caractere = map(analogRead(A0), 0, 1023, primeiro, ultimo);
lcd.setCursor(14,0);
lcd.print(caractere);

if(digitalRead(inserir) == LOW){ // quando o botao ‘inserir’ eh pressionado
delay(500);
if(i == 15){ // se o cursor esta no final, nao insere caractere e avisa!
lcd.clear();
lcd.setCursor(0,0);
lcd.print(” CHEGA! Delete “);
lcd.setCursor(0,1);
lcd.print(” alguma coisa! “);
delay(700);
lcd.clear();
} else {
palavra[i] = caractere; // insere caractere na string ‘palavra’
i++;
}
}

if(digitalRead(espaco) == LOW){ // adiciona o caractere ESPACO quando
delay(500); // o botao ‘espaco’ eh pressionado
if(i == 15){ // se o cursor esta no final do display, nao insere caractere e avisa!
lcd.clear();
lcd.setCursor(0,0);
lcd.print(” CHEGA! Delete “);
lcd.setCursor(0,1);
lcd.print(” alguma coisa! “);
delay(700);
lcd.clear();
} else {
palavra[i] = 32; // insere caractere ESPACO -> ASCII 32
i++;
}
}

if(digitalRead(apagar) == LOW){ // quando o botao ‘apagar’ eh pressionado
if(i > 0){ // testa se existe algo para apagar
i–;
}
palavra[i] = false; // ‘unseta’ o caractere da posicao ‘i’ no vetor/string ‘palavra’
delay(500);
if(digitalRead(apagar) == LOW){ // se o botao ‘apagar’ ficar 
for(int j=0;j<16;j++){ // pressionado mais de meio-segundo
palavra[j] = false; // ‘unseta’ todos os caracteres do vetor/string ‘palavra’
i = 0; // e retorna o indice ‘i’ para o inicio do vetor
}
}
lcd.clear(); // eh importante para nao deixar o cursor perdido
}

// muda para a segunda linha do LCD, mostra a palavra (se existir) e o cursor
lcd.setCursor(0,1);
lcd.print(palavra);
lcd.print(“_”);
}

Esse é o diagrama que gerei com o Fritzing. Os botões do tipo “pushbutton” estão na ordem: ‘sel_tipo’, ‘inserir’, ‘espaco’, ‘apagar’ (ver comentários do código). O display LCD está com um brilho fixo através do resistor de 1k no terceiro pino, caso queira colocar um potenciômetro para ajuste, sem problemas! Consulte a página do Arduino sobre isso, caso tenha dúvida.

ascii_input_pot_bb1

Aqui está o vídeo de demonstração do projeto. Nele aparecem alguns componentes (resistor e LM7805 – tinha mais um LED, mas tirei pra fazer o vídeo) que adicionei para fazer o projeto funcionar fora da porta USB – que está servindo para alimentar o circuito com 5V -, alimentando com uma bateria de 7.4 V sucateada de um tablet.