arduino 传感器在 wifi 上的故障

arduino sensor's misfunction over wifi

我有一个使用 4 个传感器(DHT11、PIR、漏水、MQ2)的 esp32 固件。所有传感器都工作正常并提供准确的输出,但是当我尝试包括 Wi-Fi 连接和 Wi-Fi 客户端时,水和 mq2 传感器会提供错误的随机数据。有没有人以前遇到过这个问题?

这是一个没有 Wi-Fi 的输出示例:

并且 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

ADC2 pins can not be used when WiFi is used. On the other hand, ADC1 pins can be used even when WiFi is enabled. Source of reference.

因此,请尝试使用 pin 36 或 34,而不是将 pin2 用于 MQ 传感器。

另外ESP32的噪音也是众所周知的,尝试在3v3和GND之间加一个10uF和0.1uF的电容。

如果您计划在您的项目中使用 ESP32 进行模拟测量,您还需要注意一件事,即 ESP32 ADC 是非线性的,我有一篇博客讨论 non-linearity of ESP32 ADC and how I use uses a Look-up table to correct the non-linearity