Arduino genius com display lcd 16x2 usando i2 c

7
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:

description

Projeto de genius com arduino

Transcript of Arduino genius com display lcd 16x2 usando i2 c

Page 1: Arduino  genius com display lcd 16x2 usando i2 c

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:    

 

Page 2: Arduino  genius com display lcd 16x2 usando i2 c

 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()    

Page 3: Arduino  genius com display lcd 16x2 usando i2 c

{                                      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);  

Page 4: Arduino  genius com display lcd 16x2 usando i2 c

           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);  

Page 5: Arduino  genius com display lcd 16x2 usando i2 c

           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);  

Page 6: Arduino  genius com display lcd 16x2 usando i2 c

       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]);      }  }      

Page 7: Arduino  genius com display lcd 16x2 usando i2 c

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