我的项目场景:
最近在应用安信可的 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 引脚就行了