ArduinoUNOを使って、今日はタイマーっぽいものを作ってみました。先日ブレッドボードに12個のLEDを乗せて光らせてみたのですが、そのLEDをあやつる感覚を楽しめるようなものを考えました。
完成した様子はこんな感じです。
IMG_5099S.jpg
青い可変抵抗をまわすとLEDが1個~10個までの間で点灯したり消えたりします。LEDの数が計測する時間の長さを表していて、タクトスイッチを押すと計測が始まります。時間を計り終えると圧電ブザーが鳴るようにしました。
IMG_5100S.jpg
スケッチは少々複雑になりましたが、設定モードと計測モードの2つのモードを持っていて、設定モードのときタクトスイッチを押すと計測モードに入り、計測モードが終了したら(設定した時間が経過したら)設定モードに戻るようにしました。
設定モードでは可変抵抗の値(0~1023)を10段階の値に変換し、点灯するLEDの数を決めています。
IMG_5101S.jpg
タクトスイッチが押されたら、そのときの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);
}
}
}
カテゴリー: ロボット/IoT

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください