ESP32 教學 55/55 - 點樣量度 12V、24V 或者 100V 直流電壓 | SunFounder 嘅 ESP32 IoT 學習套件
喺呢個教學入面,我哋會學吓點樣用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 ohm
- 22:33 最低電壓量度
/*
Arduino code for ESP32 to measure any DC voltage
📚⬇️ Download and resource page https://robojax.com/RJT674
written by Ahmad Shamshiri
watch full video explanation https://youtu.be/znBiVlgV9JI
www.robojax.com
Feb 19, 2024
*/
bool debug = false;
const int R1 = 10000;//we read the voltage acrosst this resistor ()
const int R2 = 100000;
const int VinPin = 35; // Potentiometer connected to GPIO14
// PWM settings
const int freq = 5000; // PWM frequency
const int resolution = 12; // PWM resolution (bits)
const int channel = 0; // PWM channel
float VB1;
int mV;
void setup() {
Serial.begin(115200);
// Configure PWM
ledcSetup(channel, freq, resolution);
//calculatResistor(R1, 24);//10000 ohm and 35.0V
}
void loop() {
readVoltage();
Serial.print("VB1 Voltage: ");
Serial.print(VB1); // Convert millivolts to volts
Serial.println("V ");
delay(500);
}
void readVoltage()
{
uint32_t voltage_mV = analogReadMilliVolts(VinPin); // Read the voltage in millivolts
if(debug)
{
maxVoltage();
Serial.print("PinVoltage: ");
Serial.print(voltage_mV);
Serial.println("mV");
Serial.println();//this adds a new line
}
mV = voltage_mV;
VB1 = (((float) voltage_mV) / 1000.0) * (1 + (float)R2/(float)R1);
}
/*
prints maximum volage
*/
void maxVoltage()
{
float maxVoltage = ( 3.1) * (1 + (float)R2/(float)R1);
Serial.print("****Maximum Voltage: ");
Serial.print(maxVoltage);
Serial.println("V");
}//maxVoltage() end
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
資源與參考資料
暫時冇資源。
文件📁
冇文件可用。