簡體   English   中英

arduino 傳感器在 wifi 上的故障

[英]arduino sensor's misfunction over wifi

我有一個使用 4 個傳感器(DHT11、PIR、漏水、MQ2)的 esp32 固件。 所有傳感器工作正常並提供准確的 output 但是當我嘗試包含 Wi-Fi 連接和 Wi-Fi 客戶端時,水和 mq2 傳感器提供錯誤和隨機數據。 有沒有人以前遇到過這個問題?

以下是沒有 Wi-Fi 的 output 的示例:

  • 溫度:18
  • 濕度:58
  • 水位:97
  • 運動:1
  • 煙霧:6
  • 液化石油氣:12
  • 一氧化碳:8

並使用 Wi-Fi 命令顯示如下:

  • 溫度:18
  • 濕度:58
  • 水位:4065
  • 運動:1
  • 煙霧:26145582395.16
  • 液化石油氣:26145582395.16
  • 公司:26145582395.16

這是使用的代碼:

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM