Снайпер

Кто тут самый меткий? Сейчас мы это узнаем с нашей мини игрой "снайпер"!

Для этого на понадобится:

  • контроллер DaVinchi - 1шт

  • шилд QuatroPort A050 - 1шт

  • Quatro-модуль с кнопкой - 1шт

  • Quatro-модуль с синим светодиодом - 6шт

  • Quatro-модуль с красным светодиодом - 2шт

  • Quatro-модуль с буззером - 1шт

  • кабель XH-2.54-4P для подключения к QuatroPort A050  - 9 шт

  • кабель XH-2.54-4P для подключения к макетке  - 1 шт

  • сервопривод (например Tower Pro SG90)

  • доска Quatro screw board - 1 шт

В первую очередь нам необходимо закрепить винтами Quatro-модули к доске Quatro screw board, а хатем подключить их кабелями XH-2.54-4P.

Вот как получилось у нас:

Не пугайтесь, тут все просто :)

Quatro-модуль с красными светодиодами подключаются в порты 9 и 15;

Quatro-модуль с синими светодиодами подключаются в порты 3, 6, 8, 11, 12, 14;

Quatro-модуль с буззером подключается в порт 5;

Quatro-модуль с кнопкой подключается кабелем XH-2.54-4P для подключения к макетке, задействовав выход контроллера PIN 1;

Сервопривод подключаем к выходу контроллера PIN 13.

Теперь остается загрузить скетч и выяснить кто пройдет игру до конца и станет лучшим снайпером.

Правила игры:

Нажать на кнопку, когда горит один из красных светодиодов. Если попал - переходишь на следующий уровень, а если нет, то начинай сначала. Удачи!

 

#include <Servo.h>
#define TARGET_ONE 5 // red led pin
#define TARGET_TWO 9 // red led pin
#define BUTTON_PIN 1
#define BUZZER_PIN 12

int ledPin = 0;
int level = 0;
int long listen_time = 100000 * level;
volatile int buttonState = LOW;
unsigned long last_time;  //var for save time
int angle = 180;

Servo myservo;

void setup() {
  pinMode(0,  OUTPUT);
  pinMode(3,  OUTPUT);
  pinMode(5,  OUTPUT);
  pinMode(6,  OUTPUT);
  pinMode(7,  OUTPUT);
  pinMode(9,  OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);

  pinMode(BUTTON_PIN, INPUT); // configurate pin on INPUT for connect button
  pinMode(BUZZER_PIN, OUTPUT);
  
  attachInterrupt(2, buttonHandler, FALLING);
  myservo.attach(13, 530, 2150);
  myservo.write(angle);
}

void loop() {
  digitalWrite(ledPin, LOW);
  ledPin = random (0, 12);
  digitalWrite(ledPin, HIGH);
  delay(100);
  listen_time = 333333 - level*33333; 
  last_time = micros();  // remember time

  // cycle for wait
  while (micros() - last_time <= listen_time) {
    // if button pushed
    if (!digitalRead(BUTTON_PIN)) {
      // and if player push button when targed led was swich on
      if (ledPin == TARGET_ONE || ledPin == TARGET_TWO) {
        //Launch void win
        winLevel();
      } else {
        //Launch void flub
        flubLevel();
      }
    }
  }

  if (level >= 5) {
    congratulations();
  }

  //swich off led
  digitalWrite(ledPin, LOW);
}

void congratulations() {
    tone(12, 440, 250);
    delay(250);
    tone(12, 165, 250);
    delay(250);
    tone(12, 440, 250);
    delay(250);
    delay(250);

    tone(12, 440, 250);
    delay(250);
    tone(12, 165, 250);
    delay(250);
    tone(12, 440, 250);
    delay(250);
    delay(250);

    tone(12, 330, 125);
    delay(125);
    tone(12, 294, 125);
    delay(125);
    tone(12, 262, 125);
    delay(124);
    tone(12, 494, 125);
    delay(125);
    tone(12, 440, 125);
    delay(125);
    tone(12, 494, 125);
    delay(125);
    tone(12, 262, 125);
    delay(125);
    tone(12, 294, 125);
    delay(125);

    tone(12, 330, 250);
    delay(250);
    tone(12, 165, 250);
    delay(250);
    tone(12, 440, 250);
    delay(250);
    noTone(12);

 for (int j = 1; j <= 3; j++) {
 for (int i=0; i<12; i++) {
    digitalWrite(i,HIGH);
    delay(50);
    digitalWrite(i, LOW);
 }
 }   
  reset();
}

//void for blinf leds when player win :)
void winLevel() {
  level++;
  angle = angle - 30;

  playWinMusic();

  //Flashing lights
  for (int j = 1; j <= 3; j++) {
    setLedsState(0, 11, HIGH);
    delay(200);
    setLedsState(0, 11, LOW);
    delay(200);
  }

  myservo.write(angle);
}

void playWinMusic() {
  tone(12, 1046, 150);
  delay(150);
  tone(12, 1046, 300);
  delay(300);
  tone(12, 1046, 150);
  delay(300);
  tone(12, 1046, 150);
  delay(150);
  tone(12, 1174, 300);
  delay(300);
  tone(12, 1318, 150);
  delay(150);
  tone(12, 1046, 300);
  delay(300);
  tone(12, 880, 150);
  delay(150);
  tone(12, 784, 600);
  delay(600);
  noTone(12);
}

void playFlubMusic() {
  tone(12, 330, 250);
  delay(250);
  tone(12, 165, 250);
  delay(250);
  tone(12, 440, 250);
  delay(250);
  noTone(12);
}

void setLedsState(int from, int to, int state) {
  for (int i = from; i <= to; i++) {
    digitalWrite(i, state);
  }
}

void flubLevel()  //void for blink leds when player lose :(
{
  playFlubMusic();
  
  for (int j = 1; j <= 3; j++) {
    setLedsState(0, 3, HIGH);
    delay(200);
    setLedsState(0, 3, LOW);
    
    setLedsState(6, 7, HIGH);
    delay(200);
    setLedsState(6, 7, LOW);
    
    setLedsState(10, 11, HIGH);
    delay(200);
    setLedsState(10, 11, LOW);
  }

  reset();
  delay(100);
}

void reset() {
  level = 0;
  angle = 180;
  myservo.write(angle);
}

void buttonHandler() {
  buttonState = !buttonState;
}
}