Japanino (Arduino)の調べ  将棋の調べ  鉄道の調べ  旅先料理の調べ  ビールコレクション

Japanino (Arduino) のプログラム MusicGame

MusicGame.sk

/*
  Music Game 音程当てゲーム
  スイッチを ON にすると2つの音が聞こえます。
  後ろの音が高くなっていると思えば、スイッチを OFF にして、1秒以内に ON
  にしてください。(その後、2秒以内に OFF にしないと次のゲームが始まります)
  後ろの音が低くなっていると思えば、スイッチを OFF にして、そのままに
  してください。
  正解の場合は LED が 4個点灯します。不正解の場合は LED は 1個です。

  Copyright (C) GOMI Hiroshi 2010 All right reserved.
*/

int ledPin[] = {7, 8, 9, 10, 11, 12, 13};
int inputPin = 6;
int tonePin = 14;

#define NOTE_C4  262
#define NOTE_D4  294
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_G4  392
#define NOTE_A4  440
#define NOTE_B4  494
#define NOTE_C5  523
int note[] = {NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4};

void setup() {
  for (int led = 0; led < 7; led++) {
    pinMode(ledPin[led], OUTPUT);
  }
  pinMode(inputPin, INPUT);
  digitalWrite(inputPin, HIGH);
  randomSeed(millis());
}

void loop()                     
{
  waitForON();  // スイッチが ON になるまで待つ
  on(3);
  tone(tonePin, note[4], 500);
  long r = random(6);  // サイコロを振る(乱数発生)
  if (r == 4) r++;
  delay(500);
  tone(tonePin, note[r], 500);  
  waitForOFF();  // スイッチが OFF になるまで待つ
  int sw = readSW();  // 1秒以内にスイッチが ON されたかどうか
  if (sw == 1) on(0); else on(6);
  if (r < 4) on(2); else on(4);
  if (sw == 1 && r < 4) on(1);
  else if (sw == 0 && r > 4) on(5);
  else off(3);
  delay(2000);
  clearLED();
}

/*
  スイッチが ON になるまで待つ
*/
void waitForON(){
  for (;;) {
    if (digitalRead(inputPin) == LOW) break;
    delay(10);
  }
}
  
/*
  スイッチが OFF になるまで待つ
*/
void waitForOFF(){
  for (;;) {
    if (digitalRead(inputPin) == HIGH) break;
    delay(10);
  }
}

/*
  LED を点灯させる
  @param led LEDの相対位置(0-6)
*/
void on(int led) {
   digitalWrite(ledPin[led], HIGH);  // set the LED on
}

/*
  LED を消灯させる
  @param led LEDの相対位置(0-6)
*/
void off(int led) {
   digitalWrite(ledPin[led], LOW);  // set the LED off
}

/*
  LED の全消灯
*/
void clearLED() {
  for (int i = 0; i < 7; i++) off(i);
}

/*
  一定時間にスイッチがオンになったかどうか
*/
int readSW() {
  unsigned long time = millis();
  int sw = 0;
  // 1秒経過するまで待つ
  for(;;) {
    if (digitalRead(inputPin) == LOW) {
      sw = 1;
      break;
    }
    if (time + 1000L <= millis()) break;
    off(3);
    delay(10);
    on(3);
    delay(10);
  }
  return sw;
}

更新記録


Japanino (Arduino)の調べ  将棋の調べ  鉄道の調べ  旅先料理の調べ  ビールコレクション

Copyright © 2010 GOMI Hiroshi All Rights Reserved