スポンサーリンク

歪みゲージ「はかり」の安定性を調べるためにAmbientに測定データを送信するようにしました

スポンサーリンク

先日作った「はかり」を、数日間屋外に放置して、測定値の変動を調べたいと思います。そのために、測定データを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の物を予めはかりに置いておきます。

スポンサーリンク

回路の変更

機能の追加

ESP32はかりのブロック図

回路を上記のように機能を追加します。

  • 単三充電電池(eneloop)4本を、5VとGNDに接続します
  • 5VとGNDを1MΩの抵抗で分圧し、バッテリー電圧の半分の電圧をAD0(IO36)に接続します
  • 歪みゲージのパラメータを測定するモードのインジケータとして、IO23にLEDを接続します

普通の配線や電池ボックスの線を、ブレッドボードに刺さるピンにするために、デュポンコネクタのピンとハウジングを使いました。

これを、圧着工具を使って配線に圧着します。

これらの部品と工具があれば、いくらでもブレッドボードに刺さるピンを作ることができるので、とても重宝しています。

はかりの改良

ノイズが入りにくいように、歪みゲージからHX711までの配線を短くし、ESP32へのデジタル信号の配線を長くしました。デジタル信号の配線は4本なので、同じく線が4本入っているUSBケーブルをカットして利用しました。

回路の改良はこれで完了です。

ケースに入れる

防水のためにケースに入れいます。ダイソーのこのタッパーがサイズ的にちょうど良かったです。

ブレッドボードと電池ボックスを入れて、

蓋をすれば、完成です。

はかりの実験装置が完成しました。

スポンサーリンク

屋外に設置

とりあえず、雨よけのある軒下に設置してみました。

2時間ほど放置した結果がこちらです。青い線が重さを表していて、赤がバッテリー電圧です。はかりには何も載せていないので、青い線は0gになるのが正しいのですが、重さがどんどんマイナスになっています。太陽が当たる環境に置いたので、温度が上がって歪みゲージが変形しているのかもしれません。

数日放置して、重さの変化を記録してみたいと思います。

2021.3.31追加 つづきはこちら

追加終わり

kohapepeをフォローする
電子工作
スポンサーリンク
スポンサーリンク

関連記事

kohacraftのblog

コメント