電圧を測定してみました。analogRead()で値を取得できますが、かなりズレがあります。ズレを計測したところ、このようになりました。4番目のピンに510 Ωと100 Ωで分圧したものを接続しています。
この図から分かるように切片を持った1次的なズレをしていることがわかったので、2点の値を計測すれば、正しい値が出力されるようなプログラムを書いてみました。
const int inpin = 4; //測定ピン
const int R1 = 510; //プラス側の抵抗値
const int R2 = 100; //マイナス側の抵抗値
const float inV1 = 4; //校正に使用した電圧
const float ESP32ValueV1 = 4;//校正に使用した電圧の表示値
const float inV2 = 15; //校正に使用した電圧
const float ESP32ValueV2 = 15;//校正に使用した電圧の表示値
//読み取り値=katamuki*入力値+seppenn を計算する
const float katamuki = (ESP32ValueV2 - ESP32ValueV1) / (inV2 - inV1); //傾きの算出
const float seppenn = ESP32ValueV1 - (katamuki * inV1); //切片の算出
const float Xsettenn = - seppenn / katamuki; //X軸との交点
void setup() {
Serial.begin(115200);
Serial.println();
Serial.print("MaxVoltage:"); //最大入力電圧の表示
Serial.println(3.3 * (R1 + R2) / R2);
Serial.print("kousei:"); //読み取り値=katamuki*入力値+seppenn の表示
Serial.print("ESP32Value = ");
Serial.print(katamuki);
Serial.print("*inV + ");
Serial.println(seppenn);
Serial.print("MinVoltage:"); //最小測定可能電圧の表示
Serial.println(Xsettenn);
delay(5000);
}
void loop() {
float pinrawV = analogRead(inpin); //inpinの値を読み込む
float voltage = (pinrawV * (R1 + R2) / (R2 * 1000) - seppenn) / katamuki; //電圧の計算
if (voltage <= Xsettenn){voltage = 0;} //校正した結果、0V以下になった際の処理
Serial.println(voltage); //電圧値を出力
delay(1000);
}
const float ESP32ValueV1 = 4;
と、const float ESP32ValueV2 = 15;
の部分の値(V1の方を4Vを入力した時の値、V2を15Vの値を入力した際の値)を表示値にすることで校正することができます。
なお、使用しているピンはGPIO4でADC2に接続されています。ADC2はWiFiやBluetoothなどの無線を使用すると使用できなくなる(値が0になる)ので注意してください。