はじめに
3Dプリンタを使う上で、フィラメントに含まれる湿度は印刷の精度や奇麗さ、成功率に大きく影響します。
また、自分の住む地域では冬はかなり冷え込み、あまりにもフィラメントが冷えていると、フィラメント切れや送り出しの不調が起きやすくなります。
このため、ヒーター/ファン付きのフィラメントドライヤとして、 eSUNのeBOXを使っています。稼働しているときはとても素晴らしいのですが、しばらく使わないで忘れておくと少しづつ湿度が上がります。
寒い朝の昇温含め、いざ印刷をする前にフィラメントの感想昇温待ちが面倒になります。
そこで、温度が低かったり湿度が高かったら自動で動作をさせるものを作りました。
デモ動画
回路図
0 | 1 | 2 |
---|---|---|
signal | vcc | gnd |
使うもの
- obnizBoard 1Y
- Xiaomi LYWSD03MMC(カスタムファームウェア導入済のもの)
- マイクロサーボ SG90または同等品
- ボタンを押せる羽
- 両面テープ(プチルゴム系などの強くて厚めで柔軟性があるものを推奨)
参考にさせていただいたサイト
1ft-seabass.jp.MEMO 「EnOcean STM 550B マルチセンサーモジュール(BLE) を obniz の BLE で取得するメモ」 seigo様
THUNDER BLOG 「obnizでサーボモータを動かそう!【obniz講座第8回】」 サンダー様
準備
-
BLE温度湿度計をobnizから簡単に使えるようにする
事前に投稿済みのこちらの投稿 を元に、LYWSD03MMCにカスタムファームウェアの導入をしておいてください。
温度湿度計の名前 ATC_?????? を控えておいてください。 -
サーボモーターを張り付ける場所を決める
eSUN eBOXは、電源がOn + 温度を設定済 + 画面がタイマー設定画面 の3つの条件がそろった場合、液晶右の上下ボタンを押すと、動作が制御できます。0まで下げた状態(またはタイマー終了)で停止、その状態から何かのボタンを1回押すとスリープから復帰、さらにもう1回↑ボタンを押すと、30分間動作します。今回はこれを使います。
↑キーを押すのにちょうどいい場所にサーボモーターを仮着けし、羽を動かしながらちょうどいい角度を探ります。
いい感じの位置が決まったら、しっかり止めます。こちらは3Dプリンタで簡単な押さえを作りました。
プログラミング
以下の内容のうち、サーボの角度、温度湿度計のデバイス名は環境に合わせて変更してください。
また、温度と湿度もお好みで設定してください。温度20度、湿度30%を境目にしてあります。
ソースコード
<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>
確認
無事に、湿度が高い時、温度が低い時にボタンを押してくれるようになりました。
投稿者の人気記事
-
shunnag
さんが
2021/05/10
に
編集
をしました。
(メッセージ: 初版)
-
shunnag
さんが
2021/05/10
に
編集
をしました。
-
shunnag
さんが
2021/05/10
に
編集
をしました。
(メッセージ: 画像追加)
-
shunnag
さんが
2021/05/10
に
編集
をしました。
(メッセージ: コンテストタグ追加)
-
shunnag
さんが
2022/01/18
に
編集
をしました。
ログインしてコメントを投稿する