編集履歴一覧に戻る
shunnagのアイコン画像

shunnag が 2021年05月10日12時03分21秒 に編集

コメント無し

本文の変更

# はじめに  3Dプリンタを使う上で、フィラメントに含まれる湿度は印刷の精度や奇麗さ、成功率に大きく影響します。 また、自分の住む地域では冬はかなり冷え込み、あまりにもフィラメントが冷えていると、フィラメント切れや送り出しの不調が起きやすくなります。  このため、ヒーター/ファン付きのフィラメントドライヤとして、 eSUNのeBOXを使っています。稼働しているときはとても素晴らしいのですが、しばらく使わないで忘れておくと少しづつ湿度が上がります。 寒い朝の昇温含め、いざ印刷をする前にフィラメントの感想昇温待ちが面倒になります。  そこで、温度が低かったり湿度が高かったら自動で動作をさせるものを作りました。 # デモ動画 @[youtube](https://youtu.be/AqQ7EHAKGww) # 回路図 ![キャプションを入力できます](https://camo.elchika.com/afba4abab658849b39b715725c16553796fa40f9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39306237323036662d383734332d343439312d616235362d3763656164613763383035352f64326666363665302d623565362d346539312d393430302d313364646435626563326632/) | 0 | 1 | 2 | |:---:|:---|:---| | signal | vcc | gnd | # 使うもの - obnizBoard 1Y - Xiaomi [LYWSD03MMC(カスタムファームウェア導入済のもの) ](https://elchika.com/article/7693ec0a-180b-4409-b684-b45c6714bd27/ ) - マイクロサーボ SG90または同等品 - ボタンを押せる羽 - 両面テープ(プチルゴム系などの強くて厚めで柔軟性があるものを推奨) # 参考にさせていただいたサイト [1ft-seabass.jp.MEMO 「EnOcean STM 550B マルチセンサーモジュール(BLE) を obniz の BLE で取得するメモ」 seigo様](https://www.1ft-seabass.jp/memo/2020/08/11/obniz-connect-enocean-stm-550b-ble-firststep/)

-

[THUNDER BLOG 「obnizでサーボモータを動かそう!【obniz講座第8回】 サンダー様](https://thunderblog.org/2019/04/obniz_servo.html)

+

[THUNDER BLOG 「obnizでサーボモータを動かそう!【obniz講座第8回】 サンダー様](https://thunderblog.org/2019/04/obniz_servo.html)

# 準備 1. BLE温度湿度計をobnizから簡単に使えるようにする [事前に投稿済みのこちらの投稿 ](https://elchika.com/article/7693ec0a-180b-4409-b684-b45c6714bd27/ ) を元に、LYWSD03MMCにカスタムファームウェアの導入をしておいてください。 ==温度湿度計の名前 ATC_?????? を控えておいてください。== 2. 温度湿度計をフィラメントドライヤーの中に固定する  外から見やすい位置に両面テープで固定します。 3. サーボモーターを張り付ける場所を決める  eSUN eBOXは、電源がOn + 温度を設定済 + 画面がタイマー設定画面 の3つの条件がそろった場合、液晶右の上下ボタンを押すと、動作が制御できます。0まで下げた状態(またはタイマー終了)で停止、その状態から何かのボタンを1回押すとスリープから復帰、さらにもう1回↑ボタンを押すと、30分間動作します。今回はこれを使います。 ↑キーを押すのにちょうどいい場所にサーボモーターを仮着けし、羽を動かしながらちょうどいい角度を探ります。 いい感じの位置が決まったら、しっかり止めます。こちらは3Dプリンタで簡単な押さえを作りました。 4. obnizをいい感じの場所に置く。  こちらは、サーボの押さえにあわせて固定しました。 ![キャプションを入力できます](https://camo.elchika.com/8a570bb8547efb0c8d541cd8ff254a54599ba331/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39306237323036662d383734332d343439312d616235362d3763656164613763383035352f36353336396630302d383662342d343937392d623133392d343136313663383433653662/) # プログラミング 以下の内容のうち、サーボの角度、温度湿度計のデバイス名は環境に合わせて変更してください。 また、温度と湿度もお好みで設定してください。温度20度、湿度30%を境目にしてあります。 ```html:ソースコード <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <script src="https://code.jquery.com/jquery-3.3.1.js" integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="   crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz@3.14/obniz.js" crossorigin="anonymous" ></script> </head> <body> <div class="container"> <div><h2>温度が低かったり湿度が高かったりしたら<br>サーボでボタンを押してフィラメントドライヤを動かす</h2></div> <div> <h3>[raw advertise data]</h3> <div id="valueLYWSD03MMC">--</div> <h3>[raw advertise data 16進数]</h3> <div id="valueLYWSD03MMC2">--</div> <h3>[Temperature]</h3> <div id="temperature">--</div> <div id="temperature_message">--</div> <h3>[Humidity]</h3> <div id="humidity">--</div> <div id="humidity_message">--</div> <h3>[Battery]</h3> <div id="battery">--</div> <h3>[Push Button]</h3> <input type="button" id="push_button" name="push_button" value="ボタンを押す(+30分)" /> <div id="message">--</div> </div> </div> <script> let loopCount = 0; var pushTime = new Date(99, 1); //ボタン押した時間保存用 (最初は古い日付いれとく) var now = new Date(); const settings = { duration: null, }; //sleep function msleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); }; //ボタンを押す 1回目はスリープ解除、2回目で実際に+ async function push_btn(servoMotor) { servoMotor.angle(9); await msleep(250); servoMotor.angle(30); await msleep(250); servoMotor.angle(9); await msleep(250); servoMotor.angle(30); }; var obniz = new Obniz("OBNIZ_ID_HERE"); obniz.onconnect = async function () { obniz.display.print("obniz BLE"); obniz.display.print(" ↑ ↓"); obniz.display.print("LYWSD03MMC"); await obniz.ble.initWait(); //サーボの準備 https://thunderblog.org/2019/04/obniz_servo.html var servoMotor = obniz.wired("ServoMotor", { signal: 0, vcc: 1, gnd: 2 }); servoMotor.range = { min: 0.6, max: 2.3 }; var angle = $("#angle").val(); servoMotor.angle(30); // 離した場所 //テストボタン $("#push_button").on("click", function () { push_btn(servoMotor); }); var target = { localName: "ATC_??????", //ここにLYWSD03MMC(カスタム)のデバイス名を入れる }; var setting = { duration: 60, // 60 sec duplicate: true, // allow duplicate }; obniz.ble.scan.onfind = async function (peripheral) { console.log("LYWSD03MMC connect!" + new Date().getTime()); // 通常のアドバタイズデータ const adv_data = peripheral.adv_data; // 読解用。アドバタイズデータを16進法で表記することで Manufacturer ID の 0x03DA といった値が分かりやすくなります。 const adv_data16 = adv_data.map(function (value) { return value.toString(16); }); $("#valueLYWSD03MMC").text(adv_data.toString()); $("#valueLYWSD03MMC2").text(adv_data16.toString()); // 温度センサー const temperature = Math.round(adv_data[10] * 256 + adv_data[11]) / 10; $("#temperature").text(temperature); // 湿度センサー const humidity = adv_data[12]; $("#humidity").text(humidity); // バッテリー(パーセント) const battery = adv_data[13]; $("#battery").text(battery); //ボタンを押すかどうかの判定 now = new Date(); //現在時刻取得 //湿度 if (humidity > 30) { if (now.getTime() - pushTime.getTime() > 30 * 60 * 1000) { //30分以上経っていたら $("#humidity_message").text("湿度が高いのでボタンを押します(+30分)"); pushTime = new Date(); push_btn(servoMotor); } else { $("#humidity_message").text("湿度が高いですがボタンを押しません(経過30分未満)"); } } else { $("#humidity_message").text("湿度は正常範囲内です。"); } //温度 if (temperature < 20) { if (now.getTime() - pushTime.getTime() > 30 * 60 * 1000) { //30分以上経っていたら $("#temperature_message").text("温度が低いのでボタンを押します(+30分)"); pushTime = new Date(); push_btn(servoMotor); } else { $("#temperature_message").text("温度が低いですがボタンを押しません(経過30分未満)"); } } else { $("#temperature_message").text("温度は正常範囲内です。"); } // データを受信するたびに再スキャン // 再スキャンは endWait を走らせると onfinish が発動するのでそこで再開させる await obniz.ble.scan.clearAdvertisementFilter(); await obniz.ble.scan.endWait(); }; obniz.ble.scan.onfinish = async function (peripherals, error) { loopCount++; console.log("scan timeout! [" + loopCount + "]"); // 再スキャンは endWait を走らせると onfinish が発動するのでそこで再開させる await obniz.ble.scan.startWait(target, setting); }; // 初回スタート await obniz.ble.scan.startWait(target, setting); }; </script> </body> </html> ``` # 確認 ![キャプションを入力できます](https://camo.elchika.com/7ae91dd20357238c4568570833f081d884ce4876/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39306237323036662d383734332d343439312d616235362d3763656164613763383035352f35653235353739302d663030372d346438332d623439352d323631313031373630313638/) 無事に、湿度が高い時、温度が低い時にボタンを押してくれるようになりました。