Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9059

プログラミング素人が傘持参忘れ防止センサーを作ってみた

$
0
0

Protooutstudioという、プログラミングスクールではなく、プロトタイピングをアウトプットするというスクールに受講生の記事です。
第6回宿題「GW or 初夏にちなんだアウトプット」の制作物として、傘忘れ防止センサーを作ってみました。

2020-05-02_22h18_34.png

constObniz=require("obniz");global.fetch=require("node-fetch");letweahterFlag="mess";//分岐用のフラグlettodayWeather="";//分岐用のフラグ//天気APIを取得する関数を定義しておくasyncfunctioncallApi(){letres=awaitfetch("http://api.openweathermap.org/data/2.5/forecast?q=tokyo&appid=自分のID"//GETリクエスト);letresjson=awaitres.json();todayWeather=resjson.list[4].weather[0].main;}varobniz=newObniz("xxxx-xxxx");// Obniz_IDに自分のIDを入れますobniz.onconnect=asyncfunction(){// ディスプレイ処理obniz.display.clear();// 一旦クリアするobniz.display.print("umbrella check");// 超音波距離センサーを呼び出すvarhcsr04=obniz.wired("HC-SR04",{gnd:8,echo:9,trigger:10,vcc:11,});//スピーカーを呼び出すvarspeaker=obniz.wired("Speaker",{signal:0,gnd:1});// setIntervalでセンサーから拾う処理の間隔を作る。setInterval(asyncfunction(){//アラート音を流している間は距離情報を拾わないでいいのでフラグの値で分岐させるif(weahterFlag==="mess"){//距離情報を取得vardistance=awaithcsr04.measureWait();// 小数点以下が精密ですごいので整数に丸めるdistance=Math.floor(distance);console.log(distance);//取得した距離情報が50cm以内だったら人が通ったと判断してAPI取得するif(distance<500){callApi();//APIで取得した値が雨だったらアラート音を流すif(todayWeather==="Rain"){//音を流している間はフラグ情報を変更しておくweahterFlag="alert";//アラート音awaitspeaker.play(1046.502);// C6 ド 「お」awaitobniz.wait(300);awaitspeaker.stop();awaitobniz.wait(100);awaitspeaker.play(1318.51);// E6 ミ 「も」awaitobniz.wait(800);awaitspeaker.stop();awaitobniz.wait(100);awaitspeaker.play(1046.502);// C6 ド 「い」awaitobniz.wait(350);awaitspeaker.stop();awaitspeaker.play(880.0);// A5 ラ 「で」awaitobniz.wait(300);awaitspeaker.stop();awaitspeaker.play(783.991);// G5 ソ 「は」awaitobniz.wait(900);awaitspeaker.stop();awaitobniz.wait(100);awaitspeaker.play(659.255);// E5 ミ 「い」awaitobniz.wait(200);awaitspeaker.stop();awaitobniz.wait(100);awaitspeaker.play(698.456);// F5 ファ 「つ」awaitobniz.wait(200);awaitspeaker.stop();awaitobniz.wait(100);awaitspeaker.play(659.255);//  E5 ミ 「の」awaitobniz.wait(200);awaitspeaker.stop();awaitobniz.wait(100);awaitspeaker.play(698.456);// F5 ファ 「ひ」awaitobniz.wait(200);awaitspeaker.stop();awaitobniz.wait(100);awaitspeaker.play(1046.502);// C6 ド 「も」awaitobniz.wait(700);awaitspeaker.stop();awaitobniz.wait(300);awaitspeaker.play(1174.659);// D6 レ 「あ」awaitobniz.wait(180);awaitspeaker.stop();awaitobniz.wait(100);awaitspeaker.play(1046.502);// C6 ド 「め」awaitobniz.wait(1000);awaitspeaker.stop();//音を流しきったらフラグ情報を元に戻すweahterFlag="mess";}else{}}else{}}else{}},2000);// 2000ミリ秒 = 1秒};console.log("server litening...");

動かすことができました!
Qiitaでは動画を貼り付けられないため、twitterの動画投稿を引用します。

https://twitter.com/hiromae_studyng/status/1257114548810600448?s=20

※尚、この動画撮影時は天気が終日曇りだったため
 スピーカーを鳴らすための条件分岐を「Rain」ではなく「Clouds」にしていました

JavaScriptでは「Aが完了したらBの処理をする」という同期的処理を書くのが難しいと
懸念していましたが、「前の処理を待ってから実行させたい」関数には
とりあえず全部awaitをくっつけたらうまく動いてしまっており自分の理解度は不完全燃焼です。

「JS 同期処理」「JS async await」などでWebやYoutube検索していますが
未だに理解できる記事が見つからず・・・
「JSはシングルスレッドで非同期処理」ということは理解したのですがそこから同期的処理をPromiseやasync/awaitを使ってどうコードに落とし込むかとう解説に移るとどの記事も急に難易度が上がりついていけなくなる・・・

「サルでもわかるJS async await」を引き続き探します。


Viewing all articles
Browse latest Browse all 9059

Latest Images

Trending Articles