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.
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.