Índice:
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
Cada vez que vejo um teclado, ele vem com muitos pinos, é um grande desperdício de seus pinos do Arduino, então podemos rodar um teclado com um e apenas um pino?. A resposta está aqui.
Etapa 1: Lista de materiais
Hardware:
01 Arduino UNO
02 tábuas de pão
01 LCD com I2C
16 botões de pressão
04 resistores 1,5 kΩ
04 resistores 620 Ω
04 resistores 220 Ω
08 resistores 100 Ω
01 resistor 1 kΩ
07 fios de ligação
Programas:
Arduino IDE instalado no seu PC
Etapa 2: Esquema e Cicruit
A ideia geral é que temos 4 * 4 matrizes de botões conectados verticalmente ao aterramento pelo cabo direito e horizontalmente pelo outro cabo (o cabo do botão) e resistores de 1,5 kΩ, 620Ω, 220Ω e 100Ω, as extremidades de as 4 filas são conectadas por quatro resistores de 100Ω, conforme mostrado no esquema.
Cada vez que você pressiona um botão, você fecha o circuito e a corrente passa por um caminho diferente e por uma cadeia de resistores diferente, é por isso que o pino A0 recebe uma leitura analógica diferente para cada botão. Tudo o que você precisa agora é codificação.
Etapa 3: O Código
#incluir
#incluir
LiquidCrystal_I2C lcd (0x3f, 20, 4);
Botão int = A0;
int readvalue;
void setup ()
{
Serial.begin (9600);
lcd.begin ();
pinMode (botão, INPUT);
lcd.backlight ();
lcd.print ("Olá, mundo");
atraso (2000);
lcd.clear ();
lcd.print ("Teclado de um pino 4 * 4");
atraso (2000); }
void loop ()
{
readvalue = analogRead (botão);
Serial.println (valor de leitura);
if (valor de leitura == 852) {lcd.clear (); lcd.print ("A");}
else {if (readvalue == 763) {lcd.clear (); lcd.print ("B");}
else {if (readvalue == 685) {lcd.clear (); lcd.print ("C");}
else {if (readvalue == 965) {lcd.clear (); lcd.print ("D");}
else {if (readvalue == 565) {lcd.clear (); lcd.print ("9");}
else {if (readvalue == 614) {lcd.clear (); lcd.print ("6");}
else {if (readvalue == 360) {lcd.clear (); lcd.print ("3");}
else {if (readvalue == 335) {lcd.clear (); lcd.print ("#");}
else {if (readvalue == 396) {lcd.clear (); lcd.print ("8");}
else {if (readvalue == 349) {lcd.clear (); lcd.print ("5");}
else {if (readvalue == 235) {lcd.clear (); lcd.print ("2");}
else {if (readvalue == 279) {lcd.clear (); lcd.print ("0");}
else {if (readvalue == 452) {lcd.clear (); lcd.print ("7");}
else {if (readvalue == 271) {lcd.clear (); lcd.print ("4");}
else {if (readvalue == 170) {lcd.clear (); lcd.print ("1");}
else {if (readvalue == 92) {lcd.clear (); lcd.print ("*");} else {}}}}}}}}}}}}}}}}}
Etapa 4: Correção de Valores
Quando você abre o monitor serial, ele mostra um valor de 1023, se você apertar um botão ele vai te dar outra leitura, você tem que pegar esses valores e fazer algumas mudanças no código
Etapa 5: Projeto após crítica e revisão
Sem dúvida que estamos todos aqui para aprender e compartilhar nossos conhecimentos, graças a alguns comentários deixados por algumas pessoas da comunidade que me ajudaram muito, resolvi fazer alguns ajustes e melhorias no meu projeto:
O hardware:
Decidi soldar todos os componentes em um PCB para evitar o problema de conexão ruim nas placas de ensaio.
O código:
Um amigo me aconselhou a usar um software debouncing e é apenas um loop ("for" loop por exemplo) para fazer o programa demorar algum tempo para escolher uma leitura, significa que ele faz muitas leituras (500 no meu exemplo), mas leva apenas o último.
para (i = 1; i <= 500; i ++) {// pegue apenas a 500ª leitura analógica
value = analogRead (Button);} // isso ajuda a levar algum tempo e evitar leituras ruins
Um outro amigo agradecido a ele me aconselhou a comparar "readvalue" com um intervalo de valores, não um, porque "readvalue" leva muitos valores para o mesmo botão. O "A", por exemplo, dá uma leitura de: 849, 850, 851 852, 853, 854, 855, portanto, é um intervalo de 7 valores: um limite (852) e 3 valores à esquerda e à direita. o que temos que fazer aqui é comparar o valor absoluto da diferença entre "readvalue" e "852" com "3".
if (abs (valor de leitura-852) <= 8) {lcd.clear (); lcd.print ("A");}
Etapa 6: depois de algum trabalho de soldagem
Etapa 7: O momento da verdade
Como você pode ver, o programa às vezes confunde os botões, mas ainda funciona, em teoria não há nada de errado com o circuito, mas o código precisa de mais calibração.
Etapa 8: Fim
Espero que gostem deste projeto e que tentem realizá-lo, talvez se saiam melhor do que eu.
Pergunte-me se tiver dúvidas, deixe comentários e não se esqueça de votar em mim se gostar.