Jogo de roleta LED
Componentes e suprimentos
| | × | 9 | |
| SparkFun Botão de pressão 12 mm | | × | 1 | |
| | × | 1 | |
| Cabeçalho feminino 8 posição 1 linha (0,1 ") | | × | 1 | |
| | × | 1 | |
Aplicativos e serviços online
Sobre este projeto
Vídeo:
Visão geral
Há um bom tempo, desejo criar um jogo simples, mas divertido, que requer apenas uma pessoa para jogar. É extremamente simples, bastando apenas um Arduino Nano para executá-lo. É roleta de LED. O objetivo do jogo é parar no LED verde, evitando o vermelho e o amarelo. Parece fácil de jogar e fazer, e é.
Etapa 1
Primeiro, comecei projetando o dispositivo no Fusion 360. Projetei a placa frontal para conter 9 LEDs, 6 vermelhos, 2 amarelos e 1 verde. Também criei um espaço para uma troca de tato na parte inferior. Usei então a minha fresadora CNC Millright para cortar as peças que desenhei.
Etapa 2
A mecânica do jogo é a seguinte:uma luz "se moverá" para frente e para trás entre as duas bordas e irá parar sempre que houver um pressionamento de botão. Para que ele reagisse imediatamente, usei uma interrupção. Cada LED corresponde a um índice em uma matriz que é alternada. o índice atual do LED também obtém sua própria variável. Também existe um atraso entre cada etapa, correspondendo à dificuldade. Na inicialização, o usuário seleciona a dificuldade pressionando o botão para reduzir o atraso entre cada mudança do LED. Depois que o LED correto acender, o usuário pode clicar duas vezes para travá-lo.
Etapa 3
Usei uma lixa para dar um bom acabamento e arredondamento às peças de compensado. Depois disso, usei cola quente para prender as peças.
Conlusões
Agora, sempre que estou com vontade de jogar um jogo simples, seja para a estrada ou apenas para fugir da tela, este dispositivo me dá um alívio maravilhoso. Também posso torná-lo multiplayer fazendo com que cada LED afastado do verde uma certa quantidade de pontos, fazendo com que a pessoa que obtiver a menor quantidade de pontos no final vença.
Código
Código C / C ++
/ * Use os pinos 2-10Você pode obter a biblioteca TTBOUNCE aqui:https://github.com/TOLDOTECHNIK/TTBOUNCE*/#include int delay_time =0; const uint8_t led_array [9] ={ 4,3,5,6,7,8,9,10,11}; const uint8_t button =2; uint8_t dificuldade =0; uint8_t current_led =0; bool dir_flag =true; // verdadeiro vai para a direita, falso vai para a esquerdabool game_ended =false; bool is_win =false; bool is_finished_selecting =false; TTBOUNCE b =TTBOUNCE (botão); void doubleClick () {Serial.println ("duplo clique"); is_finished_selecting =true; delay_time =floor (500 / (dificuldade + 1)); // Fórmula:atraso (em ms) =500 / (dificuldade + 1) Serial.println ("dificuldade:" + String (atraso_time)); sweep ();} void click () {Serial.print ("Click |"); digitalWrite (led_array [dificuldade], BAIXO); dificuldade ++; if (dificuldade> 8) {dificuldade =0; } digitalWrite (led_array [dificuldade], HIGH); Serial.println ("A dificuldade é:" + String (dificuldade)); atraso (100);} configuração vazia () {Serial.begin (9600); b.attachDoubleClick (doubleClick); b.attachClick (clique); b.setActiveLow (); b.enablePullup (); para (int i =0; i <9; i ++) {pinMode (led_array [i], OUTPUT); } varrer(); pulso(); dificuldade =0; digitalWrite (led_array [dificuldade], HIGH); while (! is_finished_selecting) {b.update (); } b.update (); pinMode (botão, INPUT_PULLUP); attachInterrupt (digitalPinToInterrupt (botão), button_pressed, FALLING); delay (1000);} void loop () {if (game_ended ==false) {move_led (); atraso (atraso_tempo); } else if (game_ended) {Serial.println (game_ended); Serial.println ("Fim do jogo"); if (is_win) {Serial.println ("você ganhou"); para (int i =0; i <5; i ++) {pulse (); atraso (100); } } varrer(); game_ended =false; is_win =false; atraso (2000); }} void move_led () {digitalWrite (led_array [current_led], LOW); if (current_led ==8) {dir_flag =false; current_led - =1; } else if (current_led ==0) {dir_flag =true; current_led + =1; } else if (dir_flag) {current_led + =1; } else if (! dir_flag) {current_led - =1; } digitalWrite (led_array [current_led], HIGH);} void pulse () {for (int i =0; i <9; i ++) {digitalWrite (led_array [i], HIGH); } atraso (100); para (int i =0; i <9; i ++) {digitalWrite (led_array [i], LOW); }} void sweep () {for (int i =0; i <9; i ++) {digitalWrite (led_array [i], HIGH); atraso (50); digitalWrite (led_array [i], LOW); } para (int i =8; i> =0; i -) {digitalWrite (led_array [i], HIGH); atraso (50); digitalWrite (led_array [i], LOW); }} void button_pressed () {Serial.println ("Botão pressionado no LED:" + String (current_led)); game_ended =true; if (current_led ==4) {is_win =true; } else if (current_led! =4) {is_win =false; } current_led =0; atraso (500);}
Esquemas