irohaのアイコン画像

格安加湿器を自動湿度調節機能をつけ高性能化する

iroha 2021年05月14日に作成  (2021年05月16日に更新)

デモ動画

ここに動画が表示されます

動画7秒あたりで加湿器が止まってるの分かるかな……分かって欲しいな

部品

正直300円の格安加湿器の高性能化のために1000円の湿度センサーを使うの本末転倒な気がしなくもない

設計図

設計図

ソースコード

サンプルの温度定期測定プログラムを基盤に今回のプログラムを組みました。

湿度の取得について、一度目は高確率で失敗するのでtry…catchを使って失敗したらもう一度湿度を取得するようにしています。
時々湿度100%みたいな結果になるので100%になった時も再測定にしました。

格安加湿器については300円だしUSBの5Vを超音波振動子につなげてるだけだろうと予想して湿度に応じてUSBの5Vを5Vにしたり0Vにしたりすることで制御する。(こういう時、安物って作りが単純でいいよね)

コードはこちら

加湿器制御

<html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" /> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="https://unpkg.com/obniz@3.x/obniz.js" crossorigin="anonymous" ></script> </head> <body> <script> // OBNIZ_ID_HERE will be replaced at run. // インストールされたデバイス情報に書き換わる var obniz = new Obniz("OBNIZ_ID_HERE"); var sensor; obniz.onconnect = async function() { sensor = obniz.wired("SHT31", {vcc:3, sda:0, scl:1, adr:4, gnd:2, address:0x44}); // Read Value. 湿度を取得&表示 try { var humid = await readHumid(); } catch(e) { var humid = await readHumid(); } if (humid.toFixed(1)==100.0){ humid = await readHumid(); } //湿度が45%未満の時加湿器をON if(humid.toFixed(1)<45){ obniz.getIO(5).pull("5v"); obniz.getIO(5).output(true); obniz.getIO(6).output(false); obniz.resetOnDisconnect(false); } //湿度が55%より大きいとき加湿器をOFF if(humid.toFixed(1)>55){ obniz.getIO(5).output(false); obniz.getIO(6).output(false); obniz.resetOnDisconnect(false); } // When Cloud Execusion. クラウド実行の時 if (Obniz.App.isCloudRunning()) { Obniz.App.done({ status: 'success', text: `${new Date().toLocaleString('ja-JP')}: ${humid.toFixed(1)}℃` }); } }; obniz.onclose = async function() { }; window.onload = async function(){ await readHemp(); } // Read Humid. 湿度を取得&表示 async function readHumid() { // Read Temp. 温度を取得 var humid = await sensor.getHumidWait();; // Load current time. 現在日時を取得して、スペース区切りで配列に var datetime = new Date().toLocaleString('ja-JP').split(' '); // Stop drawing for performance. 描画をいったん止める obniz.display.drawing(false); // Clear. ディスプレイを全部消す obniz.display.clear(); // Change font size. フォントサイズを20pxに obniz.display.font(null, 20); // Draw date. 日付を表示 obniz.display.print(datetime[0]); // Draw time. 時刻を表示 obniz.display.print(datetime[1]); // 小数点1桁まで温度を表示 obniz.display.print(`${humid.toFixed(1)}%`); // Transfer all to device. 全て描画させる obniz.display.drawing(true); // If on user's browser. 手動で実行させているとき if (!Obniz.App.isCloudRunning()) // Draw it on HTML. 日時と温度をページに追記 $('#obniz-debug').append(`<p>${new Date().toLocaleString('ja-JP')}: ${humid.toFixed(1)}%</p>`); return humid; } </script> </body> </html>

説明

制御


いわゆるフィードバック制御ですね。湿度を調整します。

コードの部分でも言いましたが加湿器のON, OFF切り替えはUSBへの給電のON, OFFで制御しています。
https://upload.wikimedia.org/wikipedia/commons/6/67/USB.svg
この画像にある通りUSB Aでは内部の端子のうち両端の端子が電源供給用の端子であるため、ここの電圧を5V, 0Vと切り替えて制御しました。

ioの状態の維持

定期実行のためwebhookで実行しますが一度加湿器をONにしたとき次に加湿器をOFFにするまで加湿器はONの状態を維持していてほしいです。
言い換えると、今回の作品ではioの「5番を5V、6番をGND」または「5番をGND、6番をGND」の状態をwebhookの通信終了後も維持してほしいわけです。
obniz.resetOnDisconnect(false);
とするとwebhookの通信終了後もobnizの状態を維持してくれます。

おわりに

もともと湿度センサーを使って加湿器を制御するのは去年の冬に考えてはいたんですがなかなか作業を始めるきっかけが無かったので今回のobnizコンテストをきっかけにやってみようと思いました。

ただ……

始める時期が遅かった……乾燥との戦いの季節は終わってむしろ梅雨が近づく季節、今回作った湿度調整機能付き加湿器も今の季節では必要ないです。今年の冬にはまた活躍してもらいましょう。

今回は300円の加湿器と1000円の湿度センサーを使いましたがAmazonを見てみると1000円でおしゃれな見た目のデジタル温湿度計が売ってたりします。300円でペットボトルに装着できる加湿器が作れたり1000円でおしゃれなデジタル温湿度計が作れたり、大量生産ってすごいなって感心しました。

1
ログインしてコメントを投稿する