1. 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:
2.
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/zHb0ubf3UnFl5CVITtXvtbMG2zDlNhSnr2L1yrynJ1kx
AyeMpfLDP94aIV*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()
3. {
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);
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);
6. 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]);
}
}
7. 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