ArduinoUNOを使って、今日はタイマーっぽいものを作ってみました。先日ブレッドボードに12個のLEDを乗せて光らせてみたのですが、そのLEDをあやつる感覚を楽しめるようなものを考えました。
完成した様子はこんな感じです。
青い可変抵抗をまわすとLEDが1個~10個までの間で点灯したり消えたりします。LEDの数が計測する時間の長さを表していて、タクトスイッチを押すと計測が始まります。時間を計り終えると圧電ブザーが鳴るようにしました。
スケッチは少々複雑になりましたが、設定モードと計測モードの2つのモードを持っていて、設定モードのときタクトスイッチを押すと計測モードに入り、計測モードが終了したら(設定した時間が経過したら)設定モードに戻るようにしました。
設定モードでは可変抵抗の値(0~1023)を10段階の値に変換し、点灯するLEDの数を決めています。
タクトスイッチが押されたら、そのときのLEDの数を初期値としてカウントダウンを始めます。すぐに終わってしまってはつまらないですし、かといって時間がかかりすぎても退屈してしまうので、LED1個あたり10秒かぞえることにしました。
数えているときは端のLEDが点滅するようにし、点滅しながら圧電ブザーからピッコッピッコッという音が出るようにしました。
プログラム内ではdelay()を使ってタイマーっぽく動かしているのですが、本当は割り込みを使わないと正確な時間は計れないと思うので、近いうちに割り込みも使ってみたいと思います。
スケッチは下記のような感じです。
int val = 0; int mode = 0; //0=setup 1=run int time = 0; int sec = 10; int bPin = 3; int sPin = 2; int vPin = A0; void setup(){ Serial.begin(9600); for(int i = 4; i <=13; i++){ pinMode(i, OUTPUT); } pinMode(bPin, OUTPUT); pinMode(sPin, INPUT_PULLUP); } void loop(){ if(mode == 0){ val = analogRead(vPin); time = 11 - (val / 100); showled(time); delay(100); if(digitalRead(sPin) == LOW){ mode = 1; sec = 10; tone(bPin,3520,100); delay(1000); } } if(mode == 1){ showled(time - 1); tone(bPin,1760,50); delay(450); showled(time); tone(bPin,880,50); delay(450); sec = sec - 1; if(sec == 0){ sec = 10; time = time - 1; if(time == 0){ mode = 0; showled(10); tone(bPin,880,2000); } } } } void showled(int time){ for(int i = 1; i <= 10; i++){ int pin = i + 3; if(i <= time){ digitalWrite(pin, HIGH); }else{ digitalWrite(pin, LOW); } } }
0件のコメント