今回も投稿主の重度のディズニーヲタク(=Dヲタ)ぶりにより、例によってDヲタ用語が飛び出しております。
注釈をつけておりますのでご活用ください。
2021年11月1日からTDL1にEパレ2が帰ってきますね。
(参考:東京ディズニーランドⓇ/東京ディズニーシーⓇの運営について)
パレード自体が楽しいのはもちろんですが、パレードを待っているときのワクワク感ってよくないですか??
緩和してきたとはいえ、なかなかディズニーに行けない!だけど何かでワクワクはしたい!
そんな方向けに、おうちでもパレードがはじまる前のワクワク感を感じられる装置を作りました。
そして、忘れていませんか?あの地蔵3の感覚。
厳しい寒さ、暑さに耐えうるためにも、今のうちに地蔵開始時の気温や明るさを自宅にいる時から把握しておきましょう。
色々と書きましたが、「家にいる時もパレード開始時間を感じたい」というだけの、
超絶個人的な理由から「パレードの時間を光と音で知らせてくれる装置」を作成した、ということです。
#皆さまにお知らせいたします(パーク内アナウンス)
見出しのアナウンス流れた直後に現場がピリつく感じが好きです。(なんの話だ)
作成したものを動画にしました。
YouTubeに飛んでいただければ、概要欄にチャプター記載しています。
#ワクワクはどうやったら感じるんだろう?(byミッキー)
実際のパークでもパレード、ショーの開始時間は何回かに分けてお知らせされます。
確認したところ、パレードの開始時間1時間前、30分前、15分前、5分前に園内アナウンスが流れていました。
今回の装置も同じように4回知らせることにします。
一定時間コードを実行させ、それぞれの時間になったら音と光を出すようにします。
そして、どうせなら楽しくしたいのでディズニーミュージックを流し、本当のパレードのようにします。
#わかったわ!こういうことね?(byミニー)
概要
- 一定時間コードを実行し続ける。
- 設定した時間の1時間前、30分前、15分前、5分前を知らせる。
- 各時間になったらディズニーメロディーを流す。
- メロディーにあわせてRGBLEDを光らせる。
- RGBLEDが剥き出しだと眩しいため家にあったスモワ4のポップコーンバケット5に放り込む。
#グワッグワグワグワッグワッ!(なにを使ったのさ!)(byドナルド)
使用環境・パーツなど
Node.js v16.10.0
obniz Board 1Y OSver3.2.1
マイコン内蔵RGBLED 8mm PL9823-F8 (※これがとっても壊れやすい!取り扱い要注意!)
圧電スピーカー(圧電サウンダ)(13mm)PKM13EPYH4000-A0
ミニブレッドボード BB-601(白)
ブレッドボード・ジャンパーワイヤ(オス-オス)10cmセット
USBケーブル USB2.0 Type-Aオス⇔TypeCオス 1.5m
こちらはなくてもいいけど、あると安心してobnizを取り扱えます。
ちなみに私は白にしました。(聞いてない)
「obniz Board 1Y」用ケース
#中身を見せるわね♪(byデイジー)
「とっても長くなっちゃったから折りたたんであるわ!開いてみてね!」(byデイジー)
完成コード
const Obniz = require('obniz');
const obniz = new Obniz('Obniz_ID'); // Obniz_IDを設定
// 任意の秒数待つことができる関数
const sleep = (msec) => new Promise(res => setTimeout(res, msec));
// **定数**音符・休符の長さ
const note = 1600; //全音符・全休符
const note2 = note / 2; //2分音符・2分休符
const note4 = note / 4; //4分音符・4分休符
const note8 = note / 8; //8分音符・8分休符
const note16 = note / 16; //16分音符・16分休符
const note32 = note / 32; //16分音符・16分休符/2
const notedot2 = note2 + note4; //付点2分音符・付点2分休符
const notedot8 = note8 + note16; //付点8分音符・付点8分休符
const notedot16 = note16 + (note16 / 2); //付点16分音符・付点16分休符
// **定数**音階
const dl1 = 293.665; // レ
const disl1 = 311.127; // レ#
const el1 = 329.628; // ミ
const fl1 = 349.228; // ファ
const fisl1 = 369.994; // ファ#
const gl1 = 391.995; // ソ
const gisl1 = 415.305; // ソ#
const al1 = 440; // ラ
const aisl1 = 466.164; // ラ#(シ♭)
const hl1 = 493.883; // シ
const c = 523.251; // ド
const cis = 554.365; // ド#
const d = 587.330; // レ
const dis = 622.254; // レ#(ミ♭)
const e = 659.255; // ミ
const f = 698.456; // ファ
const fis = 739.989; // ファ#
const gis = 830.609; // ソ#(ラ♭)
const ais = 932.328; // ラ#(シ♭)
const h = 987.767; // シ
// obnizがオンラインであることが確認されたら、以下の関数内が自動で実行されます
obniz.onconnect = async function () {
// RGBLEDを利用
const rgbled = obniz.wired('WS2811', { gnd: 0, vcc: 1, din: 2 });
// 最初は点灯しない
rgbled.rgb(0, 0, 0);
// スピーカーを利用
const speaker = obniz.wired('Speaker', { signal: 9, gnd: 10 });
// ディスプレイ表示(初期画面)
obniz.display.clear(); // クリア
obniz.display.print('We hope you enjoy the rest of your stay');
// setIntervalで一定間隔で処理(1分間隔)
setInterval(async function () {
// 現在時間
var nowtime = new Date().getTime();
// 設定時間
var paradetime = new Date('yyyy/mm/dd hh:mm').getTime();
// 差分計算
var diftime = nowtime - paradetime; // 現在時間-設定時間
var diftime = diftime / (60*1000); // 結果を分に直す
var diftime = Math.floor(diftime); // 小数点を切り捨て
// 最初は音を流さない
speaker.stop();
// 5分前になったらBrand New Dayを流す
if (diftime === -5) {
console.log('5分前');
obniz.display.clear(); // クリア
obniz.display.print('just a few minutes'); // ディスプレイ表示(5分前)
// Brand New Day
speaker.play(h); rgbled.rgb(0, 0, 255); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(h); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(h); rgbled.rgb(200, 0, 200); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fl1); rgbled.rgb(255, 140, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 255, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(0, 0, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fl1); rgbled.rgb(200, 0, 200); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 140, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(0, 255, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 0, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dis); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(d); rgbled.rgb(200, 0, 200); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(c); rgbled.rgb(255, 140, 0); await sleep(notedot8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fl1); rgbled.rgb(0, 255, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 0, 255); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(255, 0, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(200, 0, 200); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fl1); rgbled.rgb(255, 140, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 255, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(0, 0, 255); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 0, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dis); rgbled.rgb(200, 0, 200); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(d); rgbled.rgb(255, 140, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(c); rgbled.rgb(0, 255, 0); await sleep(notedot8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fl1); rgbled.rgb(0, 0, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(200, 0, 200); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 140, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fl1); rgbled.rgb(0, 255, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 0, 255); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(200, 0, 200); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dis); rgbled.rgb(255, 140, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(f); rgbled.rgb(0, 255, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 0, 255); await sleep(notedot8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fl1); rgbled.rgb(255, 0, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(200, 0, 200); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(255, 140, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 255, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fl1); rgbled.rgb(0, 0, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(200, 0, 200); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 140, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dis); rgbled.rgb(0, 255, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(d); rgbled.rgb(0, 0, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dis); rgbled.rgb(255, 0, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0);
// 15分前になったらエレクトリカルパレードを流す
} else if (diftime === -15) {
console.log('15分前');
obniz.display.clear(); // クリア
obniz.display.print('15minutes'); // ディスプレイ表示(15分前)
speaker.play(gl1); rgbled.rgb(255, 0, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // ピンク
speaker.play(hl1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // オレンジ
speaker.play(c); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 黄色
speaker.play(d); rgbled.rgb(164, 255, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 黄緑色
speaker.play(gl1); rgbled.rgb(0, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 水色
speaker.play(el1); rgbled.rgb(0, 125, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 薄青
speaker.play(al1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 紫
speaker.play(gl1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(164, 255, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dl1); rgbled.rgb(0, 255, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 125, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(164, 255, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 255, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(0, 125, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(164, 255, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(0, 255, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dl1); rgbled.rgb(0, 125, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(200, 0, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(c); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(d); rgbled.rgb(255, 241, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(164, 255, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(0, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(0, 125, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dl1); rgbled.rgb(164, 255, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 255, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(0, 125, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(164, 255, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 255, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(0, 125, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dl1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 241, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); ;
// 30分前になったらワンマンズドリーム2を流す
} else if (diftime === -30){
console.log('30分前');
obniz.display.clear(); // クリア
obniz.display.print('30minutes'); // ディスプレイ表示(30分前)
// ワンマンズドリーム2
speaker.play(fisl1); rgbled.rgb(255, 255, 255); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 白
speaker.play(fis); rgbled.rgb(218, 179, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 金
speaker.play(cis); rgbled.rgb(150, 154, 152); await sleep(note); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 銀
speaker.play(hl1); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(218, 179, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gisl1); rgbled.rgb(150, 154, 152); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gisl1); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(218, 179, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(150, 154, 152); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(255, 255, 255); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(cis); rgbled.rgb(218, 179, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dis); rgbled.rgb(150, 154, 152); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(e); rgbled.rgb(255, 255, 255); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fis); rgbled.rgb(218, 179, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fis); rgbled.rgb(150, 154, 152); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gis); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gis); rgbled.rgb(218, 179, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(ais); rgbled.rgb(150, 154, 152); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(ais); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(ais); rgbled.rgb(218, 179, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(ais); rgbled.rgb(150, 154, 152); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gis); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(ais); rgbled.rgb(218, 179, 0); await sleep(note); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(disl1); rgbled.rgb(150, 154, 152); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(disl1); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(218, 179, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(150, 154, 152); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(218, 179, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gisl1); rgbled.rgb(150, 154, 152); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(218, 179, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(150, 154, 152); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(cis); rgbled.rgb(255, 255, 255); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dis); rgbled.rgb(218, 179, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dis); rgbled.rgb(150, 154, 152); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(cis); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(cis); rgbled.rgb(218, 179, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fis); rgbled.rgb(150, 154, 152); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(e); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dis); rgbled.rgb(218, 179, 0); await sleep(note); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(cis); rgbled.rgb(150, 154, 152); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(cis); rgbled.rgb(255, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(218, 179, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(cis); rgbled.rgb(150, 154, 152); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(255, 255, 255); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(218, 179, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(150, 154, 152); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(255, 255, 255); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(218, 179, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(aisl1); rgbled.rgb(150, 154, 152); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 255, 255); await sleep(notedot2); speaker.stop(); rgbled.rgb(0, 0, 0);
// 1時間前になったらミッキーマウスマーチを流す
} else if (diftime === -60) {
console.log('1時間前');
obniz.display.clear(); // クリア
obniz.display.print('one hour before the show start time'); // ディスプレイ表示(1時間前)
// ミッキーマウスマーチ
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ドー&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ドー&赤
speaker.play(d); rgbled.rgb(255, 137, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // レ&オレンジ
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(hl1); rgbled.rgb(0, 255, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // シ&緑
speaker.play(al1); rgbled.rgb(0, 0, 255); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ラ&青
speaker.play(gl1); rgbled.rgb(255, 0, 255); await sleep(note2); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ソーー&ピンク
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ドー&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ドー&赤
speaker.play(e); rgbled.rgb(255, 255, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ミ&黄
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(d); rgbled.rgb(255, 137, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // レ&オレンジ
speaker.play(hl1); rgbled.rgb(0, 255, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // シ&緑
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(note2); rgbled.rgb(0, 0, 0); speaker.stop(); // ドーー&赤
// それ以外
} else {
console.log('対象外');
obniz.display.clear(); // クリア
obniz.display.print('We hope you enjoy the rest of your stay'); // ディスプレイ表示(初期値)
rgbled.rgb(0, 0, 0); // LED OFF
speaker.stop; // スピーカーから何も流さない
}
}, 60000); // 60000ミリ秒 = 60秒(1分)おきに実行
}
#アヒャ!作ってみてどうだった?(byグーフィー)
●まずは率直に「楽しかった」です!
好きなディズニー音楽を詰め込んで、パレードやショーのようにライトを光らせて、と作業をしたことで、超超小規模のディズニーのイマジニア6になった気分でした。
何より家にちょうどよいポップコーンバケットがあったのが一番でした!
でも、パークでパレードやショーを作り上げている方々はもっと規模の大きいものを作ってるんですよね……。(遠い目)
今度、パークに行ったときは違う目線でパレードやショーを見ることになりそうです。
●以外な効果もあった!
試しに1時間強、コードを実行したままにしてみました。
ずっと動いているかと思うとソワソワしました。
ふとしたときに音が鳴って光るのでワクワクよりドキドキ感がすごかったです。(笑)
ですが、一定の時間になると単音ですがディズニー音楽が流れ、スモワがカラフルに光るとなんだか楽しくなりました。
そして、これは思わぬ効果だったのですが、在宅勤務時の休憩の良い合図になりました。
在宅環境ですと、つい集中して動かなくなってしまうのですが、この装置のおかげで意識を強制的に中断されるためパソコンから目を離すことができました。
ここからは反省点です。
時間のあるときに再挑戦します。
●日付を直書きしている
今回はパレードの開始時刻取得部分をコードに直書きしています。
自動で取得する、またはユーザーに入力させるようにしたいです。
・公式HPからショースケジュールを取得する。
懸念点→どうやってやるのか。というか、アウトじゃないのか……?
・LINE Botでユーザーに当日のショー開始時間を入力させる。
懸念点→LINE Botを常時使用可能にする必要がある。
●何分前かを知らせる表示をobnizだけにした
obnizの表示だけでも、そこそこ楽しかったのですが、さらに視認性を高めるために何分前かはLINE Botで返せるようにしたいです。
懸念点→LINE Botを常時使用可能にする必要がある。
RGBLED壊れやすい
壊れやすいです。マジで。
手元にあるRGBLEDが最後の1つになったときの緊張感がすごかったです。
皆さまもお気を付けください……。
時間をたくさんかけてしまいましたが、曲を作っているところが一番楽しかったです。
ディズニーはやっぱりいいなぁ。
#ワンッ!ワンワン!ワォーン!(byプルート)
ありがとうプルート!ミッキーが待ってるからもう行っていいよ!
ここからは完成までのあれやこれやを記載しています。
毎度のことながら、お時間のある方は以下の折りたたみを開いてみてください。
完成コードに至るまでのあれやこれや
##まずは光らせる
手始めにobnizのスイッチを押したらRGBLEDがピンクに光る、という単純なコードだけで動かしてみます。
コードはobnizのスイッチ反応部分のみ抜粋しています。
obniz.switch.onchange = function (state) {
if (state === 'push') {
// 押されたとき
console.log('pushed');
// ピンク
rgbled.rgb(255, 0, 255);
} else if (state === 'none') {
// none で押してないとき
console.log('released');
// LED OFF = RGBのいずれも点灯しない = すべて0
rgbled.rgb(0, 0, 0);
}
}
結果はこちら
成功です。
次に光るのと同時に音がなるようにします。
##光る&音が鳴る
obnizのスイッチを押したらRGBLEDがピンクに光り、さらにスピーカーからはドの音を出すようにします。
例によってコードはobnizスイッチ反応部分の抜粋です。
obniz.switch.onchange = function (state) {
if (state === 'push') {
// 押されたとき
console.log('pushed');
// ピンク
rgbled.rgb(255, 0, 255);
// スピーカーから261.626Hz(ド)を流す
speaker.play(261.626);
} else if (state === 'none') {
// none で押してないとき
console.log('released');
// LED OFF = RGBのいずれも点灯しない = すべて0
rgbled.rgb(0, 0, 0);
// スピーカーから何も流さない
speaker.stop();
}
}
結果はこちら
成功です。
やりたいことの下地はできました。
ここから光って音が出るタイミングをコントロールしていきます。
##パレード開始時間の5分前・15分前・30分前・1時間前に光って音を出す
パレードやショーの開始時間前にパーク内にスピール7が流れます。
流れるタイミングは投稿主の調べでは以下の4回のパターンが多いです。
1時間前・・・このスピールがレジャーシートを敷ける合図。
30分前・・・ここまできたらあとはないようなもの。(個人差があります。)
15分前・・・混雑具合によるが、立ち見エリアはこのスピールを合図に立ち上がる。
5分前・・・実際のスピールでは「まもなく」(英語では「just a few minutes」)と表現される。
まずは現在の時刻と設定されたパレード開始時間を比較し、時間の計算ができるようにします。
###現在時刻とパレード開始時刻を計算
まずは下記の記事を参考に、日付計算だけのコードを作成しました。
参考:【JavaScript】日付処理
パレードの開始時刻は公式HPを参考にしています。
今回はパレード開始時刻を「14:05」と設定します。
// 現在の時刻
var dt = new Date();
// 現在の時
var hours = dt.getHours();
// 現在の分
var minutes = dt.getMinutes();
// パレード開始時
var paradehours = 14;
// パレード開始分
var parademin = 05;
// 現在時 - パレード開始時
var difhour = hours - paradehours;
// 現在分 - パレード開始分
var difmin = minutes - parademin;
// 1時間以下
if (difhour === 0){
// 5分前
if (difmin === -5){
console.log('just a few minutes');
// 5分前
} else if (difmin === -15){
console.log('15minutes');
// 30分前
} else if (difmin === -30){
console.log('30minutes');
// それ以外は何もしない
} else {
console.log('');
}
// 1時間前
} else if (difhour === -1){
console.log('one hour before the show start time');
// それ以外は何もしない
} else {
console.log('');
}
テスト実施時刻によって、パレード開始時刻は適宜更新してためします。
結果はこちら
just a few minutes
one hour before the show start time
15minutes
30minutes
それぞれ良い感じに出力されました。
次は各時間によってRGBLEDを光らせ、スピーカーから音を出します!
###5分前になったら赤く光りドの音を出す
ピンクに光らせてドの音を出せたコードを組み合わせてみます。
スイッチの反応ではなく時間経過による反応でできるようにします。
分刻みでお知らせするため、60000ミリ秒 = 60秒(1分)おきに実行するようにします。
一日つけっぱなしのイメージです。
ついでに初期値と対象外の時間帯に表示する文言も変えてみました。
「We hope you enjoy the rest of your stay」
パレード終わりなどによく聞かれるアナウンスです。
// obnizがオンラインであることが確認されたら、以下の関数内が自動で実行されます
obniz.onconnect = async function () {
// setIntervalで一定間隔で処理(1分間隔)
setInterval(async function () {
var dt = new Date(); // 現在の時刻
var hours = dt.getHours(); // 現在の時
var minutes = dt.getMinutes(); // 現在の分
var paradehours = 14; // パレード開始時
var parademin = 05; // パレード開始分
var difhour = hours - paradehours; // 現在時 - パレード開始時
var difmin = minutes - parademin; // 現在分 - パレード開始分
// RGBLEDを利用
const rgbled = obniz.wired('WS2811', { gnd: 0, vcc: 1, din: 2 });
// スピーカーを利用
const speaker = obniz.wired('Speaker', { signal: 9, gnd: 10 });
// 最初は点灯しない
rgbled.rgb(0, 0, 0);
// 最初は音を流さない
speaker.stop();
// ディスプレイ表示(初期画面)
obniz.display.clear();
obniz.display.print('We hope you enjoy the rest of your stay');
// 1時間以下
if (difhour === 0) {
// 5分前
if (difmin === -5){
console.log('5分前');
obniz.display.print('just a few minutes'); // ディスプレイ表示(5分前)
rgbled.rgb(255, 0, 0); // 赤
speaker.play(523.251); // スピーカーから高いドを流す
// 15分前
} else if (difmin === -15){
console.log('15分前');
obniz.display.print('15minutes'); // ディスプレイ表示(15分前)
rgbled.rgb(255, 255, 0); // 黄
speaker.play(391.995); // スピーカーからソを流す
// 30分前
} else if (difmin === -30){
console.log('30分前');
obniz.display.print('30minutes'); // ディスプレイ表示(30分前)
rgbled.rgb(0, 255, 0); // 緑
speaker.play(329.628); // スピーカーからミを流す
// それ以外
} else {
console.log('対象外');
obniz.display.print('We hope you enjoy the rest of your stay'); // ディスプレイ表示(初期値)
rgbled.rgb(0, 0, 0); // LED OFF
speaker.stop; // スピーカーから何も流さない
}
// 1時間前
} else if (difmin === -1) {
console.log('1時間前');
obniz.display.print('one hour before the show start time'); // ディスプレイ表示(1時間前)
rgbled.rgb(0, 0, 255); // 青
speaker.play(261.626); // スピーカーからをドを流す
// それ以外
} else {
console.log('対象外');
obniz.display.print('We hope you enjoy the rest of your stay'); // ディスプレイ表示(初期値)
rgbled.rgb(0, 0, 0); // LED OFF
speaker.stop; // スピーカーから何も流さない
}
}, 60000); // 60000ミリ秒 = 60秒(1分)おきに実行
}
テストの時のみパレード開始時刻と実行間隔を変更しました。
結果はこちら。
赤く光り、ドの音を出すことに成功しました。
obnizの表示も5分前を知らせる文言が……
ん?あれ?初期値の文字も一緒に出ている……。
時間判定を繰り返しているのでこれではいつか文字数オーバーになってしまう!
お知らせ対象外時間帯でも同じ文言を表示しているので、初期値表示をなくします。
###obniz表示のクリア
1分間隔で時間判定を繰り返すたびに、obnizの表示をクリアされるよう初期値の表示をなくします。
// obnizがオンラインであることが確認されたら、以下の関数内が自動で実行されます
obniz.onconnect = async function () {
// setIntervalで一定間隔で処理(1分間隔)
setInterval(async function () {
var dt = new Date(); // 現在の時刻
var hours = dt.getHours(); // 現在の時
var minutes = dt.getMinutes(); // 現在の分
var paradehours = hh; // パレード開始時
var parademin = mm; // パレード開始分
var difhour = hours - paradehours; // 現在時 - パレード開始時
var difmin = minutes - parademin; // 現在分 - パレード開始分
// RGBLEDを利用
const rgbled = obniz.wired('WS2811', { gnd: 0, vcc: 1, din: 2 });
// スピーカーを利用
const speaker = obniz.wired('Speaker', { signal: 9, gnd: 10 });
// 最初は点灯しない
rgbled.rgb(0, 0, 0);
// 最初は音を流さない
speaker.stop();
// ディスプレイ表示(初期画面)
obniz.display.clear(); // クリア
// 1時間以下
if (difhour === 0) {
// 5分前
if (difmin === -5){
console.log('5分前');
obniz.display.print('just a few minutes'); // ディスプレイ表示(5分前)
rgbled.rgb(255, 0, 0); // 赤
speaker.play(523.251); // スピーカーから高いドを流す
// 15分前
} else if (difmin === -15){
console.log('15分前');
obniz.display.print('15minutes'); // ディスプレイ表示(15分前)
rgbled.rgb(255, 255, 0); // 黄
speaker.play(391.995); // スピーカーからソを流す
// 30分前
} else if (difmin === -30){
console.log('30分前');
obniz.display.print('30minutes'); // ディスプレイ表示(30分前)
rgbled.rgb(0, 255, 0); // 緑
speaker.play(329.628); // スピーカーからミを流す
// それ以外
} else {
console.log('対象外');
obniz.display.print('We hope you enjoy the rest of your stay'); // ディスプレイ表示(初期値)
rgbled.rgb(0, 0, 0); // LED OFF
speaker.stop; // スピーカーから何も流さない
}
// 1時間前
} else if (difmin === -1) {
console.log('1時間前');
obniz.display.print('one hour before the show start time'); // ディスプレイ表示(1時間前)
rgbled.rgb(0, 0, 255); // 青
speaker.play(261.626); // スピーカーからをドを流す
// それ以外
} else {
console.log('対象外');
obniz.display.print('We hope you enjoy the rest of your stay'); // ディスプレイ表示(初期値)
rgbled.rgb(0, 0, 0); // LED OFF
speaker.stop; // スピーカーから何も流さない
}
}, 60000); // 60000ミリ秒 = 60秒(1分)おきに実行
}
例によって、テストの時のみパレード開始時刻と実行間隔を変更しました。
今回は15分前と仮定して実行してみます。
結果はこちら。
成功です。
obnizの表示も以下のとおりうまくいきました。
ここで新たなエラーが発生しました。
1回目、2回目は問題なく実行されますが必ず3回目で以下のエラーが出力されます。
C:\Users\Desktop\obniz-iot\node_modules\obniz\dist\src\obniz\ObnizComponents.js:322
throw new Error(`No More ${peripheral} Available.`);
^
Error: No More spi Available.
at Obniz._getFreePeripheralUnit (C:\Users\Desktop\obniz-iot\node_modules\obniz\dist\src\obniz\ObnizComponents.js:322:15)
at Obniz.getFreeSpi (C:\Users\Desktop\obniz-iot\node_modules\obniz\dist\src\obniz\ObnizComponents.js:112:21)
at Obniz.getSpiWithConfig (C:\Users\Desktop\obniz-iot\node_modules\obniz\dist\src\obniz\ObnizComponents.js:126:26)
at WS2811.wired (C:\Users\Desktop\obniz-iot\node_modules\obniz\dist\src\parts\Light\WS2811\index.js:92:31)
at Obniz.wired (C:\Users\Desktop\obniz-iot\node_modules\obniz\dist\src\obniz\ObnizParts.js:103:15)
at Timeout._onTimeout (C:\Users\Desktop\obniz-iot\paradetime.js:37:30)
at listOnTimeout (node:internal/timers:557:17)
at processTimers (node:internal/timers:500:7)
さてはて困りました……。
1日中動かしておく前提のため、たった3回目でエラーが出ては困ります。
チームに相談したところ、一定間隔で実行する関数setInterval
内に、RGBLEDとスピーカーの定義を書いていたのがよくなかったようです。
以下の2行をsetInterval
の外に出したらこのエラーは解消されました。
// RGBLEDを利用
const rgbled = obniz.wired('WS2811', { gnd: 0, vcc: 1, din: 2 });
// スピーカーを利用
const speaker = obniz.wired('Speaker', { signal: 9, gnd: 10 });
###時間計算をやり直す
うまくいったと思っていた時間計算ですが、ここにも落とし穴がありました。
以下の計算方法だと「13:50」と「14:05」で計算した際に「15分前」と判定されません。
それもそのはず。'13-14=-1'となり、1時間前の判定に入ってしまうのです。
ということで、計算方法を変更します。
// ***この計算方法はNG!!***
var dt = new Date(); // 現在の時刻
var hours = dt.getHours(); // 現在の時
var minutes = dt.getMinutes(); // 現在の分
var paradehours = hh; // パレード開始時
var parademin = mm; // パレード開始分
var difhour = hours - paradehours; // 現在時 - パレード開始時
var difmin = minutes - parademin; // 現在分 - パレード開始分
以下のサイトを参考に修正したコードがこちらです。
(参考:2つの日時の差分を計算する)
// 現在時間
var nowtime = new Date().getTime();
// 設定時間
var paradetime = new Date('設定した時間').getTime();
// 差分計算
var diftime = nowtime - paradetime; // 現在時間-設定時間
var diftime = diftime / (60*1000); // 結果を分に直す
var diftime = Math.floor(diftime); // 小数点を切り捨て
現在時間、設定時間、計算結果をconsole.log
で出力した結果がこちら。
1635296402025
1635298500000
-35
うまく時間判定ができそうです!
if
文の内容も変更した判定部分がこちらです。
// 5分前になったらBrand New Dayを流す
if (diftime === -5) {
console.log('5分前');
obniz.display.print('just a few minutes'); // ディスプレイ表示(5分前)
// ~Brand New Day部分は省略~
exit();
// 15分前になったらエレクトリカルパレードを流す
} else if (diftime === -15) {
console.log('15分前');
obniz.display.print('15minutes'); // ディスプレイ表示(15分前)
// ~エレクトリカルパレード部分は省略~
exit();
// 30分前になったらワンマンズドリーム2を流す
} else if (diftime === -30){
console.log('30分前');
obniz.display.print('30minutes'); // ディスプレイ表示(30分前)
// ~ワンマンズドリーム2部分は省略~
exit(); // 自動終了
// 1時間前になったらミッキーマウスマーチを流す
} else if (diftime === -60) {
console.log('1時間前');
obniz.display.print('one hour before the show start time'); // ディスプレイ表示(1時間前)
// ~ミッキーマウスマーチ部分は省略~
exit(); // 自動終了
// それ以外
} else {
console.log('対象外');
obniz.display.print('We hope you enjoy the rest of your stay'); // ディスプレイ表示(初期値)
rgbled.rgb(0, 0, 0); // LED OFF
speaker.stop; // スピーカーから何も流さない
}
if
文の内容も問題なさそうです。
さて、せっかく音を出すのだからもっと楽しくしたいです。
上記コードにもあるとおり、私の好きなディズニーミュージックにしてみます。
##欲を出す
どうせ音を出すなら何か曲がいいなぁ。
音が変わるの合わせてRGBLEDの光も点滅させたいなぁ。
と欲がでました。
ということでやってみます。
###ミッキーマウスマーチ
5分前になったらミッキーマウスマーチを、音が変わるのに合わせてRGBLEDを点滅させます。
友人のアイデアを拝借し音と音の長さは定数化しました。
コードはその定数部分と音を出している部分だけ抜粋します。
別の曲で使用するため、使用していない定数も記載しています。
// **定数**音符・休符の長さ
const note = 1600; //全音符・全休符
const note2 = note / 2; //2分音符・2分休符
const note4 = note / 4; //4分音符・4分休符
const note8 = note / 8; //8分音符・8分休符
const note16 = note / 16; //16分音符・16分休符
const note32 = note / 32; //16分音符・16分休符/2
const notedot2 = note2 + note4; //付点2分音符・付点2分休符
const notedot4 = note4 + note8; //付点4分音符・付点4分休符
const notedot8 = note8 + note16; //付点8分音符・付点8分休符
const notedot16 = note16 + (note16 / 2); //付点16分音符・付点16分休符
// **定数**音階
const dl1 = 293.665; // レ
const el1 = 329.628; // ミ
const fisl1 = 369.994; // ファ#
const gl1 = 391.995; // ソ
const al1 = 440; // ラ
const hl1 = 493.883; // シ
const c = 523.251; // ド
const d = 587.330; // レ
const e = 659.255; // ミ
const g = 783.991; // ソ
const a = 880; // ラ
const h = 987.767; // シ
const ch1 = 1046.502; // ド
const dh1 = 1174.659; // レ
const eh1 = 1318.510; // ミ
obniz.onconnect = async function () {
// RGBLEDを利用
const rgbled = obniz.wired('WS2811', { gnd: 0, vcc: 1, din: 2 });
// スピーカーを利用
const speaker = obniz.wired('Speaker', { signal: 9, gnd: 10 });
// 最初は点灯しない
rgbled.rgb(0, 0, 0);
// ミッキーマウスマーチ
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ドー&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ドー&赤
speaker.play(d); rgbled.rgb(255, 137, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // レ&オレンジ
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(hl1); rgbled.rgb(0, 255, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // シ&緑
speaker.play(al1); rgbled.rgb(0, 0, 255); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ラ&青
speaker.play(gl1); rgbled.rgb(255, 0, 255); await sleep(note2); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ソーー&ピンク
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ドー&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(note4); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ドー&赤
speaker.play(e); rgbled.rgb(255, 255, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ミ&黄
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // ド&赤
speaker.play(d); rgbled.rgb(255, 137, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // レ&オレンジ
speaker.play(hl1); rgbled.rgb(0, 255, 0); await sleep(notedot16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(notedot16); // シ&緑
speaker.play(c); rgbled.rgb(255, 0, 0); await sleep(note2); rgbled.rgb(0, 0, 0); speaker.stop(); // ドーー&赤
exit(); // 自動終了
}
###エレクトリカルパレード(バロックホーダウン)
15分前にはエレクトリカルパレード(バロックホーダウン8)を流します。
RGBLEDは7色が順番に点滅するようにします。
コードは音を出している部分だけ抜粋します。
obniz.onconnect = async function () {
// RGBLEDを利用
const rgbled = obniz.wired('WS2811', { gnd: 0, vcc: 1, din: 2 });
// スピーカーを利用
const speaker = obniz.wired('Speaker', { signal: 9, gnd: 10 });
// 最初は点灯しない
rgbled.rgb(0, 0, 0);
// エレクトリカルパレード
speaker.play(gl1); rgbled.rgb(255, 0, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // ピンク
speaker.play(hl1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // オレンジ
speaker.play(c); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 黄色
speaker.play(d); rgbled.rgb(164, 255, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 黄緑色
speaker.play(gl1); rgbled.rgb(0, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 水色
speaker.play(el1); rgbled.rgb(0, 125, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 薄青
speaker.play(al1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32); // 紫
speaker.play(gl1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(164, 255, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dl1); rgbled.rgb(0, 255, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 125, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(164, 255, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 255, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(0, 125, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(164, 255, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(0, 255, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dl1); rgbled.rgb(0, 125, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(200, 0, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(c); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(d); rgbled.rgb(255, 241, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(164, 255, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(0, 255, 255); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(0, 125, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dl1); rgbled.rgb(164, 255, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 255, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(0, 125, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(hl1); rgbled.rgb(255, 241, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(al1); rgbled.rgb(164, 255, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(0, 255, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(0, 125, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(el1); rgbled.rgb(200, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(fisl1); rgbled.rgb(255, 0, 255); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(dl1); rgbled.rgb(255, 165, 0); await sleep(note16); speaker.stop(); rgbled.rgb(0, 0, 0); await sleep(note32);
speaker.play(gl1); rgbled.rgb(255, 241, 0); await sleep(note8); speaker.stop(); rgbled.rgb(0, 0, 0); ;
exit();
}
結果はこちら。
RGBLEDまぶしかったので、TDLで購入したスモワのポップコーンバケットにobnizと、スピーカーとRGBLEDをブレッドボードとジャンパーワイヤでつないだものを投入しました。
これはもうディズニーランドと言っても過言ではありません。(過言です。)
あとの2曲については完成動画と完成コードをご覧ください!
-
東京ディズニーランドの略 ↩
-
Evening Parade(イヴニングパレード=夜のパレード)の略。エレクトリカルパレードの略ではないので注意。⇔Dパレ。Day Parade(デイパレード=昼のパレード)の略。 ↩
-
パークでパレードやショーを長い時間その場で待つこと。由来、出典ともに不明。お供え物をしても特に御利益はない。 ↩
-
TDLのファンタジーランドにあるアトラクション。イッツ・ア・スモールワールドの略。全世界どのディズニーランドにも存在する。2018年に大幅リニューアルされ、多くのディズニーキャラクターが追加された。 ↩
-
パーク内で販売されているポップコーンを入れる入れ物。再びパークに持っていけばリフィルでポップコーンを入れてもらえる。最近はポップコーンバケットの機能としてよりオブジェとして飾ってもいいような作りになってきている。その分値段もあがっている。 ↩
-
Imagination(想像)とEngineer(技師)を組合せた言葉。ウォルト・ディズニー・イマジニアリング(Walt Disney Imagineering)で働く従業員の総称。 ↩
-
園内アナウンスのこと。5分前アナウンス→5分前スピール。「スピ」と略されることも。 ↩
-
エレクトリカルパレードの冒頭に流れる曲名。あの、「チャンチャカチャンチャン♪チャンチャカチャカチャカ♪~」のあれ。 ↩