请注意
esp8266的ADC引脚受wifi模块影响,会导致不准确,具体请查看这里:https://github.com/esp8266/Arduino/issues/2070
简单说一下解决方案:
①如果不是频繁的读取数据,可以在wifi连接前读取数据然后存储到缓存;
②或者在读取数据前将wifi关闭,然后再打开wifi;
③如果有足够的引脚,可以使用外部ADC
正文开始
该模块5v时输出1v,因esp8266 ADC引脚(A0)支持电压范围是0v-1v,所以该方案仅支持0-5v电压检测
接线:
- 接 esp8266GND
+ 可不接
S 接 ADC esp8266 为 A0
VCC 被检测直流电+
GND 被检测直流电-
#include <Wire.h>
const int adcPin = A0; // ADC引脚
float calculateVoltage(int adcReading) {
// ADC最小读数,空载ADC引脚时读数
int minADC = 12;
// ADC最大读数,被检测电池充满电时的读数
int maxADC = 338;
// 338 = 5.045v最大值,被检测电池充满电时的电压(万用表测)
float maxADCVlotage = 5.045;
float normalizedReading = static_cast<float>(adcReading - minADC) / (maxADC - minADC);
float voltage = normalizedReading * maxADCVlotage;
return voltage;
}
void setup() {
Serial.begin(115200); // 初始化串口通信
}
void loop() {
// 读取ADC值
int adcReading = analogRead(adcPin);
// 计算电压
float voltage = calculateVoltage(adcReading);
// 输出结果
Serial.print("ADC读数: ");
Serial.print(adcReading);
Serial.print("\t电压: ");
Serial.print(voltage);
Serial.println("V");
delay(1000); // 延时1秒
}
如果您有更好的方案,欢迎评论交流。