MOZI が 2021年05月13日17時36分49秒 に編集
初版
タイトルの変更
お風呂センサーを作る
タグの変更
Arduino
Arduino_Nano
obniz
obnizBoard1Y
obnizIoTコンテスト
メイン画像の変更
記事種類の変更
製作品
本文の変更
# 初めに 皆さんこんにちはMOZI電子工作です。 お風呂センサを作っていきたいと思います。 具体的にはお風呂の栓が閉まっているのかを検知するものをObniz 1Yを使って作りたいと思います。 お風呂の栓をいちいち確認するのが億劫だったのでスマホから簡単に確認できるようにしようと思い作りました。 # 使ったもの 今回使ったものはこんな感じです。 | 名前 | URL | |:---:|:---| | VL53L0X使用 レーザー測距センサモジュール(ToF) |https://akizukidenshi.com/catalog/g/gM-12590/| | BME680使用 温湿度・気圧・ガスセンサモジュールキット | https://akizukidenshi.com/catalog/g/gK-14469/ | | 低損失レギュレータ5V1.5A NJM2396F05 | https://akizukidenshi.com/catalog/g/gI-09262/ | | 片面ガラスコンポジット・ユニバーサル基板 Cタイプ めっき仕上げ (72×47mm) 日本製 | https://akizukidenshi.com/catalog/g/gP-03229/ | | Arduino NANO | | | obniz Board 1Y | | これらを使って作っていきます。 obniz Board 1Yはelchikaさんに提供していただきました。ありがとうございます! 温度湿度センサーは一応、浴室内の温湿度を測定するためにおまけとして付けています。 距離センサーと温湿度センサーはelchikaのハードウェア投稿キャンペーンの際にもらったものを使用させていただきます。 # 回路 回路は以下のような感じにしました。 Obnizで直接センサーを制御できれば良かったのですが、温度センサ、距離センサともにobniz用のライブラリなどはないらしくプログラムが大変そうだったのでArduinoNANOで読み取り、UARTでobnizと通信する形にしています。 電源は風呂の中ということもありコンセントからの給電は難しいので電池で給電しています。設計的にすぐになくなってしまうと思うので次回への課題です。   片面ユニバーサル基板を使って作ったのですが、一つもランドはがしをせずきれいに実装できました!   # プログラム Arduino ```arduino:bath_sensor.ino #include <Wire.h> #include <VL53L1X.h> #include <SPI.h> #include <Adafruit_Sensor.h> #include "Adafruit_BME680.h" VL53L1X sensor; #define BME_SCK 13 #define BME_MISO 12 #define BME_MOSI 11 #define BME_CS 10 #define SEALEVELPRESSURE_HPA (1010.5) Adafruit_BME680 bme; // I2C //Adafruit_BME680 bme(BME_CS); // hardware SPI //Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); int distance; //栓を距離センサで検知するための変数 void setup() { Serial.begin(9600); while (!Serial); // Set up oversampling and filter initialization bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320*C for 150 ms } void loop() { if (!bme.begin()) { Serial.println("e,"); //温度湿度センサーエラー } if (! bme.performReading()) { Serial.println("e,"); //温度湿度センサーエラー return; } double temp = bme.temperature - 6; //気温 double atm = bme.pressure / 100.0; //気圧 double hum = bme.humidity; //湿度 sensor.setTimeout(500); if (!sensor.init()) { Serial.print("E,"); //距離センサーエラー delay(1); return; } else { sensor.setDistanceMode(VL53L1X::Long); sensor.setMeasurementTimingBudget(50000); sensor.startContinuous(50); for(int i=1;i<3;i++){ distance += sensor.read(); } distance /= 3; Serial.print(temp); Serial.print(","); Serial.print(hum); Serial.print(","); Serial.print(atm); Serial.print(","); Serial.print(distance); Serial.print(","); } } ``` Obniz ```obniz:bath_sensor <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.14.0/obniz.js" crossorigin="anonymous" ></script> </head> <body> <H1>現在</H1> <p>気温<div id="temp">error</div>℃</p> <p>湿度<div id="hum">error</div>%</p> <p>気圧<div id="atm">error</div>hPa</p> <p>栓<div id="senn">error<div></p> <script> var obniz = new Obniz("0745-4337"); obniz.onconnect = async function() { await obniz.wait(10); var uart = obniz.getFreeUart(); uart.start({tx: 0, rx: 1, gnd:11, baud:9600 }); uart.onreceive = function(data, text) { let datas = text.split(","); if(datas[0] == 'e'){ document.getElementById('senn').innerHTML = "距離センサーエラー"; }else if(datas[0] == "E"){ document.getElementById('temp').innerHTML = "温度センサーエラー" }else{ document.getElementById('temp').innerHTML = datas[0]; document.getElementById('hum').innerHTML = datas[1]; document.getElementById('atm').innerHTML = datas[2]; if(datas[3]<1660){ document.getElementById('senn').innerHTML = "開いています"; }else{ document.getElementById('senn').innerHTML = "閉じています"; } } } } </script> </body> </html> ``` ObnizのJavaScriptは最初慣れず、難しかったですが、なんとかできました。 # ケースづくり ケースは3Dプリンターで作成しました。  こんな感じに  中身  # 動かしてみる 設置したところ  スマホから確認ができます。obnizでページを開くと、確認することができます。 動作させてみるとこんな感じ。 栓の開いているかどうかは距離センサを使って作ったので精度が少し足りていないのか、安定していない時もあるので改善点ではあります。 温度、湿度、気圧は問題なく安定して読み取れているようです。 obnizを使っているので外出先など、家のWi-Fiに接続できない時でも確認することができます!ゆくゆくは風呂を自動で湯はりする装置も作ってみたいです。 ↓動作動画 @[youtube](https://youtu.be/RGaa0Dj1YnI) # 最後に Obnizは全てクラウドで制御できる点など、かなりインターネットに関する泥臭いことをすることなく、簡単に作ることができました。今後もobnizを使って色々使っていきたいと思います。 最後まで読んでいただきありごとうございました! (選ばれるといいなーー)