やっとまともな電子工作ができた・・・
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);
}