Ir ao conteúdo
  • Cadastre-se

Joao Anacleto

Membro Júnior
  • Posts

    6
  • Cadastrado em

  • Última visita

Reputação

0
  1. Obrigado pela dica @aphawk , fiz algo parecido e me gerou um resultado satisfatório, utilizei a seguite logica para tratar o acionamento das chaves tácteis : if(digitalRead(22) == HIGH){ delay(10); if(digitalRead(22) == HIGH){ while(digitalRead(22) == HIGH){ delay(10); } //CODE } } // digitalRead(22) == HIGH -> Botão acionado. Usei Timers menores. Com essa configuração a taxa de erro de leitura caiu para 1,5% , de acordo com os testes que estou fazendo. adicionado 4 minutos depois @Isadora Ferraz Obrigado pelas dicas, agora entendo que o teclado matricial e o melhor para minha aplicação. numa futura versão do projeto irei adapta-lo para isso, porém tenho um prazo curto para a entrega e obtive uma taxa de erro aceitável como descrevi no comentário acima. @aphawk Não cometerei mais esse erro, estou avaliando o datasheet para entender melhor o que posso fazer com meu micro. adicionado 6 minutos depois Caso tenho interesse meu ficou assim: int T = 10; int G = 0; int H = 0; int t0 = 0; int Ed = 0; int Pi = 0; int V[4] = {0,0,0,0}; String Posisao="PA"; String Operasao = "M"; void setup() { Serial.begin(115200); pinMode(22,INPUT_PULLUP); pinMode(23,INPUT_PULLUP); pinMode(24,INPUT_PULLUP); pinMode(25,INPUT_PULLUP); pinMode(26,INPUT_PULLUP); pinMode(27,INPUT_PULLUP); pinMode(28,INPUT_PULLUP); pinMode(29,INPUT_PULLUP); pinMode(30,INPUT_PULLUP); pinMode(31,INPUT_PULLUP); pinMode(32,INPUT_PULLUP); pinMode(33,INPUT_PULLUP); pinMode(34,INPUT_PULLUP); pinMode(35,INPUT_PULLUP); pinMode(36,INPUT_PULLUP); pinMode(37,INPUT_PULLUP); pinMode(38,INPUT_PULLUP); pinMode(39,INPUT_PULLUP); pinMode(40,INPUT_PULLUP); pinMode(41,INPUT_PULLUP); pinMode(42,INPUT_PULLUP); pinMode(43,INPUT_PULLUP); pinMode(44,INPUT_PULLUP); pinMode(45,INPUT_PULLUP); } void loop() { if(digitalRead(45) == LOW){ Posisaoprabaixo(); } if(digitalRead(44) == LOW){ Posisaopracima(); } if(digitalRead(43) == LOW){ Param(43,7); } if(digitalRead(42) == LOW){ Param(42,5); } if(digitalRead(41) == LOW){ if (Ed = 0){ Param(41,0); } } if(digitalRead(40) == LOW){ //Ciclo Automatico Operasao = "A"; delay(T); } if(digitalRead(38) == LOW){ Param(38,11); } if(digitalRead(37) == LOW){ Param(37,18); } if(digitalRead(36) == LOW){ // Ciclo Manual Operasao = "M"; delay(T); } if(digitalRead(46) == LOW){ Cancela(); } if(digitalRead(35) == LOW){ G = 1; if(H == 1){ enviardados(); } delay(T); } if(digitalRead(33) == LOW){ TestaEd(); } //------------------------------------------ NUMEROS -------------------------------------------------- if(digitalRead(32) == LOW){ Num(9,32); } if(digitalRead(31) == LOW){ Num(8,31); } if(digitalRead(30) == LOW){ Num(7,30); } if(digitalRead(29) == LOW){ Num(6,29); } if(digitalRead(28) == LOW){ Num(5,28); } if(digitalRead(27) == LOW){ Num(4,27); } if(digitalRead(26) == LOW){ Num(3,26); } if(digitalRead(25) == LOW){ Num(2,25); } if(digitalRead(24) == LOW){ Num(1,24); } //------------------------------------------ NUMEROS -------------------------------------------------- if(digitalRead(23) == LOW){ if (Ed == 0){ Temperatura(); } } if(digitalRead(22) == LOW){ if (Ed > 0){ Zero(); } else{ Parametros(); } } } //------------------------------------------ FUNÇÕES -------------------------------------------------- void Edita(){ delay(T); if(digitalRead(33) == LOW){ while(digitalRead(33) == LOW){ delay(T); } if(H == 1){ enviardados(); }else{ Ed = Ed + 1; delay(T); } } } void Cancela(){ V[0]= 0; V[1]= 0; V[2]= 0; V[3]= 0; t0 = 0; Ed = 0; H = 0; delay(T); } void Param(int i,int j){ if(digitalRead(22) == LOW){ }else{ delay(T); if(digitalRead(i) == LOW){ while(digitalRead(i) == LOW){ delay(T); } if (Operasao = "A"){ Pi = j; Posisao = "PA"; } } } } void Posisaoprabaixo(){ while(digitalRead(45) == LOW){ } if (Pi>0){ Pi = Pi-1; delay(T); } } void Posisaopracima(){ delay(T); if(digitalRead(44) == LOW){ while(digitalRead(44) == LOW){ delay(T); } Pi = Pi+1; } } void Num(int N, int P){ if (Ed > 0){ delay(T); if(digitalRead(P) == LOW){ while(digitalRead(P) == LOW){ delay(T); } H = 1; V[0] = V[1]; V[1] = V[2]; V[2] = V[3]; V[3] = N; } } } void Temperatura(){ delay(T); if(digitalRead(23)== LOW){ while(digitalRead(23) == LOW){ delay(T); } Pi = 0; Posisao = "TE"; } } void Zero(){ delay(T); if(digitalRead(22) == LOW){ while(digitalRead(22) == LOW){ delay(T); } t0 = t0 + 1 ; } } void Parametros(){ delay(T); if(digitalRead(22)==LOW){ Pi = 0; Posisao = "PA"; while (digitalRead(22) == LOW){ if(digitalRead(41) == LOW){ Pi = 0; Posisao = "PA"; break; } if(digitalRead(42) == LOW){ Pi = 5; Posisao = "PA"; break; } if(digitalRead(43) == LOW){ Pi = 7; Posisao = "PA"; break; } if(digitalRead(37) == LOW){ Pi = 18; Posisao = "PA"; break; } if(digitalRead(38) == LOW){ Pi = 11; Posisao = "PA"; break; } } while (digitalRead(22) == LOW){ delay(T); } } } void enviardados(){ while(digitalRead(35) == LOW){ } if(Ed == 0){ }else{ while( t0 > 0){ V[0] = V[1]; V[1] = V[2]; V[2] = V[3]; V[3] = 0; t0 = t0 - 1; } String dado = Posisao; dado += Pi; dado += Ed; dado += V[0]; dado += V[1]; dado += V[2]; dado += V[3]; Serial.print(dado); V[0]= 0; V[1]= 0; V[2]= 0; V[3]= 0; t0 = 0; H = 0; if(G == 1){ Ed = 0; G = 0; }else{ Ed = Ed + 1; delay(T); } } } void TestaEd(){ if(Posisao == "PA" && Pi == 0 || Posisao == "PA" && Pi == 7 || Posisao == "TE" && Pi == 2 || Posisao == "TE" && Pi == 3 || Posisao == "TE" && Pi == 4){ if (Ed == 3){ Ed = 0; } Edita(); }else{ if(Posisao == "PA" && Pi == 5 || Posisao == "PA" && Pi == 2){ if (Ed == 4){ Ed = 0; } Edita(); }else{ if(Posisao == "PA" && Pi == 18){ if (Ed == 2){ Ed = 0; } Edita(); }else{ if(Posisao == "PA" && Pi == 11 || Posisao == "TE" && Pi == 1){ if (Ed == 1){ Ed = 0; } Edita(); }else{ Edita(); } } } } }
  2. @Isadora Ferraz Estou usando o delay para evitar esse efeito, não sei se e o suficiente, mas a logica do Código e a seguinte: Se botão for acionado verifique se o ultimo botão acionando e igual ao botão acionado agora, se sim, delay de 150ms e verifique se o botão ainda está acionando, se sim, aguarde o botão ser des-acionando e execute o código. So existem 6 pinos para pinos de interrupção no atmega 2560, e preciso monitorar 50 teclas ao total. Não Conheço teclados matriciais e seu funcionamento, mas qual o ganho eu teria com ele?
  3. @Isadora Ferraz Utilizo o arduino mega 2560, Não a pinos digitais suficientes para fazer pinos de interrupção. A questão dos capacitores elimina o efeito Boucing, porém ainda terei problemas, com clicks duplos indesejáveis. A alguma recomendação para a instalação de chave tactil que evita esses problemas?
  4. Olá, estou com um problema na leitura do estado (ON/OFF) de chaves tactil. Além do efeito Boucing, o qual eu tratei com delay's no código, estou identificando click's duplos ou ausência do sinal. Não Estou conseguindo identificar o problema, que pode ser no meu código. Alguém já trabalhou com esse tipo de leitura ou sabe como fazer para identificar o numero certo de pulsos? Estou usando um Atmega 2560 conectado diretamente as chaves (que tem sinal alto, no estado estático), meu código identifica a variação de sinal alto para baixo identificando a chave acionada. int G = 0; int H = 0; int t0 = 0; int Ed = 0; int Pi = 0; int V[4] = {0,0,0,0}; String Posisao="PA"; String Operasao = "M"; void setup() { delay(1000); Serial.begin(115200); pinMode(22,INPUT_PULLUP); pinMode(23,INPUT_PULLUP); pinMode(24,INPUT_PULLUP); pinMode(25,INPUT_PULLUP); pinMode(26,INPUT_PULLUP); pinMode(27,INPUT_PULLUP); pinMode(28,INPUT_PULLUP); pinMode(29,INPUT_PULLUP); pinMode(30,INPUT_PULLUP); pinMode(31,INPUT_PULLUP); pinMode(32,INPUT_PULLUP); pinMode(33,INPUT_PULLUP); pinMode(34,INPUT_PULLUP); pinMode(35,INPUT_PULLUP); pinMode(36,INPUT_PULLUP); pinMode(37,INPUT_PULLUP); pinMode(38,INPUT_PULLUP); pinMode(39,INPUT_PULLUP); pinMode(40,INPUT_PULLUP); pinMode(41,INPUT_PULLUP); pinMode(42,INPUT_PULLUP); pinMode(43,INPUT_PULLUP); pinMode(44,INPUT_PULLUP); pinMode(45,INPUT_PULLUP); } void loop() { if(digitalRead(45) == LOW){ Posisaoprabaixo(); } if(digitalRead(44) == LOW){ Posisaopracima(); } if(digitalRead(43) == LOW){ Param(43,7); } if(digitalRead(42) == LOW){ Param(42,5); } if(digitalRead(41) == LOW){ if (Ed = 0){ Param(41,0); } } if(digitalRead(40) == LOW){ //Ciclo Automatico Operasao = "A"; delay(50); } if(digitalRead(38) == LOW){ Param(38,11); } if(digitalRead(37) == LOW){ Param(37,18); } if(digitalRead(36) == LOW){ // Ciclo Manual Operasao = "M"; delay(50); } if(digitalRead(46) == LOW){ Cancela(); } if(digitalRead(35) == LOW){ G = 1; if(H == 1){ enviardados(); } delay(50); } if(digitalRead(33) == LOW){ delay(50); if(digitalRead(33) == LOW){ while(digitalRead(33) == LOW){ } if(H == 1){ enviardados(); }else{ Ed = Ed + 1; delay(150); } } } //------------------------------------------ NUMEROS -------------------------------------------------- if(digitalRead(32) == LOW){ if (Ed < 1){ } else{ Num(9,32); } } if(digitalRead(31) == LOW){ if (Ed < 1){ } else{ Num(8,31); } } if(digitalRead(30) == LOW){ if (Ed < 1){ } else{ Num(7,30); } } if(digitalRead(29) == LOW){ if (Ed < 1){ } else{ Num(6,29); } } if(digitalRead(28) == LOW){ if (Ed < 1){ } else{ Num(5,28); } } if(digitalRead(27) == LOW){ if (Ed < 1){ } else{ Num(4,27); } } if(digitalRead(26) == LOW){ if (Ed < 1){ } else{ Num(3,26); } } if(digitalRead(25) == LOW){ if (Ed < 1){ } else{ Num(2,25); } } if(digitalRead(24) == LOW){ if (Ed < 1){ } else{ Num(1,24); } } //------------------------------------------ NUMEROS -------------------------------------------------- if(digitalRead(23) == LOW){ if (Ed == 0){ Temperatura(); } } if(digitalRead(22) == LOW){ if (Ed > 0){ Zero(); } else{ Parametros(); } } } //------------------------------------------ FUNÇÕES -------------------------------------------------- void Cancela(){ V[0]= 0; V[1]= 0; V[2]= 0; V[3]= 0; t0 = 0; Ed = 0; H = 0; delay(50); } void Param(int i,int j){ while(digitalRead(i) == LOW){ } if (Operasao = "A"){ Pi = j; Posisao = "PA"; delay(50); } } void Posisaoprabaixo(){ while(digitalRead(45) == LOW){ } if (Pi>0){ Pi = Pi-1; delay(150); } } void Posisaopracima(){ while(digitalRead(44) == LOW){ } Pi = Pi+1; delay(150); } void Num(int N, int P){ if (V[3] == N){ delay(50); } if(digitalRead(P) == LOW){ while(digitalRead(P) == LOW){ } H = 1; V[0] = V[1]; V[1] = V[2]; V[2] = V[3]; V[3] = N; delay(150); } } void Temperatura(){ while(digitalRead(23) == LOW){ } Pi = 0; Posisao = "TE"; delay(50); } void Zero(){ if (t0 > 0){ delay(50); } if(digitalRead(22) == LOW){ while(digitalRead(22) == LOW){ } t0 = t0 + 1 ; delay(150); } } void Parametros(){ Pi = 0; Posisao = "PA"; while (digitalRead(22) == LOW){ if(digitalRead(41) == LOW){ Pi = 0; Posisao = "PA"; break; } if(digitalRead(42) == LOW){ Pi = 5; Posisao = "PA"; break; } if(digitalRead(43) == LOW){ Pi = 7; Posisao = "PA"; break; } if(digitalRead(37) == LOW){ Pi = 18; Posisao = "PA"; break; } if(digitalRead(38) == LOW){ Pi = 11; Posisao = "PA"; break; } } while (digitalRead(22) == LOW){ } delay(150); } void enviardados(){ while(digitalRead(35) == LOW){ } if(Ed == 0){ }else{ while( t0 > 0){ V[0] = V[1]; V[1] = V[2]; V[2] = V[3]; V[3] = 0; t0 = t0 - 1; } String dado = Posisao; dado += Pi; dado += Ed; dado += V[0]; dado += V[1]; dado += V[2]; dado += V[3]; Serial.print(dado); V[0]= 0; V[1]= 0; V[2]= 0; V[3]= 0; t0 = 0; H = 0; if(G == 1){ Ed = 0; G = 0; }else{ Ed = Ed + 1; delay(150); } } }
  5. A sintaxe está quase correta, mas, infelizmente não e recomendado setar as portas 0 e 1 do arduino uno como input. Estes pinos são predefinidos para comunicação serial. entretanto tenho em mãos o arduino due, e ja estou adequando o hardware para fazer a leitura simultânea. o código esta ficando assim: byte d[80]; //20x4 display int RS = 10; int E = 12; int i = 0; void setup() { DDRD = B00000000; pinMode(RS,INPUT); pinMode(E,INPUT); Serial.begin (1200); } void loop() { for (i = 0;i < 80; i++){ while(!E){ if (!RS){ d [1]= PIND; // ler todos os 8 bits } } } }
  6. Olá, sou novo no fórum, então se estiver fazendo algo errado peço desculpas. Estou com a necessidade de ler as informações de um display lcd 20x4, que e controlado por um PLC (que tem o codigo hex protegido), e enviar os dados pela porta serial. Para isso estou utilizando um arduino uno para fazer a leitura. liguei o arduino em paralelo com o barramento de dados do display, para tentar ler os bits e converte posteriormente. Esse e o esquema que estou usando: Obs: Coloquei resistores pulldown em cada pino,pra evitar erros de leitura. Com esse código O Problema e que estou tendo esses resultados na leitura: Independente do que apareça na tela. Se alguem identificar onde está meu problema, ficarei muito grato.

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