Obnizと圧電スピーカーで日が暮れたら「ゆうやけこやけ」を流して切なくなってみた

#まずは完成形
CdSセル（照度センサ）で暗くなると、ゆうやけこやけが流れます。
この曲聞くと切なくなるな。。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <br>夕暮れ時に「ゆうやけこやけ」を圧電スピーカーから流してみたよ。 <a href="https://t.co/km2YmlAKAi">pic.twitter.com/km2YmlAKAi</a></p>&mdash; @Jis (@PmanRabbit) <a href="https://twitter.com/PmanRabbit/status/1317818556285816834?ref_src=twsrc%5Etfw">October 18, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#使った部品
・Obniz Board 1Y
・圧電スピーカー（PKM13EPYH4000-A0）
・CdSセル（MI527/MI5527）
・カーボン抵抗 1/2W330Ω（CFS50J330RB）
・ミニブレッドボード（BB-601）
・ブレッドボード・ジャンパーワイヤ(オス-オス)（BBJ-20）

#接続図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/85491696-80a0-c0b8-a040-e4fdf9c9496f.png)

#コード
```javascript:.js
const Obniz = require('obniz');
const obniz = new Obniz('0000-0000'); // Obniz_ID

// 任意の秒数待つことができる関数
// 参考: https://qiita.com/suin/items/99aa8641d06b5f819656
const sleep = (msec) => new Promise(res => setTimeout(res, msec));

// 音階
const Key = {
    "ド" : 261.626,
    "レ" : 293.665,
    "ミ" : 329.628,
    "ファ" : 349.228,
    "ソ" : 391.995,
    "ラ" : 440.000,
    "シ" : 493.883,
    "ド2" : 523.251,
    "レ2" : 587.330
}

obniz.onconnect = async function () {

    // ディスプレイ表示
    obniz.display.clear();
    obniz.display.print('TEST');

    // スピーカー
    const speaker = obniz.wired('Speaker', { signal: 0, gnd: 1 });

    // 照度センサ
    obniz.io9.output(true);  // io9電圧を5Vに（電源＋）
    obniz.io11.output(false); // io11電圧を0Vに（電源−）

    // setIntervalで一定間隔で処理
    setInterval(async function () {
        // io10をアナログピンに(照度センサーの値を取得)
        var voltage = await obniz.ad10.getWait();
        console.log(`changed to ${voltage} v`);

        if (voltage < 0.3) {
            // 暗くなったら「ゆうやけこやけ」を流す
            speaker.play(Key["ソ"]); await sleep(1000); speaker.stop(); await sleep(100);
            speaker.play(Key["ソ"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ラ"]); await sleep(500); speaker.stop(); await sleep(100);

            speaker.play(Key["ソ"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ソ"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ソ"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ミ"]); await sleep(500); speaker.stop(); await sleep(100);

            speaker.play(Key["ド"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ド"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["レ"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ミ"]); await sleep(500); speaker.stop(); await sleep(100);

            speaker.play(Key["レ"]); await sleep(1500); speaker.stop(); await sleep(500);

            speaker.play(Key["ミ"]); await sleep(1000); speaker.stop(); await sleep(100);
            speaker.play(Key["ミ"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ソ"]); await sleep(500); speaker.stop(); await sleep(100);

            speaker.play(Key["ラ"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ド2"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ド2"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ラ"]); await sleep(500); speaker.stop(); await sleep(100);

            speaker.play(Key["ソ"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ソ"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ラ"]); await sleep(500); speaker.stop(); await sleep(100);
            speaker.play(Key["ソ"]); await sleep(500); speaker.stop(); await sleep(100);

            speaker.play(Key["ド2"]); await sleep(1500); speaker.stop(); await sleep(500);
        }
    }, 20000);  // 20秒（約1曲分は待つ）
}
```

#やってみた感想
圧電スピーカーは周波数で音階を決められるので、曲を流すのは割と簡単でした。
参考：[音階周波数](https://tomari.org/main/java/oto.html)

今回、圧電スピーカーで曲を流してみたかっただけですが、なかなか面白かった。ハマりそうです。。スピーカーを複数繋げれば、和音も表現できそうで曲の幅が広がりそうで、時間があったらやってみたい。