Неисправность датчика Arduino по Wi-Fi - PullRequest
0 голосов
/ 02 мая 2020

У меня есть прошивка esp32, которая использует 4 датчика (DHT11, PIR, утечка воды, MQ2). Все датчики работают нормально и дают точный вывод, но когда я пытаюсь включить соединение Wi-Fi и клиент Wi-Fi, датчики воды и mq2 дают неверные и случайные данные. Кто-нибудь сталкивался с этой проблемой раньше?

Вот пример выхода без Wi-Fi:

  • температура: 18
  • влажность: 58
  • уровень воды: 97
  • движение: 1
  • дым: 6
  • Сжиженный газ: 12
  • CO: 8

и с командами Wi-Fi это выглядит так:

  • температура: 18
  • влажность: 58
  • уровень воды: 4065
  • движение: 1
  • дым: 26145582395.16
  • LPG: 26145582395.16
  • CO: 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));
}

1 Ответ

1 голос
/ 02 мая 2020

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 не могут быть использованы при использовании WiFi. С другой стороны, контакты ADC1 можно использовать даже при включенном WiFi. Источник справки .

Поэтому вместо того, чтобы использовать контакт 2 для вашего датчика MQ, попробуйте использовать контакт 36 или 34.

Также хорошо известен ESP32 для его шума попробуйте добавить конденсаторы 10 мкФ и 0,1 мкФ между 3v3 и GND.

Еще одна вещь, которую вы должны знать, если вы планируете использовать ESP32 для аналоговых измерений в своем проекте, что АЦП ESP32 не являются линейными, у меня есть блог о нелинейности ESP32 AD C и как я использую справочную таблицу для исправления нелинейности .

...