Ninja Dollar - jogo LCD
Componentes e suprimentos
| | × | 1 | |
| Adafruit LCD padrão - 16x2 branco em azul | | × | 1 | |
| | × | 2 | |
| Potenciômetro de volta única - 10k ohms | | × | 1 | |
| | × | 2 | |
| | × | 4 | |
| SparkFun Botão de pressão 12 mm | | × | 2 | |
| | × | 1 | |
| Fios de jumpers (genérico) | | × | 1 | |
Sobre este projeto
Este é um jogo simples de LCD. Minha inspiração foi o jogo Dinosaur do Google Chrome, mas adicionei mais algumas mudanças a ele. O guerreiro do dólar se move constantemente e pode pular para evitar os obstáculos e coletar os pontos "estrela". Se ele pular o obstáculo, ele coleta um ponto e se ele pegar a estrela, ele coleta cinco pontos. Ele também pode atirar e remover os obstáculos à sua frente. Existem também diodos leds que indicam se ele salta ou atira. Quando ele coleta 10, 20 ou 30 pontos, ele começa a se mover mais rápido do que antes. Quando ele acumula 50 pontos, você ganha. Se você acertar o obstáculo, você perde. Claro, você pode alterar esses limites facilmente no código. Também adicionei uma campainha passiva que soa quando o guerreiro pula ou atira e uma melodia especial quando você perde ou ganha. Este é o meu primeiro projeto aqui e espero que gostem. Dê-me seus comentários e análises.
O vídeo
Conexões
O módulo LCD (Tela de Cristal Líquido) possui um conector macho de 16 pinos na parte inferior. Conecte-o ao breadboard, conforme mostrado na imagem. Todos os sinais eletrônicos que alimentam e controlam o LCD passam por esse conector.
Esses pinos são (da esquerda para a direita):
- GND - sinal de aterramento de energia
- VCC - sinal de potência positivo
- R / W - seleção de leitura / gravação
- D0 - bit de dados 0 (não usado aqui)
- D1 - bit de dados 1 (não usado aqui)
- D2 - bit de dados 2 (não usado aqui)
- D3 - bit de dados 3 (não usado aqui)
- A - retroiluminação LED positivo
- K - retroiluminação LED negativo
Use um fio jumper para conectar o sinal de 5 V no Arduino com a linha vermelha na parte superior da placa de ensaio.
Use um fio jumper para conectar o sinal GND no Arduino com a linha azul na parte superior da placa de ensaio.
- Conecte o pino VSS ao solo
- Conecte o pino VDD ao sinal 5V
- pino V0 para o pino de saída do potenciômetro
- pino RS para Arduino pino 12
- pino E para o pino 11 do Arduino
Conecte os pinos do potenciômetro restantes ao sinal de 5 V e ao sinal de GND.
Se você tiver 3 cigarros piezoelétricos com pino, conecte o pino S ao pino 7 do Arduino, o pino '-' ao GND e o pino restante ao sinal de 5V. Se você tiver 2 buzzer piezo com pino, conecte um pino ao sinal GND e o outro ao pino 7 do Arduino.
Conecte os botões do interruptor de acordo com o esquema. O primeiro botão (botão de salto) é conectado ao pino 1 do Arduino e o segundo (botão de disparo) é conectado ao pino 6 do Arduino. Os leds são controlados apenas pelos botões e não pelo Arduino. O ânodo é conectado ao pino do botão que está conectado ao Arduino e o cátodo é conectado ao aterramento.
Código
dollar_warrior Arduino
#include const int rs =12, en =11, d4 =5, d5 =4, d6 =3, d7 =2; const int buttonPin1 =1; const int buttonPin2 =6; const int buzzer =7; unsigned long pts =0; // definir buttonstatesbool buttonState1 =0; bool buttonState2 =0; // número aleatório para a posição dos obstáculosint randomNums [6]; // número aleatório para o número de obstáculosint randomNum =0; // número aleatório para a posição de ptsint randomNums1 [3]; // número aleatório para o número de ptsint randomNum1 =0; // tempo de retardo inicial, que diminui gradualmenteunsigned int myDelay =500; // fez este booleano para verificar se o botão2 foi pressionado porque se é pressionado uma vez no primeiro for loop i não quero que os obstáculos sejam escritos até o final de itbool temp =0; // esta variável armazena as posições do guerreiro enquanto ele atira. pode haver 16 posições porque o guerreiro tem 16 posições.int tempI [16]; // eu uso esse booleano para verificar se o ponto é catchedbool temp1 =0; // use essa variável para armazenar a posição do ponto capturado. deve ser um array para armazenar a posição de todos os pontos em uma iteração do primeiro loop for. se armazenasse apenas uma posição, o ponto "antigo" voltaria na nova iteraçãoint tempI1 [3]; // use esta variável para ter um número de tiros do guerreiro, que também é o comprimento de uma matriz tempIint button2IsPressed =0; LiquidCrystal lcd (rs, en, d4, d5, d6, d7); void setup () {/ / configurar o número de colunas e linhas do LCD:lcd.begin (16, 2); // define o modo do botão pinMode (buttonPin1, INPUT); pinMode (buttonPin2, INPUT); pinMode (campainha, OUTPUT); lcd.setCursor (4,0); lcd.print ("O JOGO"); lcd.setCursor (2,1); lcd.print ("INICIA"); lcd.print ("5"); atraso (1000); lcd.setCursor (12,1); lcd.print ("4"); atraso (1000); lcd.setCursor (12,1); lcd.print ("3"); atraso (1000); lcd.setCursor (12,1); lcd.print ("2"); atraso (1000); lcd.setCursor (12,1); lcd.print ("1"); atraso (1000); lcd.clear ();} void loop () {aqui:randomNum =random (5); para (int i =0; i 9 &&pts <20) {lcd.setCursor (14,0); myDelay =400; } else if (pts> 19 &&pts <30) {lcd.setCursor (14,0); myDelay =300; } else if (pts> 29 &&pts <50) {myDelay =200; lcd.setCursor (14.0); } else if (pts> =50) {pts =0; myDelay =500; lcd.clear (); lcd.setCursor (5,0); lcd.print ("VITÓRIA"); tom (campainha, 262); atraso (200); tom (campainha, 330); atraso (200); tom (campainha, 392); atraso (100); tom (campainha, 330); atraso (100); tom (campainha, 392); atraso (100); tom (campainha, 523); atraso (200); noTone (campainha); atraso (3000); lcd.clear (); vá aqui; } else lcd.setCursor (15,0); lcd.print (pts); buttonState1 =digitalRead (buttonPin1); buttonState2 =digitalRead (buttonPin2); // colocando obstáculos se o guerreiro não atirou ou atirou, mas também saltou if (! temp) {for (int j =0; j randomNums [j]) {lcd.setCursor (randomNums [j], 1); lcd.print ("#"); }}} // definindo ptsif (! temp1) {for (int j =0; j
Esquemas
game_aUIjA6VZxX.fzz