乐趣区

关于arduino:arduino-使用-analogRead-读取不到数据digitalRead-却可以正常读取

我的项目场景:

最近在应用安信可的 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 引脚就行了

退出移动版