第8回 IoT×プログラミング教育
光センサーで今度はオルゴールを作りましょう。
回路は前回のものから、LEDを取り除いただけです。
明るいときに曲を流す
オルゴールの箱の中に、光センサーを付けたArduinoを格納します。
箱を開けたら明るくなるので、前回(暗くしたら処理実行)とは不等式が逆のif文となります。
#define PIN 10 int val = 0; void setup(){ pinMode(PIN, OUTPUT); Serial.begin(9600); } void loop() { val = analogRead(0); Serial.println(val); if(val > 300){ //明るいと判定する基準値 //ここに曲を書く } delay(500); }
次に「tone()」を使って曲を書きますが・・・以前のような書き方だと、記述量が多くてけっこう疲れてしまいます。
ひとつの音を出すのに、2つの関数「tone()」と「delay()」が必要なので、かえるのうたでも58行となってしまいました。
なので、記述量を減らすために、新たな関数「runTone() 」を作りました。
#define PIN 10 #define BEAT 600 //音の長さ int val = 0; void setup(){ pinMode(PIN, OUTPUT); Serial.begin(9600); } void loop() { val = analogRead(0); Serial.println(val); if(val > 300){ runMusic(); //曲を流す } delay(500); } void runTone(int n, double len){ tone(PIN, n, BEAT * len); //音を出す delay(BEAT * len); //音が出ている間待つ } void runMusic(){ runTone(392,0.5); //ソ runTone(440,0.5); //ラ runTone(392,0.5); //ソ // ・・・曲は続く }
「runTone() 」で、以前より曲を書きやすくなりました。
「runTone(ドレミ番号, 音の長さ) 」となっており、第2引数の音の長さは、1が四分音符、0.5なら八分音符、2なら二分音符となります。
この数と、前もって記述した定数「BEET」のミリ秒をかけた数字が、音の長さとなります。
ここまでできたら、あとは仕上げです。
「runTone() 」 の中で、光センサーから明るさを取得して、一音ずつ鳴らすかどうかの判断をさせましょう。
箱を閉じて暗くなったら、次の音を出ないようにするためです。
最終的なコードです。
#define PIN 10 #define BEAT 600 int val = 0; void setup(){ pinMode(PIN, OUTPUT); Serial.begin(9600); } void loop() { val = analogRead(0); Serial.println(val); if(val > 300){ runMusic(); } delay(500); } void runTone(int n, double len){ val=analogRead(0); //明るさを取得 if(val > 300){ //明るいとき tone(PIN, n, BEAT * len); delay(BEAT * len); } } void runMusic(){ runTone(392,0.5); //ソ runTone(440,0.5); //ラ runTone(392,0.5); //ソ runTone(330,0.5); //ミ runTone(392,0.5); //ソ runTone(440,0.5); //ラ runTone(392,0.5); //ソ runTone(330,0.5); //ミ runTone(262,0.5); //ド runTone(294,0.5); //レ runTone(330,0.5); //ミ runTone(330,0.5); //ミ runTone(294,2); //レ runTone(330,0.5); //ミ runTone(392,0.5); //ソ runTone(392,0.5); //ソ runTone(392,0.5); //ソ runTone(440,0.5); //ラ runTone(523,0.5); //ド runTone(523,0.5); //ド runTone(523,0.5); //ド runTone(392,0.5); //ソ runTone(440,0.5); //ラ runTone(330,0.5); //ミ runTone(294,0.5); //レ runTone(262,2); //ド }
なんとか組みあがりました。
引数にも型が必要なんだ・・・とか、intって整数しか入らないんだ・・・とか、そんなレベルのC言語プログラミングでしたが、とりあえず思惑通りの動作をしています。
きっとポイントは20~24行目。
明るい時にしか音を鳴らす待ち時間「delay()」が実行されないので、暗くなると一瞬で曲の処理「runMusic()」が終了します。
終了しているので、再び明かるくなったとき、最初から曲が流れます。
いままではループで曲が流れっぱなしで制御できてなかったので、一歩前進した気がします。
箱詰めしてプレゼント
ふたつきの箱に、Arduino、ブレッドボード、モバイルバッテリーを格納します。
子供(三男)にプレゼントしてみます。
曲は「たき火」です。
なんだか、おもしろいようです。
箱を開けたら○○をする・・・という仕掛けは、まだまだアイデアが出てきそうです。
しかし、先に進みましょう。
次回は赤外線距離センサーを使います。