よろしくお願いいたします。
M5stackを用いて自動車のバッテリー電圧を計測するコードを書いていますが、思ったように動作してくれなくて困っています。
回路は分圧回路を構成しており、ハードウェアに問題はなさそうです。
分圧回路の構成は
Vcc(12v~16v)→ 1k2Ω → Vout → 300Ω → GND
です。
ソフトウェアはいくつかのパターンのコードを試してみましたので下記に記します。
C言語
#include <M5Stack.h> #include <M5StackUpdater.h> #include "BluetoothSerial.h" BluetoothSerial SerialBT; const int ADCPin = 36; const float VCC = 3.3; const int ADC = 4096; const int R1 = 1200; const int R2 = 300; float ADCVolF = 0; float ADCRaw = 0; void setup() { // put your setup code here, to run once: M5.begin(); M5.Power.begin(); Wire.begin(); Serial.begin(9600); SerialBT.begin("M5Stack"); pinMode(ADCPin, INPUT); M5.Lcd.setTextColor(BLACK); M5.Lcd.setTextSize(3); } void loop() { M5.Lcd.fillScreen(WHITE); M5.Lcd.setCursor(0,0); ///////ADC入力値を補正/////// ADCRaw = analogRead(ADCPin); ADCVolF = ADCRaw * (VCC/ADC)/(R2*(R2+R1)); M5.Lcd.printf("%2.2f", ADCVolF); M5.Lcd.println("mV"); M5.Lcd.println(ADCRaw); delay(2500); // put your main code here, to run repeatedly: }
以上のコードを実行すると、LCD画面には
0.00mv(固定。一切変動なし)
3200(おおよそ3000~3300の間で変動が見られます)
と、表示されます。
実現したいこととしては、Lcd画面とシリアル通信先のロガー(teratarmなど。使い方については大体理解しています)に現在の電圧をVで上位2桁、小数点3桁で表示したいです。
ほかにもコードを変更してトライ&エラーしたところ、以下のような結果になりました。
■変更行
以下のコードを二段目の数値に置き換え
C言語
ADCVolF = ADCRaw * (VCC/ADC)/(R2*(R2+R1));
置き換え後
C言語
ADCVolF = ADCRaw * 2.23609
これは上段の置き換え前のコードで分圧回路の電圧を復号している計算式を手計算して代入しています。
この結果、LCDの電圧値の値が
781400.0123mV(観測写真を撮り損ねましたが、こんな不明な桁数で表示されました)
というようになりました。
久々のコーディングで四苦八苦といったところです。
長々と書いてしまい申し訳ありません。
ご回答御指南よろしくお願いいたします。
まだ回答がついていません
会員登録して回答してみよう