先日作った「はかり」を、数日間屋外に放置して、測定値の変動を調べたいと思います。そのために、測定データを1分に1回Ambientに送信するようにし、さらにバッテリーで動作するように改良しました。
前回の記事はこちらです。
Ambient
測定結果をアップロードし続けることで、それらのデータを可視化して表示してくれる、無料のクラウドサービスです。
過去にベッドセンサに使ったことがあり、使い方がとっても簡単だったので、今回もこのサービスを利用したいと思います。Ambientの使い方について、詳しくはこちらをご覧ください。
プログラム
重さを測定してAmbientに送信し、1分間DeepSleepするという流れにプログラムを改良します。今回はバッテリーで動作するので、バッテリーの電圧も測り、重さと一緒にAmbientに送信することにしました。
プログラムの一部です。
//Scale #include "HX711.h" HX711 scale; const int DT_PIN = 32; const int SCK_PIN = 33; const int SW_PIN = 0; const int LED_PIN = 23; long offset = 417190; long scaleFactor = 321; double baseWeight = 200.0; #include <Preferences.h>Preferences ScaleParam; //DeepSleep #include <rom/rtc.h> #include "esp_deep_sleep.h" #include "soc/rtc_cntl_reg.h" //WiFi #include <WiFi.h> const char* WifiSSID = "SSID"; const char* WifiPassword = "PASSWORD"; //Ambient #include "Ambient.h" const unsigned int WriteChannelId = WRITE_CHANNEL_ID; const char* writeKey = "WRITE_KEY"; WiFiClient wifiClient; Ambient ambient; //AD const int BATT_AD_PIN = 36; const double aDVoltageGain = 0.00079365 * 2.0; const double aDVoltageOffset = 0.13; void setup() { Serial.begin(115200); Serial.println("start"); scale.begin(DT_PIN, SCK_PIN); pinMode(SW_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); //Show Reset Reason Serial.print("CPU0 reset reason:"); verbose_print_reset_reason(rtc_get_reset_reason(0)); //read scale parameter for from preferences readScaleParameter(); //Enable scaleSetup except for Wakeup if ( rtc_get_reset_reason(0) != 5 ) scaleSetup(); //Measurment Weight long value = scale.get_units(5); double weight = (double)(value) * 0.1; Serial.printf("%.1f[g] ", weight ); //Measurment Batt Voltage int battAD = analogRead(BATT_AD_PIN); double battVoltage = battAD * aDVoltageGain + aDVoltageOffset; Serial.printf("%.2f[V]\n", battVoltage ); //Connect WiFI if ( connectWiFi() == true ) { //Initialize Ambient ambient.begin(WriteChannelId, writeKey, &wifiClient); //Write to Ambient writeToAmbient( weight , battVoltage); } //Prepare to sleep scale.power_down(); WiFi.disconnect(); WiFi.mode(WIFI_OFF); Serial.printf("zzz...\n"); deepSleep(60); }
プログラム全体はこちらからダウンロードできます。
20,21行目をご自宅の無線LANのSSIDとパスワードに変更し、26,27行目をご自身で取得したAmbientのライトチャンネルIDとライトキーに変更してください。
プログラムの流れを簡単に説明すると、
- 歪みゲージのパラメータ(オフセットと重さへの変換係数)をプリファレンス(Non-volatile storage)から読み取り、はかりの初期設定をします。
- DeepSleepからの復帰の場合は、歪みゲージのパラメータを測定するモードをパスします
- 重さとバッテリー電圧を測定します
- WiFiに接続を試み、WiFiに接続できたらAmbientに測定結果を送信します
- HX711をスリープモードにして、1分間のDeepSleepに入ります
となっています。
リセットボタンを押してすぐにBootボタンを押すと、歪みゲージのパラメータを測定するモードになります。Bootボタンを2秒くらいで離すとオフセット測定モードに、6秒以上長押しして離すと重さへの換算係数を測定するモードになります。測定結果はプロファレンスに記録されるので、リセットしても消えません。オフセット測定時には、はかりに何も置かないでください。重さへの換算係数を測定するモードの時には、200gの物を予めはかりに置いておきます。
回路の変更
機能の追加
回路を上記のように機能を追加します。
- 単三充電電池(eneloop)4本を、5VとGNDに接続します
- 5VとGNDを1MΩの抵抗で分圧し、バッテリー電圧の半分の電圧をAD0(IO36)に接続します
- 歪みゲージのパラメータを測定するモードのインジケータとして、IO23にLEDを接続します
普通の配線や電池ボックスの線を、ブレッドボードに刺さるピンにするために、デュポンコネクタのピンとハウジングを使いました。
これを、圧着工具を使って配線に圧着します。
これらの部品と工具があれば、いくらでもブレッドボードに刺さるピンを作ることができるので、とても重宝しています。
はかりの改良
ノイズが入りにくいように、歪みゲージからHX711までの配線を短くし、ESP32へのデジタル信号の配線を長くしました。デジタル信号の配線は4本なので、同じく線が4本入っているUSBケーブルをカットして利用しました。
回路の改良はこれで完了です。
ケースに入れる
防水のためにケースに入れいます。ダイソーのこのタッパーがサイズ的にちょうど良かったです。
ブレッドボードと電池ボックスを入れて、
蓋をすれば、完成です。
はかりの実験装置が完成しました。
屋外に設置
とりあえず、雨よけのある軒下に設置してみました。
2時間ほど放置した結果がこちらです。青い線が重さを表していて、赤がバッテリー電圧です。はかりには何も載せていないので、青い線は0gになるのが正しいのですが、重さがどんどんマイナスになっています。太陽が当たる環境に置いたので、温度が上がって歪みゲージが変形しているのかもしれません。
数日放置して、重さの変化を記録してみたいと思います。
2021.3.31追加 つづきはこちら
追加終わり
コメント