工場改善 IoT Arduino開発

現場の悩みに解決手段を

【ESP32】体重計を改造して重量データをBluetooth SPPでPCに送ってみる。

副資材の在庫管理2の記事で作ったものです。
Bluetooth仕様の体重計が売ってあったんですが、スマホアプリと連携が必要でそんな機能要らなかったので改造して好きなようにデータを送信できるようにしました。

一定時間ごとにBluetoothのSPP通信で体重計の重量データをPCに送るっていうだけです。
中国製の安い体重計を買ってそれについていたマイコンと表示器と電池は取っ払って、天板、カバーとロードセルだけを利用しています。
HX711のロードセルアンプモジュールとESP32を中に入れてはい完成です。
重量誤差も±3gくらいだったんですがまぁそんなに精度要らないから今回は問題無しです。
ノイズもそんなになさそうでいい感じですね。


体重計初めて分解したんですが、中ってスカスカなんですね。
ロードセル4個のブリッジ回路に、基板上にBluetoothが搭載したマイコンそして表示機。
そういえば分解したときに両面テープで天板が貼られていたのですが組み立て時に面倒だったのか何枚か剥離紙剥がしてないんですよね~
(いやきっと高さを合わせるためってことで理解しました。うん)



ネットで探してみたんですがsparkfunさんサイトがわかりやすかったので参考にして作ってみました。
learn.sparkfun.com


【機器仕様】
・電源入力時に重量のゼロ合わせする。(トレーとか置くので)
・一定時間ごとにBluetoothのSPP通信で重量データをPCに送る。

【材料】5,000円くらい
・デジタル体重計(今回は最大160kgまで測定できるやつ)
・HX711モジュール
・ESP32
・ユニバーサル基板
・USBケーブル(タイプA to microB)※給電用


【準備】
ライブラリをインストールする。
github.com

ライブラリ内の
「SparkFun_HX 711_Calibration」スケッチを使用して取得する。単位は"kg"で出力するようにするためにzero_factorの値を取得する。
 スケッチでは単位がポンドになるように設定されていたのでkgになるように設定しました。(1gなら0.001の値が出ます)
手持ちの200gの重りを乗せて合うようにしてみました。

配線図
f:id:kesokonpatata:20210129031313p:plain

回路図
f:id:kesokonpatata:20210129031437p:plain



【接続】
HX 711 → ESP32ピン32
CLK → 21
DOUT → 22
VCC → 3.3V HX711ボードは2.7Vから5Vまで電源供給可能
GND → GND

【スケッチ】

#include "BluetoothSerial.h"
BluetoothSerial SerialBT;

#include "HX711.h"

#define calibration_factor -15000 // この値はSparkFun_HX 711_Calibrationスケッチを使用して取得する。
#define zero_factor 8421804       // この値は、SparkFun_HX 711_Calibrationスケッチを使用して取得する。単位は"g"で出力

//HX711接続ピンの設定
#define LOADCELL_DOUT_PIN  22
#define LOADCELL_SCK_PIN  21
HX711 scale;

//センサのノイズ除去(ローパスフィルタ)
volatile float LoadCellVal, LoadCellVal_RC;  // ロードセルの値、フィルタ後の値
#define n 5                                  // サンプリング回数 整数を入力
#define a 0.8                                // 0<a<1の範囲 大きいほどローパスフィルタの効果大だが反応が鈍くなる
int i;
String strDATA = "LoadCellValue";            // 送信用データ(strDATA,ロードセルの値Kg)

#define bps0 115200                          // シリアル通信UART0への転送速度:単位はbps(送信先(PC)に合わせる)

/***********************************************************************
   初期化
 **********************************************************************/
void setup() {
  SerialBT.begin("ESP32_SPP_HX711_LordCell");      // Bluetoothデバイス名
//  Serial.begin(bps0);                              // 通信速度bps、USBのシリアルモニタから確認用(実装時はOFF)
  delay(500);

  //ロードセルHX711の設定
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);// ロードセルのピンの設定
  scale.set_scale(calibration_factor);             // この値はSparkFun_HX 711_Calibrationスケッチを使用して取得されます
  scale.set_offset(zero_factor);                   // 以前の既知の0_factorを使用してスケールを0アウトします

//  Serial.println(F("BLE_SPP start"));
}

/***********************************************************************
  Loop処理
  n回分のロードセルの重量データをローパスフィルタを通してペアリングされた機器にSPP通信で送信する。
   **********************************************************************/
void loop() {
  LoadCellVal_RC = scale.get_units();
  for (i = 1; i < n; i++) {                                        // n回分繰り返し
    LoadCellVal = scale.get_units();                               // ロードセルの値をHX711から取得
    // Serial.print(LoadCellVal);
    LoadCellVal_RC = a * LoadCellVal_RC + (float)LoadCellVal * (1 - a);//フィルタ(n回分を差分方程式でノイズを除去する)
  }

  String str = strDATA + "," + String((float)LoadCellVal_RC, 3);   // 文字列結合荷重は1g以下切り捨て
  SerialBT.print(str);                                             // 文字列をBluetoothで送信
  // Serial.print(str);
  delay(700);
}