電池チェッカー

やっとまともな電子工作ができた・・・

ESP32-C3を使った電子工作をしたかった

今回は・・・電池チェッカー

以前購入していたボードです。

SuperMini ESP32-C3

Amazon.co.jp: Ducevnaoe -C3 開発ボード 2 セット スーパーミニ開発ボード 開発ボード WiFi シングルコア プロセッサ Bluetooth : パソコン・周辺機器

まず、M5StickCPlusでプロトタイプを作成した。

コードはCpilot(チャット)に仕様を伝えて作成

ベースをもとに試行錯誤して電池の電圧を測定できた。

これを元にESP32-C3(SuperMini[K2])で構築する。

ほかに必要なものをそろえる

1.OLED:SD1306(I2c)
2.抵抗:100K(2個)
3.基板:適当なサイズ
4.配線:適当な長さ
5.バッテリー:Lipo(500mAh~1000mAh)
6.充電ボード:
7.ケース:適当なサイズ

今回は、1.~4.までが揃った(あと7.ケース)

充電ボードがあったが、Lipoバッテリが見つからなかった
※どこかにしまい込んでるね・・・

回路を作成して、テストコードで動作確認
SD1306に文字が出れば完成

文字が出たのでOLEDとの接続は完了

次に抵抗2本で3.3V(基準電圧)に合わせる
100Kが2本の中間電圧なので、Max6Vまでとなる

  ※GPIO32(M5StickC)・GPIO0(SuperMini)

SSD1306はi2cで接続
SDA=GPIO4
SCL=GPIO5
3.3v=VCC
GND=GND

※後でよ~く見てたら・・・
 SDAとSCLの接続先・・・なんで4と5何だろうか
 Copilot(チェット)のサンプルが・・・

その中間点の電圧をADCで読み取って基準電圧の差で電圧を算出
して表示する仕組みだ

UIのチューニング中・・・

いろいろCopilotと検討して、最終コードをインストールして
ケースに入れてみた

最終てきには、デフォルト表示の0.04vも修正したが・・・

本物のテスターで電池を測定した電圧を覚えて
バッテリーチェッカーで測定した値を元に
補正値を算出してソースに反映

これで電池チェッカーの完成です

久しぶりにワクワクしたね

まずは、これはここまでとし
さらなるステップアップを計画するのだ。

1.バッテリー実装

つづく・・・

参考サイト:
【Arduino】ESP32 C3 SuperMiniを使う – たまねぎブログ

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C

#define SDA_PIN 4
#define SCL_PIN 5
#define ADC_PIN 0

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// キャリブレーション用
const float kAdcRef      = 3.3;   // ADC基準電圧
const float kDividerGain = 2.0;   // 分圧(100k+100k)
const float kScale       = 0.89;  // 実測から求めたスケール補正
const float kOffset      = 0.00;  // 必要なら 0.04 などを入れて使う
const float kDeadZone    = 0.10;  // 0.10V 未満は 0.00V 扱い

float lastVoltage = -100;

void setup() {
  Wire.begin(SDA_PIN, SCL_PIN);

  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    for(;;); // 初期化失敗時は停止
  }

  display.clearDisplay();
  display.display();

  analogReadResolution(12);  // 0〜4095
}

void loop() {
  int raw = analogRead(ADC_PIN);

  float v33  = raw / 4095.0 * kAdcRef;
  float batt = v33 * kDividerGain * kScale - kOffset;

  // マイナスは切り捨て
  if (batt < 0) batt = 0;

  // デッドゾーン:ごく低い電圧は 0.00V とみなす
  if (batt < kDeadZone) batt = 0.0;

  // 差分更新(0.01V以上変化したら更新)
  if (abs(batt - lastVoltage) > 0.01) {
    display.clearDisplay();

    // タイトル
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);
    display.print("EXT VOLTAGE");

    // 中央の大きい電圧表示
    display.setTextSize(3);
    char buf[10];
    sprintf(buf, "%.2f", batt);

    int16_t x1, y1;
    uint16_t w, h;
    display.getTextBounds(buf, 0, 0, &x1, &y1, &w, &h);
    int centerX = (SCREEN_WIDTH - w) / 2;

    display.setCursor(centerX, 16);
    display.print(buf);

    // 単位(小さく右寄せ)
    display.setTextSize(1);
    display.setCursor(centerX + w + 2, 28);
    display.print("V");

    // 下部の補助情報
    display.setCursor(0, 50);
    display.print("RAW:");
    display.print(raw);

    display.setCursor(70, 50);
    display.print("V33:");
    display.print(v33, 2);

    display.display();
    lastVoltage = batt;
  }

  delay(50);
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA