電池の容量測定_INA219
エネループとか、他のメーカーでもニッケル水素電池系の
乾電池式の充電電池なんですが、
時々、充電失敗すること無いですか?
なんか、充電開始してすぐに点滅で何か異常を示していたりとか?
うちのPanasonicのだと、BQ-CC25っていう機種ですが、
充電開始すぐに点滅する場合は
・間違って普通の乾電池をセットしている
・充電式電池だが劣化している
のどちらからしい。
by https://www.marutsu.co.jp/contents/shop/marutsu/datasheet/panasonic_BQ-CC25.pdf
13ページ
しかーし、同じ電池で適切に放電した後にもう一度充電器にセットすると
なにげに普通に充電できてしまって使えたりするのであります。
謎どぇすね。
自分の場合、電池が劣化しているとは思いたくないので
適当に電球をくっつけて、数時間点灯させて、
光が切れたり、
光が弱くなってから外して再度普通に充電していたりしてましたが、
なんとなく納得いかない。
なので、アナログの電流計とか繋げて
上のように電球点灯させてみたり
していたのですが、
時々見に行ったりするのが面倒くさいとかありました。
それで、デジタルで出来たら良いのにーと思っていたのですが、
INA219を使うことで可能らしいと最近気づいて
電光表示でリアルタイムの電圧、電流、積算ワット数等など
表示する装置を開発しました。

お名前はEmoWat's、エコなワットは交流用で。
自分のは直流専用なエモーショナルなワッツです。
■回路図

得意のATMEGAとAQM1602Yを使った回路ですね。
回路図とは色違いの表示機になってますけど。
■使用感としては
時々見に行ったりするのは変わらないんですけど・・・
その機能を実装するならば、何ボルトまで下がったら、
止めるんですけど、
何ボルトまでなのか謎なので、今のところ実装していません。
目安としては1.2Vの電池であれば、1V切ったあたりか?
と思っていますけど。見極めが難しい。
ただし、実績の数字が出ますので、
電池として何ワットぐらい使えるのかの目安にはなります。
『まだ使える』と自信を持って使えるようになります。
■プログラム
//
//
#include <Wire.h> // ライブラリのインクルード
#include <Adafruit_INA219.h>
#include "ST7032_asukiaaa.h"
Adafruit_INA219 ina219; // INA219オブジェクトの生成(アドレス0x40)
ST7032_asukiaaa lcd;
double MWH=0.00;
double MAH=0.00;
int DisplayModeFlag = 0;
unsigned long time_ms = 0;
void display(char *strBuf1, char *strBuf2)
{
strcat(strBuf1, " ");
strcat(strBuf2, " ");
lcd.setCursor(0, 0);
lcd.print(strBuf1);
lcd.setCursor(0, 1);
lcd.print(strBuf2);
}
void setup(void)
{
Serial.begin(115200); // シリアル通信の開始
ina219.begin(); // INA219との通信を開始(初期化)
//ina219.setCalibration_16V_400mA(); // 測定レンジの設定
//ina219.setCalibration_32V_1A();
ina219.setCalibration_32V_2A();
lcd.begin(16, 2);
lcd.setContrast(50);
lcd.setCursor(0, 0);
lcd.print("Emo Wat's");
delay(2000);
time_ms = millis();
}
void loop(void)
{
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;
float power_mW = 0;
shuntvoltage = ina219.getShuntVoltage_mV(); // シャント抵抗間の電圧計測
busvoltage = ina219.getBusVoltage_V(); // 接続した回路の電圧計測
current_mA = ina219.getCurrent_mA(); // 電流の計測
power_mW = ina219.getPower_mW(); // 電力の計測
loadvoltage = busvoltage + (shuntvoltage / 1000); // 負荷電圧の計算
MWH = MWH + ((float)power_mW/360.0);
MAH = MAH + ((float)current_mA/360.0);
Serial.print("Bus Voltage: "); Serial.print(busvoltage); Serial.println(" V");
Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
Serial.print("Load Voltage: "); Serial.print(loadvoltage); Serial.println(" V");
Serial.print("Current: "); Serial.print(current_mA); Serial.println(" mA");
Serial.print("Power: "); Serial.print(power_mW); Serial.println(" mW");
Serial.println("");
char strLoadVoltage[16];
char strAmpere_mA[16];
char strPower_mW[16];
char strMWH[16];
char strMAH[16];
dtostrf((float)loadvoltage,6,2,strLoadVoltage);
dtostrf((float)current_mA,5,1,strAmpere_mA);
dtostrf((float)power_mW,7,1,strPower_mW);
dtostrf((float)MWH,8,1,strMWH);
dtostrf((float)MAH,8,1,strMAH);
Serial.print("strLoadVoltage: "); Serial.print(strLoadVoltage); Serial.println(" V");
Serial.print("strAmpere_mA: "); Serial.print(strAmpere_mA); Serial.println(" mA");
Serial.print("strPower_mW: "); Serial.print(strPower_mW); Serial.println(" mW");
Serial.print("strMWH: "); Serial.print(strMWH); Serial.println(" mWH");
Serial.print("strMAH: "); Serial.print(strMAH); Serial.println(" mAH");
unsigned long keika_min = (millis() - time_ms) / 1000 / 60;
unsigned long keika_hh = keika_min/60;
unsigned long keika_mm = keika_min%60;
char strHH[16];
char strMM[16];
if(keika_hh<1000){
dtostrf(keika_hh,3,0,strHH);
dtostrf(keika_mm,2,0,strMM);
}
else{
strcpy(strHH, "---");
strcpy(strMM, "--");
}
if(strMM[0]==' '){
strMM[0]='0';
}
dtostrf((float)MAH,8,1,strMAH);
Serial.print("keika_min: "); Serial.print(keika_min); Serial.println("");
Serial.print("hh: "); Serial.print(strHH); Serial.println("");
Serial.print("mm: "); Serial.print(strMM); Serial.println("");
char strBuf1[256];
char strBuf2[256];
sprintf(strBuf1, "%sV %smA", strLoadVoltage, strAmpere_mA);
sprintf(strBuf2, "%s:%s %smW", strHH, strMM, strPower_mW);
display(strBuf1, strBuf2);
delay(5000); //5秒
sprintf(strBuf1, "AccA:%smAH", strMAH);
sprintf(strBuf2, "AccW:%smWH", strMWH);
DisplayModeFlag = 0;
display(strBuf1, strBuf2);
delay(5000); //5秒
}