quarta-feira, 13 de janeiro de 2016

Tutorial Teclado Touch TTP229 + Display LCD 16x2 I2C Arduino

Olá senhores programadores ou futuros programadores, para este experimento vamos utilizar os seguintes materiais:

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.





//===============================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