Arduino: Genius com display LCD 16x2 usando I2C Este projeto foi construído para a matéria de Automação e Controle de Processos do Centro Universitário de Volta Redonda – UniFOA. Falando sobre o projeto, ele é a construção do jogo conhecido como Simon Says (Genius), com apresentação de resultados no display com o Arduino. Primeiramente iremos detalhar os componentes utilizados na construção do projeto: Componentes: 1 x Arduno Uno 4 x LEDs (Cores de sua preferência) 4 x Resistores 330 Ohms 4 x Push Buttons 1 x Display LCD 16 x 2 1 x CI PCF8574AP (Podem ser utilizados outros compatíveis) Montagem do jogo: O jogo foi montado com base no tutorial do Mauro Assis, disponível em (http://labdegaragem.com/profiles/blogs/genius). Como o arduino uno tem limitação de portas e não era possível conectar um display para mostrar os resultados tivemos que fazer breves adaptações no projeto original. Sketch:
Inclusão da Biblioteca I2C e Pitches.h: Pela limitação de portas foi necessário utilizar o PCF8574 para expandir as portas do arduino. No site (http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C/ ). Escolha a versão mais adequada a sua versão da IDE do Arduino, no meu caso utilizei a biblioteca para a versão 1.0. Depois de baixado a biblioteca descompacte para a pasta libraries do arduino, então ela estará disponível para ser utilizada através da IDE. Outra biblioteca foi necessária na construção do jogo. A pitches.h, disponível em: (http://api.ning.com/files/zHb0ubf3UnFl5CVITtXvtbMG2zDlNhSnr2L1yrynJ1kxAyeMpfLDP94aIV*7WgVAORzwKixdYiJ2VXW9Vcl8JKq*sG3T1zSa/Piches.h). Deverá ser feito o mesmo procedimento para inclusão. Código do Jogo: Este código foi adaptado do original para prover o suporte a tela: #include "pitches.h" #include <Wire.h> #include <LiquidCrystal_I2C.h> #define buzzer 3 #define waitingStart 0 #define playingSeq 1 #define userTyping 3 #define validatingSeq 4 #define kred 11 #define kyellow 10 #define kgreen 9 #define kwhite 8 #define lred 7 #define lyellow 6 #define lgreen 5 #define lwhite 4 #define debugging 1 int interval = 500; int noSound = 200; int seq[50]; int posSeq = 0; int posType = 0; int state = waitingStart; int key = 0; LiquidCrystal_I2C lcd(56,16,2); void setup()
{ pinMode(lred, OUTPUT); pinMode(lyellow, OUTPUT); pinMode(lgreen, OUTPUT); pinMode(lwhite, OUTPUT); pinMode(kred, INPUT); pinMode(kyellow, INPUT); pinMode(kgreen, INPUT); pinMode(kwhite, INPUT); noSound = 0; // demo(); lcd.init(); // initialize the lcd // Print a message to the LCD. lcd.backlight(); lcd.print("Simon says"); playWrong(); noSound = 50; Serial.begin(9600); randomSeed(analogRead(0)); generateSeq(); } void loop() { switch(state) { case waitingStart: interval = 500; if (debugging) Serial.println("waitingStart"); lcd.clear(); lcd.print("Aguardando..."); lcd.setCursor(0, 1); lcd.print("Pressione botao"); key = readKey(false); state = playingSeq; return; case playingSeq: if (debugging) Serial.println("playingSeq"); playSeq(); posType = 0; state = userTyping; return; case userTyping: lcd.clear(); lcd.setCursor(0, 0); lcd.print("Jogo Iniciado"); if (debugging) Serial.println("userTyping"); key = 1; int ok = true; while(ok) { key = readKey(true); if (key == 0) break; play(key-‐4);
ok = validateSeq(key); if (debugging) { Serial.print("ok="); Serial.println(ok); } if (ok) { if (posType == posSeq) { delay(1000); posSeq++; state = playingSeq; interval = interval * 0.95; return; } else { posType++; } } } lcd.clear(); lcd.setCursor(0, 0); lcd.print("Sua pontuacao:"); lcd.setCursor(0, 1); lcd.print(posSeq); Serial.print("Voce fez "); Serial.println(posSeq); playWrong(); generateSeq(); state = waitingStart; return; } } int validateSeq(int key) { return (key-‐4) == seq[posType]; // (key -‐4) = key to LED } int readKey(int validateMilis) { unsigned long ms = millis(); int value = LOW; while(value == LOW) { for (int i = kred; i >= kwhite; i-‐-‐) { if (validateMilis) if ((millis() -‐ ms) > 3000) { if (debugging) Serial.println("Timeout"); return 0; } value = digitalRead(i);
if (value == HIGH) { return i; } } } } void playPich(int pich, int duration) { tone(buzzer, pich); delay(duration); noTone(buzzer); } void playWrong() { int ritym = 500; Serial.println("Play Wrong"); // for(int i = 0; i < 2; i++) // { digitalWrite(lred, HIGH); digitalWrite(lyellow, HIGH); digitalWrite(lgreen, HIGH); digitalWrite(lwhite, HIGH); playPich(NOTE_A3, ritym); playPich(NOTE_A3, ritym); playPich(NOTE_A3, ritym); playPich(NOTE_F3, ritym * 3 / 4); playPich(NOTE_C4, ritym * 1 / 4); playPich(NOTE_A3, ritym); playPich(NOTE_F3, ritym * 3 / 4); playPich(NOTE_C4, ritym * 1 / 4); playPich(NOTE_A3, ritym * 2); playPich(NOTE_E4, ritym); playPich(NOTE_E4, ritym); playPich(NOTE_E4, ritym); playPich(NOTE_F4, ritym * 3 / 4); playPich(NOTE_C4, ritym * 1 / 4); playPich(NOTE_GS3, ritym); playPich(NOTE_F3, ritym * 3 / 4); playPich(NOTE_C4, ritym * 1 / 4); playPich(NOTE_A3, ritym * 2); digitalWrite(lred, LOW); digitalWrite(lyellow, LOW); digitalWrite(lgreen, LOW); digitalWrite(lwhite, LOW); noTone(buzzer); delay(500); // } } void demo() { interval = 500; while(interval > 5) { play(lred); play(lyellow);
play(lgreen); play(lwhite); interval = interval / 1.5; } } void blink(int led, int pich) { digitalWrite(led, HIGH); tone(buzzer,pich); delay(interval); digitalWrite(led, LOW); noTone(buzzer); delay(noSound); } void play(int pich) { switch(pich) { case 7: blink(lred,NOTE_C4); break; case 6: blink(lyellow,NOTE_E4); break; case 5: blink(lgreen,NOTE_G4); break; case 4: blink(lwhite,NOTE_AS4); break; } } void generateSeq() { posSeq = 0; if (debugging) Serial.println("generateSeq"); int note; for (int i = 0; i < 50; i++) { seq[i] = random(4) + 4; if (debugging) Serial.println(seq[i]); } } void playSeq() { for (int i = 0; i <= posSeq; i++) { play(seq[i]); } }
Divulgação: O vídeo com divulgação do projeto pode ser encontrado em: http://www.youtube.com/watch?v=MueJwG-‐1vKM Grupo: Thiago Figueredo Pereira Rodrigo de Almeida Gustavo Luiz Fernando de Moura Leandro Ramos Referências: http://labdegaragem.com/profiles/blogs/genius http://labdegaragem.com/profiles/blogs/tutorial-‐lcd-‐16x2-‐com-‐pcf8574-‐e-‐arduino?id=6223006%3ABlogPost%3A137664&page=1#comments http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C/ http://www.nxp.com/documents/data_sheet/PCF8574.pdf
Top Related