首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >arduino传感器对wifi的误用

arduino传感器对wifi的误用
EN

Stack Overflow用户
提问于 2020-05-02 00:15:28
回答 1查看 114关注 0票数 0

我有一个esp32固件,使用4个传感器(DHT11,PIR,漏水,MQ2)。所有传感器工作良好,并提供准确的输出,但当我试图包括Wi连接和Wi客户端,水和mq2传感器提供错误和随机的数据。以前有没有人经历过这个问题?

下面是一个没有Wi的输出示例:

  • 温度: 18
  • 湿度: 58
  • 水位: 97
  • 动议:1
  • 烟雾:6
  • 液化石油气: 12
  • 文书:8

通过with命令,它显示如下:

  • 温度: 18
  • 湿度: 58
  • 水位: 4065
  • 动议:1
  • 烟雾: 26145582395.16
  • 石油气: 26145582395.16
  • 文书: 26145582395.16

下面是使用的代码:

代码语言:javascript
运行
复制
#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));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-02 01:54:41

ESP32内部有两个ADC,但ADC2在ESP32中的其他资源之间共享。它们被映射为:

代码语言:javascript
运行
复制
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引脚在使用WiFi时不能使用。另一方面,即使启用了ADC1,也可以使用WiFi引脚。参考来源

因此,不要在MQ传感器上使用pin2,而是尝试使用pin 36或34。

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

如果您计划在您的项目中使用ESP32进行模拟测量,您还需要注意的是,ESP32 ADC不是线性的,我在博客中谈到了ESP32模数转换器的非线性以及如何使用对修正非线性的查找表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61552787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档