項目場景:
最近在使用安信可的 ESP32S P14 引腳(ADC 16)讀取一個電路狀態的時候遇到一個問題,電路狀態不是很穩定,在高電平的時候,會突然出現毫秒級的波動,出現短暫的低電平,造成設備狀態翻轉,但是波動最低電壓也不會到0,於是我想到使用 analogRead() 讀取模擬量,替代 digitalRead() 的數據量。
可是 analogRead() 讀出來的數據卻是 0 ,digitalRead() 和 萬用表都顯示引腳電壓卻是沒有問題。這就非常奇怪了
問題描述:
我先抽象了一個簡單的 digitalRead() 和 analogRead() 讀取模型,發現 P14 引腳(ADC 16)是可以進行模擬量和數據量的讀取的,analogRead() 讀取模擬量甚至可以不初始化為 INPUT 模式也可以讀取,說明,這個引腳確實是 ADC 引腳。
可是這就沒什么代碼和流程,我整個復制到我應用的代碼里面去獲取模擬量,依然讀取不到數據。
void setup() {
Serial.begin(115200);
pinMode(water_pin, OUTPUT);
pinMode(sign_pin, INPUT);
pinMode(monitor_pin,INPUT);
}
void loop() {
// printf("\n digitalRead == : %d!!!!!\r\n", digitalRead(sign_pin));
Serial.println();
printf("\n analogRead == : %d!!!!!\r\n", analogRead(sign_pin)); // 讀取沒問題
Serial.println();
delay(100);
}
原因分析:
我在引用代碼加打印的時候發現,在初始化引腳的時候確實是可以讀取模擬量的,可是啟動 WiFi 模塊之后就讀取不到了,我懷疑 arduino 在初始化 WiFi 的時候會把部分 ADC 引腳初始為 數字量模式,我測試了一下 P14(ADC16) 和 P27(ADC17) 都有這個問題,但是 SVP(ADC0) 沒問題。這大概是這個初始化流程移植 arduino 上的時候保留了 UNO板子的特性(0-5 為模擬量)
void setup() {
Serial.begin(115200);
pinMode(water_pin, OUTPUT);
pinMode(sign_pin, INPUT);
pinMode(monitor_pin,INPUT);
printf("\n analogRead111 == : %d!!!!!\r\n", analogRead(sign_pin)); // 這時候是可以讀取模擬量的
// 啟動 WiFi 並且連接網絡
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
printf("\n analogRead222 == : %d!!!!!\r\n", analogRead(sign_pin)); // 到這兒的時候就不能讀取模擬量了
// 獲取並打印 IP 地址
Serial.println("");
Serial.println("WiFi connected");
Serial.print("'ip :");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
}
void loop() {
printf("\n digitalRead == : %d!!!!!\r\n", digitalRead(sign_pin));
Serial.println();
printf("\n analogRead == : %d!!!!!\r\n", analogRead(sign_pin));
Serial.println();
delay(100);
}
解決方案:
修改硬件,將P14引腳修改為SVP引腳就行了