Ir ao conteúdo
  • Cadastre-se

Arduino Teclado Matricial acendendo LEDs no arduino


Posts recomendados

Olá, recentemente me envolvi em um projeto de alarme e incêndio e surgiu a ideia de representar diferentes setores de uma maquete com um LED diferente. Em primeiro caso resolvi utilizar um teclado matricial para acender diferentes LEDs.

Eu sei como funciona o teclado matricial porém não consigo definir uma forma para manter um LED aceso quando uma tecla for pressionada, e caso for pressionada novamente o LED apague.

O meu problema é que sempre mexi no teclado matricial colocando as colunas em alto e as linhas em baixo, caso um botão for pressionado a coluna dele também fica em estado baixo e faço uma varredura pra encontrar a tecla pressionada.

Aqui um exemplo:

int pinosLinhas[]  = {11,10,9,8};
int pinosColunas[] = {7,6,5,4};
char teclas[4][4] = {{'1','2','3','A'},
                     {'4','5','6','B'},
                     {'7','8','9','C'},
                     {'*','0','#','D'}};

void setup()
{
  for (int nL = 0; nL <= 3; nL++) {
     pinMode(pinosLinhas[nL], OUTPUT);
     digitalWrite(pinosLinhas[nL], HIGH);
  }

  for (int nC = 0; nC <= 3; nC++) {
     pinMode(pinosColunas[nC], INPUT_PULLUP);
  } 
   
  Serial.begin(9600);
  Serial.println("Teclado 4x4");
  Serial.println("Aguardando acionamento das teclas...");
  Serial.println();
}
 
void loop()
{
    //faz varredura em todas as linhas, desligando uma de cada vez
    for (int nL = 0; nL <= 3; nL++)
    {
      digitalWrite(pinosLinhas[nL], LOW);
      
      //faz varredura em todas as colunas verificando se tem algum botao apertado
      for (int nC = 0; nC <= 3; nC++) {
        if (digitalRead(pinosColunas[nC]) == LOW)
        {
          Serial.print("Tecla: ");
          Serial.println(teclas[nL][nC]);
          while(digitalRead(pinosColunas[nC]) == LOW){}
        }
      }

      digitalWrite(pinosLinhas[nL], HIGH);
    }
   delay(10);
}


Queria saber como fazer como integrar os LEDs nesse código pro proposito que eu quero atingir.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

No seu código meio que não vai rolar

É melhor você ler teclas numa varredura numa interrupção por timer.

Mas antes, google ler teclado matricial arduino, faça experimentos até entender a saída da função. Digamos que ela retorne de 1 a 16 (16 teclas) e você tenha 16 leds em 16 saídas do arduino.

Fica fácil...

saida=le_teclado_matricial();
digitalWrite(saida, !digitalRead(saida));

via pin toggle arduino

22 horas atrás, Brehok disse:

um LED aceso quando uma tecla for pressionada, e caso for pressionada novamente o LED apague

 

Link para o comentário
Compartilhar em outros sites

@.if ,

 

Eu costumo usar um buffer em Ram, tipo 2 bytes, quando detecto uma determinada tecla, identifico qual o bit correspondente e troco o valor dele, por exemplo se era 0 fica 1 ou vice-versa.

 

E uma rotina baseada no Timer entra a cada 100 mseg e determina verificando o estado do Buffer quais Leds tem de acender ou apagar.

 

Enfim deve ter muita coisa sobre isso na Internet ....

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Boa Paulão. Seu buffer é como um espelho do port e sim tem seu lugar. P.ex. pra aplicação + complexa como p.ex. muitos displays 7seg ou alfanumérico (16 seg) ou matricial, um buffer é totalmente excelente onde cada bit corresponde à um led e a cada varredura é enviado um pacotinho pra fora. Claro, o método acima é pra escrever p.ex. numa matriz de leds. Muuuito antes do advento do max7219 usei raladamente  o método acima do zero pra controlar um pacote de displays matriz...

HTB1wzNbasfrK1RkSmLyq6xGApXa6.jpg_350x35

Em sua varredura, usava 1 pino pra ler muitas teclas. Algo como se pino = 0 , a tecla é o 'momento varredura'. Uma relação mínima com a matriz 4x4 do garoto sumido, no caso era matriz 16x1.

Falando nele, voltemos a ler um teclado 4x4 de modo minimalista num port 8 bits, algo como:

-Matriz nos 4 primeiros e 4 últimos bits

-TRISx com 0b11110000

-escreva 0b00001111

-leia o port... reserve variável tecla

-TRISx com 0b00001111

-escreva 0b11110000

-leia o port

-faça OR ou AND com tecla

-pronto: tecla=tecla pressionada

 

Off-on topic, a familia 8051 não tem esta frescura de TRIS. Fica bem simples ler matriz 4x4 por este método. Não lembro direito mas acho que já fiz algo como:

PORTB=0b11110000;
tecla=PORTB;
PORTB=0b00001111;
tecla|=PORTB;

Obviamente 'tecla' depende de como estão os bits no hw, não vai ser nenhum padrão asc-ii mas vai ser valor coerente.

😁

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Phenom_X4 ,

 

Pois é ..... eu também não entendo esse abuso de simbologia em vez de explicitar a operação real .

 

Nunca consegui entender essa linguagem ... e morri no Assembler e Basic !

 

Se não existisse o Bascom tinha desistido de brincar com os microcontroladores faz tempo ....

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Maria Cristina Oliveira ,

 

O TRIS simplesmente permite que o pino possa ser colocado no famoso estado de altíssima impedância, necessário em vários projetos.

 

Mas concordo que a Atmel conseguiu fazer uma baita complicação com seus famosos três registradores para configurar cada pino : DDR,  PIN e TRIS ... é muita confusão para poder deixar um pino em três estados possíveis, e ainda poder ligar um resistor interno de pullup ao VCC ... 

 

Eu nem me preocupo em entender, faz muito tempo achei uma tabelinha que mostra o que tenho de colocar nos três registradores para conseguir o que quero kkkkk.

 

Mas confesso que também tenho um preferido .... sempre foi o Z80, mas de uns dois anos para cá aprendi a tirar leite de pedra com os Atmega328, as instruções são muito semelhantes aos modelos da família 8080, a velocidade de 20 MHz é bem satisfatória  ( embora consiga rodar todos os que tentei a 32 MHz usando clock externo e claro diminuindo a taxa do conversor ADC para a frequência máxima garantida de amostragem para evitar erros de precisão)  e a quantidade de recursos interna me atende muito bem.

 

Mas teve um microprocessador que eu adoraria ter tido mais experiência com ele, era o NEC V20 , que podia rodar tanto o código dos 8085 como os do Z80 , seria algo muito legal , parecido com o que eu fazia nos Apple II com a placa CP/M , que podia rodar codigo de um processador Z80 tambem e assim podia trocar o controle que normalmente era do 6502 rodando a 1 MHz para um Z80 rodando perto de 2 MHz, com aquelas instruções complexas dele que aumentavam bastante a performance de alguns trechos de códigos.

 

Já falei aqui no CDH algumas vezes sobre isto : ví um engenheiro brasileiro reescrever a Eprom original da VIDEX 80 colunas, que usava a grande maioria do espaço dela para rodar código do 6502, e ele conseguiu fazer rodar quase todo o código novo em Z80 sem perder a compatibilidade, o vídeo reescrevia as telas 2 vezes mais rápido .

 

Claro que precisava também de um cartao z80 cp/m para aproveitar... Mas naquela época isso era quase obrigatório ter no micro...

 

Bons tempos de Engenharia de verdade ....

 

Paulo

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Não é só colocar uma flag e um auxiliar
Quando achar um botão, seta a flag, e guarda o valor do botão num auxiliar. Enquanto auxiliar tiver no mesmo valor, mantém a flag, e mantém o led aceso.
Quando não tiver o mesmo valor no botão, apaga o auxiliar, apaga a flag. 
A lógica de acender o led fica dependendo da flag.
 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...