家の加湿器の水の残量が分かりづらい
家の加湿器は水の残量をタンクの横からみて実際の水の量を見るしかない。。。
水切れにいたってはちっちゃい赤いLEDがつくだけ!
一応音なるけどそれ聞き逃したらわからん!
なので、水の量をもうちょっと可視化できるようにしようと思う。
ついでにAmbientにもデータを送信
##材料
1.M5 ATOM 重さを測ってambientに重量を送信、ついでにLEDで残量も表示
2.ロードセル 重さを図るセンサー、今回はハーフブリッジのやつ
3.HX711 ロードセルから値を取得するために必要なアンプ的なもの?
4.その他もろもろ
なんか無駄に高いの買っちゃった気がするけども。。。
参考にさせていただいた、というかやってることはほぼこちらのページ
##まずはロードセルを乗せる台を作成
ロードセルは金属が歪むことで重さを測るわけだけども
今回買ったロードセルは床に直に置かず、歪む部分を中に浮かさないいけないので
まずはロードセルを乗せる台を作成。
これに乗せると
こうなる
加湿器の足にはまるように上にも追加
#ソース
HX711 のライブラリはこちらを使用
ライブラリ内のサンプルソースを元に改良
#include "M5Atom.h"
#include <WiFi.h>
#include "Ambient.h"
#include "HX711.h"
#define ssid xxxx
#define password xxxx
// Ambient関係
unsigned int channelId = xxxx; // AmbientのチャネルID
const char* writeKey = xxxx // ライトキー
WiFiClient client; // ambient送信用
Ambient ambient;
// ロードセル関係
HX711 scale;
float k = -25.0;
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 21;
const int LOADCELL_SCK_PIN = 25;
void setup() {
M5.begin(true, false, true);
Serial.println("HX711");
M5.dis.drawpix(0, 0xffffff); // W点灯
delay(1000);
M5.dis.drawpix(0, 0x000000); // 消灯
M5.dis.drawpix(0, 0x0000FF); // Blue
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
for (int i = 0; WiFi.status() != WL_CONNECTED; i++) { // 接続できるまで
if (i >= 60) esp_restart(); // 60秒つながらない場合はリブート
delay(1000);
Serial.print(".");
}
M5.dis.drawpix(0, 0xFF0000); // Green
delay(1000);
M5.dis.drawpix(0, 0x000000); // 消灯
// 自分のIPアドレスを表示
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address = ");
Serial.println(WiFi.localIP());
// チャネルIDとライトキーを指定してAmbientの初期化
Serial.println("ambient setup");
ambient.begin(channelId, writeKey, &client);
// HX711の初期化
Serial.println("scale setup");
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(k);
scale.tare(); // reset the scale to 0
}
float maxWeight = 100000;
void loop(void) {
Serial.println("loop");
// 重量を取得
float weight = scale.get_units(10);
scale.power_down();// put the ADC in sleep mode
Serial.println(weight, 1);
// LEDを消灯
for (int i = 0; i < 25; i++)
M5.dis.drawpix(i, 0x000000);
int ledCnt = int((weight / maxWeight) * 25);
for (int i = 0; i < ledCnt; i++)
{
if (i < 10)
M5.dis.drawpix(i, 0x00ff00); //red
else if ( 10 <= i && i < 15)
M5.dis.drawpix(i, 0xffff00); // yellow
else
M5.dis.drawpix(i, 0xff0000); // green
}
// ambientに送信
ambient.set(1, String(weight/1000).c_str());
ambient.send();
Serial.println("Ambient Send");
delay(1000 * 60 * 5); // 5分おきに計測&データ送信
//delay(10000); // 10Sおきにに計測&データ送信
scale.power_up();
}
scale.set_scale(k);
は、購入したロードセルによって値が変わるので
重さがわかっているものを置いてその値になるように値を調整
##完成!