ESP32教程55/55 - 如何测量12V、24V或100V直流电压 | SunFounder的ESP32物联网学习套件
在本教程中,我们将学习如何使用ESP32测量各种直流电压,包括12V、24V,甚至高达100V。通过使用由两个电阻组成的分压电路,我们可以安全地测量更高的电压,而不会损坏ESP32微控制器。本项目将演示如何读取这些电压并将其显示在串行监视器上,为您的电源提供有价值的见解。
观看视频以获取全面解释(视频中00:00处)。我们将使用简单的分压配置来实现这一点,确保我们可以安全地测量超过ESP32最大输入电平的电压。本教程非常适合那些希望扩展对ESP32及其功能知识的人。
计算电压的公式
硬件说明
本项目的关键组件包括ESP32微控制器、两个组成分压器的电阻,以及您想要测量的电源。ESP32内置Wi-Fi和蓝牙功能,使其成为物联网项目的多功能选择。由两个电阻组成的分压器允许我们将电压降低到ESP32可以处理的安全水平。
在此设置中,一个电阻R1固定为10kΩ,而第二个电阻R2可以根据您想要测量的最大电压而变化。R1两端的电压是我们将使用ESP32的模拟输入引脚读取的值,从而允许我们计算电源的原始电压。
- 确保电阻具有1%的容差以获得准确的测量结果。
- 使用分压器以防止超过ESP32的输入电压额定值。
- 保持
R1为10kΩ,并根据电压范围调整R2。 - 检查连接以避免可能导致读数不准确的悬空输入。
- 使用稳定的电源以获得一致的电压测量结果。
接线说明
要连接电路,首先将R1电阻(10kΩ)的一端连接到您的电压源,另一端连接到ESP32的GPIO引脚35。该引脚将读取R1两端的电压。接下来,将R2电阻(可以是100kΩ或根据您的需求选择其他值)连接在R1的节点与地之间。确保电源的地线也连接到ESP32的地线。
例如,如果测量24V,将电源的正极连接到R1,然后将R1的另一端连接到引脚35以及两个电阻的节点。R2的自由端应连接到地。此配置将允许ESP32安全地读取降压后的电压。
代码示例与讲解
const int R1 = 10000; // 电阻1的值
const int R2 = 100000; // 电阻2的值
const int VinPin = 35; // 电压输入引脚
在此摘录中,我们定义了电阻R1和R2的值,以及我们将用于读取电压的模拟引脚VinPin。这些常量对我们的电压计算至关重要。
void readVoltage() {
uint32_t voltage_mV = analogReadMilliVolts(VinPin); // 以毫伏为单位读取
VB1 = (((float) voltage_mV) / 1000.0) * (1 + (float)R2/(float)R1);
}
此函数从指定引脚读取以毫伏为单位的电压,并使用分压公式计算实际电压VB1。这对于将降压后的电压转换回原始值非常重要。
void maxVoltage() {
float maxVoltage = (3.1) * (1 + (float)R2/(float)R1);
}
在这里,我们定义了一个函数来计算并打印基于电阻值可以安全测量的最大电压。此函数对于确保我们不超过ESP32的电压限制至关重要。
演示/预期效果
当您运行代码时,应该会在串行监视器上看到测量的电压。当您调整输入电压时,读数应实时反映这些变化,展示ESP32准确测量各种直流电压的能力。如果您遇到读数波动,请考虑对多个样本进行平均以获得更稳定的结果(视频中12:30处)。
视频时间戳
- 00:00 开始
- 1:59 项目介绍
- 5:45 分压器
- 7:33 接线说明
- 9:14 Arduino代码说明
- 14:45 在Arduino IDE中选择ESP32开发板和COM端口
- 16:27 使用ESP32测量30V演示
- 21:36 将R2更改为330k欧姆
- 22:33 最小电压测量
/*
* 用于测量任何直流电压的ESP32的Arduino代码
* 作者:Ahmad Shamshiri
* 观看完整视频解释 https://youtu.be/znBiVlgV9JI
* www.robojax.com
* 2024年2月19日
*/
bool debug = false;
const int R1 = 10000; // 我们读取这个电阻两端的电压 ()
const int R2 = 100000;
const int VinPin = 35; // 连接到GPIO14的电位器
// PWM设置
const int freq = 5000; // PWM频率
const int resolution = 12; // PWM 分辨率(位)
const int channel = 0; // PWM 通道
float VB1;
int mV;
void setup() {
Serial.begin(115200);
// 配置PWM
ledcSetup(channel, freq, resolution);
// calculatResistor(R1, 24);//10000 欧姆 和 35.0V
}
void loop() {
readVoltage();
Serial.print("VB1 Voltage: ");
Serial.print(VB1); // 将毫伏转换为伏特
Serial.println("V ");
delay(500);
}
void readVoltage()
{
uint32_t voltage_mV = analogReadMilliVolts(VinPin); // 以毫伏为单位读取电压
if(debug)
{
maxVoltage();
Serial.print("PinVoltage: ");
Serial.print(voltage_mV);
Serial.println("mV");
Serial.println(); // 这添加了一行新内容。
}
mV = voltage_mV;
VB1 = (((float) voltage_mV) / 1000.0) * (1 + (float)R2/(float)R1);
}
/*
* 打印最大电压
*/
void maxVoltage()
{
float maxVoltage = ( 3.1) * (1 + (float)R2/(float)R1);
Serial.print("****Maximum Voltage: ");
Serial.print(maxVoltage);
Serial.println("V");
} // 最大电压() 结束
void calculatResistor(int r1, float voltage)
{
Serial.print("Calculating R2 when R1 is :");
Serial.print(r1);
Serial.print(" Ohms and Maximum Input Voltage is ");
Serial.print(voltage);
Serial.println("V");
Serial.print("***** R2 Should Be ");
float r2 = (voltage - 3.1)/ (3.1/ (float)r1);
Serial.print(r2 / 1000.0);
Serial.println(" kilo Ohms");
while(1);
}
Common Course Links
Common Course Files
资源与参考
尚无可用资源。
文件📁
没有可用的文件。