Arduino – Jogo da Tabuada com LCD, Teclado e Buzzer

Tutorial demonstrando o uso do LCD, Teclado e Buzzer com Arduino em um jogo da tabuada

Neste pequeno tutorial vamos mostrar como fazer a interface do Arduino com dispositivos básicos de I/O.
Para isso, apresentamos um pequeno projeto de um jogo para ensinar “tabuada” onde as informações são digitadas em um teclado keypad 4×4 e exibidos em um LCD 2×16.

Projeto Arduino – LCD – Teclado – Buzzer

Vamos precisar dos seguintes componentes:

  • Um Arduino UNO placa compatível;
  • Protoboard;
  • Teclado matricial 4×4;
  • LCD 2×16;
  • Potenciômetro 1k;
  • Resistor 100 oms;
  • 5v Piezzo Buzzer;
  • Fios Jumpers.

Na imagem abaixo, vemos como estes componentes serão montados:

Arduino - LCD - Keypad - Buzzer - Jogo da Tabuada
Arduino – LCD – Keypad – Buzzer – Jogo da Tabuada

Pontos de interesse:

  • O  resistor de 100 ohms é necessário para evitar a distorção do som;
  • O potenciômetro é necessário para ajustar a visibilidade LCD;
  • Os pinos analógicos serão usados como pinos digitais.
  • Quanto ao teclado, você não vai precisar de resistências externas porque a biblioteca usa os resistores pullup internos (ativada através de software).

O jogo de “tabuada” funciona da seguinte forma:

  • O sistema escolhe aleatoriamente dois números para serem multiplicado e os exibe na tela LCD;
  • O sistema aguarda resposta do usuário;
  • O usuário digita sua resposta no teclado e pressione a tecla “#”;
  • O sistema verifica se a resposta está correta ou não, e exibe o resultado na segunda linha do LCD através de emoticons e sons;
  • O usuário pressiona a tecla “#”;
  • O sistema retorna para o passo 1.

Veja a demonstração do jogo em vídeo:

O Sketch

/*
 * Data input and output whit Arduino, Keypad 4x4, LCD 2x16 and buzzer
 * 2015, by José Augusto Cintra (www.josecintra.com/blog)
 */

#include <Keypad.h>
#include <LiquidCrystal.h>
#include "pitches.h" // Musical Notes

//keyPad definitions
const byte numRows= 4; //number of rows on the keypad
const byte numCols= 4; //number of columns on the keypad
char keyMap[numRows][numCols]=
{
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
  };
byte rowPins[numRows] = {9,8,7,6}; //Rows 0 to 3
byte colPins[numCols]= {5,4,3,2}; //Columns 0 to 3
Keypad keyPad= Keypad(makeKeymap(keyMap), rowPins, colPins, numRows, numCols);

//LCD Display
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);

//Buzzer
int buzzPin = 10; //connect a 100ohms resistor on this pin

void setup() {
  lcd.begin(16, 2);
  pinMode(buzzPin,OUTPUT); //Buzzer pin
  randomSeed(analogRead(7));//Starts the random number generator on this analogic pin
}

void loop() {
  lcd.clear();
  lcd.setCursor(0, 0);
  //Choose two numbers and displays them on the LCD
  int num1 = random(2, 11);
  int num2 = random(2, 11);
  int result = num1 * num2;
  String mult = String(num1) + " x " + String(num2) + " = ";
  lcd.print(mult);
  // Waiting for user response and evaluates the result
  int hit = readVal().toInt();
  lcd.setCursor(0, 1);
  if (result == hit){
    lcd.print(":-)");
    playHappy();
  }
  else {
    lcd.print(":-(     " + String(result));
    playAlarm();
  }
  hit = readVal().toInt(); //Just waiting for you to press any key to continue
}

//Data input: Enter the values and press "#"
String readVal(){
  String myString = "";
  char keyPressed = keyPad.getKey();
  while (keyPressed != '#'){
    keyPressed = keyPad.getKey();
    if ((keyPressed != NO_KEY) && (keyPressed != '#')) {
      myString.concat(keyPressed);
      lcd.print(keyPressed);
      playTone();
      }   
    }  
  return(myString);  
  }

//Success: Play "Happy Birthday"
void playHappy(){
  int melody[] = {NC4,NC4,ND4,NC4,NF4,NE4,
                NC4,NC4,ND4,NC4,NG4,NF4,
                NC4,NC4,NC5,NA4,NF4,NE4,ND4,
                NAS4,NAS4,NA4,NF4,NG4,NF4  
                 };
  int noteDurations[] = {6,12,4,4,4,2,
                       6,12,4,4,4,2,
                       6,12,4,4,4,4,2,
                       6,12,4,4,4,2,    
                       };
  for (int thisNote = 0; thisNote < 12; thisNote++) {
    int noteDuration = 1000/noteDurations[thisNote];
    tone(buzzPin, melody[thisNote],noteDuration);
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    noTone(buzzPin);
  }
}

//Error: Play a alarm
void playAlarm(){
for (int thisNote = 150; thisNote < 1000; thisNote += 1)
  {
    tone(buzzPin, thisNote, 10);
    delay(1);
  }
  for (int thisNote = 1000; thisNote > 150; thisNote -= 1)
  {
    tone(buzzPin, thisNote, 10);
    delay(1);
  }
}

//Beeps on key presses
void playTone(){
  tone(buzzPin, 150, 10);
  }


Pontos de interesse:

  • As bibliotecas (keypad.h e LiquidCrystal.h) estão disponíveis através do gerenciador de bibliotecaa do IDE Arduino
  • O arquivo pitches.h contém definições de notas musicais usadas na canção “Happy Birthday to You” e está disponível para download logo abaixo;
  • A matriz Keymap define os caracteres do teclado;
  • A função randomSeed inicializa o gerador de números aleatórios através da  pino A7 analógico;

Recursos

Conclusão

Isso é tudo!

Espero que o projeto apresentado aqui ajude o iniciante em Arduino a evoluir em seu aprendizado.

Até o  próximo projeto…

8 comentários em “Arduino – Jogo da Tabuada com LCD, Teclado e Buzzer”

    1. Olá Xará!
      Pode ser que ele não está encontrando o arquivo pitches.h.
      Você baixou o zip com os arquivos necessários pelo blog?
      Tente colocar esse arquivo na pasta do INO ou na pasta include

  1. gostaria de montar um display com numeros que digitar de 3 digitos , usar em uma igreja alguem tem projeto para me ajudar .

  2. gostaria de montar um display com números que digitar de 3 dígitos , usar em uma igreja alguém tem protejo para me ajudar

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *