30 de setembro de 2021

Nervo Teste

O clássico jogo Nervo Teste é para testar a coordenação motora e a habilidade de concentração.

O objetivo é passar a argola pelo arame até a outra extremidade. A cada contato o alarme é acionado e a falta é registrada na barra de leds. Com três faltas o jogador é eliminado!

Um jogo interessante e divertido para feira de ciências.

O circuito está montado com uma placa Digispark (Attiny85), uma barra com 8 leds RGB WS2812 e um Buzzer.
O arame tortuoso é conectado ao GND e a argola é conectada no pino digital 0.

Segue o esquema elétrico e o código fonte:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*---------------------------------------------------------
  Programa : NERVO TESTE
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 29/09/2021
  ---------------------------------------------------------*/
#include <Adafruit_NeoPixel.h> //https://github.com/adafruit/Adafruit_NeoPixel

#define NERVO_PIN   0  //Pino de conexão do gancho nervo teste
#define BUZZER      1  //Pino de conexão do buzzer
#define RGB_PIN     2  //Pino de conexão da barra de leds
#define RGB_PIXELS  8  //Número de leds rgb

Adafruit_NeoPixel pixels(RGB_PIXELS, RGB_PIN); //Barra leds RGB WS2812
int touchCount = 0; //Controle de tentativas

void setup() {
  //Configura os pinos
  pinMode(NERVO_PIN, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);

  //Inicializa a barra de leds RGB WS2812
  pixels.begin();

  //Primeiro led em verde
  pixels.setPixelColor(0, 0, 8, 0); //Led, R, G, B
  pixels.show();
}

void loop() {
  //Houve toque
  if (digitalRead(NERVO_PIN) == LOW) {
    touchCount++;
    touchLevel(touchCount);
    delay(1000);
  }
}

void touchLevel(int level) {
  int n = RGB_PIXELS;
  if (level == 1) {
    n = 4;
    tone(BUZZER, 3300, 100);
  } else if (level == 2) {
    n = 7;
    tone(BUZZER, 3200, 200);
  } else {
    tone(BUZZER, 2800, 1000);
  }
  for (int i = 1; i < n; i++) {
    if (i < 4) {
      pixels.setPixelColor(i, 8, 2, 0); //Led, R, G, B (Laranja claro)
    } else if (i < 7) {
      pixels.setPixelColor(i, 8, 1, 0); //Led, R, G, B (Laranja)
    } else {
      pixels.setPixelColor(i, 90, 0, 0); //Led, R, G, B (Vermelho)
    }
    pixels.show();
    delay(20);
  }
  if (n == RGB_PIXELS) {
    delay(1000);
    for (int i = RGB_PIXELS - 1; i >= 0; i--) {
      tone(BUZZER, 3000, 50);
      pixels.setPixelColor(i, 10, 0, 0); //Led, R, G, B (Vermelho)
      pixels.show();
      delay(100);
    }
    while (1) {
      for (int i = 0; i < RGB_PIXELS; i++) pixels.setPixelColor(i, 20, 0, 0); //Led, R, G, B
      pixels.show();
      delay(500);
      for (int i = 0; i < RGB_PIXELS; i++) pixels.setPixelColor(i, 10, 0, 0); //Led, R, G, B
      pixels.show();
      delay(500);
    }
  }
}

2 comentários: