[英]arduino sensor's misfunction over wifi
我有一個使用 4 個傳感器(DHT11、PIR、漏水、MQ2)的 esp32 固件。 所有傳感器工作正常並提供准確的 output 但是當我嘗試包含 Wi-Fi 連接和 Wi-Fi 客戶端時,水和 mq2 傳感器提供錯誤和隨機數據。 有沒有人以前遇到過這個問題?
以下是沒有 Wi-Fi 的 output 的示例:
並使用 Wi-Fi 命令顯示如下:
這是使用的代碼:
#include <DHTesp.h>
#include <WiFi.h>
#include <MQ2.h>
#ifndef ESP32
#pragma message(THIS EXAMPLE IS FOR ESP32 ONLY!)
#error Select ESP32 board.
#endif
const char* ssid = "Mynetwork";
const char* password = "********";
const uint16_t port = 8090;
const char * host = "***********";
const int dhtPin = 18;
const int waterPin = 26;
const int mq2Pin = 2;
const int pirPin = 25;
int factor=0;
DHTesp dht;
MQ2 mq2(mq2Pin);
void setup() {
pinMode(pirPin,INPUT);
pinMode(waterPin,INPUT);
pinMode(mq2Pin,INPUT);
pinMode(pirPin,INPUT);
Serial.begin(115200);
mq2.begin();
dht.setup(dhtPin, DHTesp::DHT11);
factor = analogRead(waterPin);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(2000);
Serial.println("...");
}
}
void loop() {
WiFiClient client;
if (!client.connect(host, port)) {
Serial.println("Connection to host failed");
delay(500);
return;
}
Serial.print("WiFi connected with IP: ");
Serial.println(WiFi.localIP());
float *values= mq2.read(true);
Serial.print("Temperature:\t");
Serial.println(getTemp());
client.println(getTemp());
Serial.print("Humidity:\t");
Serial.println(getHum());
client.println(getHum());
Serial.print("movement:\t");
Serial.println(getPir());
client.println(getPir());
Serial.print("Water state:\t");
Serial.println(getWater());
client.println(getWater());
Serial.print("LPG:\t");
Serial.println(getLPG());
client.println(getLPG());
Serial.print("Smoke:\t");
Serial.println(getSmoke());
client.println(getSmoke());
Serial.print("CO:\t");
Serial.println(getCO());
client.println(getCO());
delay(3000);
}
float getTemp(){
return dht.getTemperature();
}
float getHum(){
return dht.getHumidity();
}
int getWater(){
int sensorValue = analogRead(waterPin)-factor;
int per= (sensorValue*100/4094);
return map(per,0,33,0,100);
}
float getSmoke(){
return mq2.smoke;
}
float getLPG(){
return mq2.lpg;
}
float getCO(){
return mq2.co;
}
int getPir(){
return (digitalRead(pirPin));
}
ESP32 內部有兩個 ADC,但 ADC2 在 ESP32 內的其他資源之間共享。 它們映射為:
ADC1_CH0 -- GPIO36
ADC1_CH1 -- Not available on some ESP32 development board
ADC1_CH2 -- NA
ADC1_CH3 -- GPIO39
ADC1_CH6 -- GPIO34
ADC1_CH7 -- GPIO35
ADC1_CH4 -- GPIO32
ADC1_CH5 -- GPIO33
ADC2_CH0 --- GPIO0
ADC2_CH1 --- Not available on some boards
ADC2_CH2 --- GPIO2
ADC2_CH3 --- GPIO15
ADC2_CH4 --- GPIO13
ADC2_CH5 --- GPIO12
ADC2_CH6 --- GPIO14
ADC2_CH7 --- GPIO27
ADC2_CH8 --- GPIO25
ADC2_CH9 --- GPIO26
使用 WiFi 時不能使用 ADC2 引腳。 另一方面,即使啟用了 WiFi,也可以使用 ADC1 引腳。 參考來源。
因此,不要為您的 MQ 傳感器使用 pin2,而是嘗試使用 pin 36 或 34。
另外 ESP32 以噪音着稱,嘗試在 3v3 和 GND 之間加一個 10uF 和 0.1uF 的電容。
如果您打算在項目中使用 ESP32 進行模擬測量,您還需要注意一件事,即 ESP32 ADC 不是線性的,我有一篇關於ESP32 ADC 的非線性以及我如何使用查找的博客討論表來校正非線性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.