1 Microcontrolador Arduino NANO
1 Teclado Touch TTP229
1 Display LCD 16X2 com módulo I2C
1 Protoboard
8 Jumpers macho-fêmea
2 Jumpers macho-macho
Obs: O teclado deve ficar sobre uma superfície com baixíssima umidade, qualquer coisa que esteja úmida e toque por baixo da placa, ela reconhece.
O objetivo do experimento é digitar uma senha de 4 dígitos, caso seja compatível com a senha preestabelecida no microcontrolador exibirá no display "acertou", se não aparecerá "errou".
Conexões do Display LCD I2C 16X2:
-VCC > 5Volts
-GND > GND
-SCL > A5 (Porta Analógica 5 do Arduino NANO)-SDA > A4 (Porta Analógica 4 do Arduino NANO)
Conexões do Teclado Touch TTP229:
-VCC > 5Volts
-GND > GND
-SCL > D2 (Porta digital 2 do Arduino NANO)-SDO > D3 (Porta digital 3 do Arduino NANO)
OBS: Para este teclado funcionar nesta programação, deve estar neste padrão aqui, é algo bem específico.
-GND > GND
-SCL > D2 (Porta digital 2 do Arduino NANO)-SDO > D3 (Porta digital 3 do Arduino NANO)
OBS: Para este teclado funcionar nesta programação, deve estar neste padrão aqui, é algo bem específico.
//===============================Declarando LCD======================================= #include <Wire.h> #include <LiquidCrystal_I2C.h> // Inicializa o display no endereco 0x27 LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); //==============================Finalizando LCD======================================= //==========================Declarando teclado touch================================== #include <util/atomic.h> #define CLR(x,y) (x&=(~(1<<y))) #define SET(x,y) (x|=(1<<y)) #define clock_Pin 2 #define sdo_Pin 3 // Touchpad value volatile uint16_t touchVal; // var for ISR access uint16_t touchValc; // copy var for main loop //===========================Finalizando teclado touch================================= //========================Declarando programação de senha============================== char tecla; int count=0; char string1[5]={'1','2','3','4'}; //senha padrão guardada no arduino char string2[4]={0,0,0,0}; //========================Fizalizando programação de senha============================= void setup() { lcd.begin(16, 2); //Inicia o LCD com dimensões 16x2(Colunas x Linhas) pinMode(clock_Pin, OUTPUT); pinMode(sdo_Pin, INPUT); EICRA = (1 << ISC11) | (1 << ISC10); // external INT1 on rising edge EIMSK = (1 << INT1); // External Interrupt Request 1 Enable Serial.begin(9600);//Inicia o serviço da porta serial PC lcd.setCursor(0,0);//Posicionando mensagem lcd.print("Digite a senha");//Exibindo mensagem no display } void loop() { ATOMIC_BLOCK(ATOMIC_FORCEON) { touchValc = touchVal; } if(touchValc) { for(byte b=0; b<=15; b++) { if((touchValc >> b) & 1) { tecla=(b+49);//Atribuindo valor da tecla pressionada na variável tecla /*Anderson, de onde surgiu esse 49? Bom, sabemos que o teclado possui *valores que variam de 0 a 15, até ai tudo bem, NO ENTANTO esses *valores são só tipo "int" insto é, são números inteiros que estão *sendo atribuídos a uma variável do tipo "char" caracteres. *De acordo com a tabela ASCII quando atribuímos um valor em decimal *10(dez) a uma variável char, ela simplesmente armazena um (backspace) *e não 10(dez). Então recorrendo na tabela ASCII, observamos que o valor *49(quarenta e nove) em decimal é equivalente a 1(um) em char. *50(cinquenta) em decimal é equivalente a 2(dois) em char. *51(cinquenta e um) em decimal é equivalente a 3(três) em char. *e assim sucessivamente. Basicamente a função do 49 é converter os *números decimais em char de valores equivalentes matematicamente. *Mas tudo isso é realmente necessário? Temos uma função *chamada "strcmp" que basicamente faz a comparação das senhas, como requisito *a variável deve ser do tipo char, legal não? */ string2[count]=tecla;//Atribuindo valores na matriz 4X1 for(int count1=0; count1<4; count1++) //Exibindo teclas pressionadas via monitor serial (PC) { Serial.print(string2[count1]); Serial.print(" "); } count++;//Contando o número de teclas pressionadas if(count==4)//Quando o número de vezes for igual a 4 então: { count=0;//zerando o contador Serial.print("\n");//pulando uma linha if(strcmp(string2,string1))//Comparando as strings //Se falso: { lcd.setCursor(0,1);//Posicionando mensagem lcd.print("Errou");//Exibindo mensagem no display delay(3000); lcd.setCursor(0,1);//Posicionando mensagem lcd.print(" ");//Exibindo mensagem no display }else //Se verdadeiro: { lcd.setCursor(0,1);//Posicionando mensagem lcd.print("Acertou");//Exibindo mensagem no display delay(3000); lcd.setCursor(0,1);//Posicionando mensagem lcd.print(" ");//Exibindo mensagem no display } }//fim_if_strcmp }//fim_if }//fim_for }//fim_if }//fim loop //==================================função ISR========================================= ISR(INT1_vect) { touchVal = 0; delayMicroseconds(100); for (byte i=0; i<=15; i++) { SET(PORTD, clock_Pin); delayMicroseconds(50); touchVal |= (digitalRead(sdo_Pin) << i); CLR(PORTD, clock_Pin); delayMicroseconds(50); } } //================================fim função ISR=======================================
Observação:
Estou fornecendo apenas a matéria prima da programação, a partir disso você pode fazer
várias coisas legais, como por exemplo, dentro da condição "Se verdadeiro" você pode
pode programar para movimentar um servomotor, ascender uma lâmpada. Ou "Se falso", ativar
uma sirene e etc. Use a criatividade.
Autor: Eu mesmo
Nenhum comentário:
Postar um comentário