Arduino WiFi ESP8266 данные журнала с условиями не удается - PullRequest
0 голосов
/ 10 октября 2019

Извините, если название не является точным на 100%, я попытаюсь объяснить это лучше: я использую модуль Wi-Fi SparkFun ESP8266, запрограммированный с Arduino. Он получает данные от датчика влажности и температуры DHT22 и регистрирует эти данные в моей базе данных Firebase (через приложение Flask) ТОЛЬКО при соблюдении определенных условий:

  • температура> 16C и разница с последней температурой. > = 1C
  • ИЛИ: темп. <= 16C и отличие от последней температуры> = 5C
  • ИЛИ: влажность <60% и разница с последним гулом. > = 1%
  • ИЛИ: гул. > = 60% и отличие от прошлого гула. > = 5%
int deltaT = abs(temp-temp1);
      int deltaH = abs(hum-hum1);

      if (
          (temp1 > 16.0 && deltaT >= 1)
          || (temp1 <= 16.0 && deltaT >= 5)
          || (hum1 < 60.0 && deltaH >= 1)
          || (hum1 >= 60.0 && deltaH >= 5)
        ){
// ...
}

Проблема заключается в том, что независимо от того, каковы результаты измерения температуры и влажности, мое устройство по-прежнему сохраняет большую часть данных (иногда это работает). Я не знаю, связана ли проблема с моей логикой (оператором if) или чем-то еще.

Это мой полный код, можете ли вы помочь мне устранить неполадки?

#include <DHT.h>

#include <ESP8266WiFi.h>

#include <DNSServer.h>            //Local DNS Server used for redirecting all requests to the configuration portal
#include <ESP8266WebServer.h>     //Local WebServer used to serve the configuration portal
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager WiFi Configuration Magic

#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN,DHTTYPE);

float temp;
float hum;
float temp1;
float hum1;

int red_light_pin = 16;
int green_light_pin = 12;
int blue_light_pin = 13;
int switch_pin = 15;

// Server, file, and port
const char hostname[] = "laundryireland.tk";
const String uri = "/write_data?";
const String arguments[3] = {"serial=","&temp=","&hum="};
const int port = 80;

bool powerOn;

String serialNumber;

WiFiClient client;


void RGB_color(int red_light_value, int green_light_value, int blue_light_value)
 {
  analogWrite(red_light_pin, red_light_value);
  analogWrite(green_light_pin, green_light_value);
  analogWrite(blue_light_pin, blue_light_value);
}

void setup() {

  powerOn = true;

  pinMode(red_light_pin,OUTPUT);
  pinMode(green_light_pin,OUTPUT);
  pinMode(blue_light_pin,OUTPUT);
  pinMode(switch_pin,INPUT);
  RGB_color(0,0,255);

  WiFi.persistent(false);
  WiFiManager wifiManager;

  //Initialize Serial
  Serial.begin(9600);
  dht.begin();
  delay(100);

  //Connect to WiFi
  Serial.println("Connecting...");
  wifiManager.autoConnect();
  while (WiFi.status() != WL_CONNECTED ) {

    delay(500);
    Serial.print(".");
  }


  //Show that we are connected
  Serial.println("Connected!");
  Serial.println(WiFi.localIP());

  serialNumber = WiFi.macAddress();
  delay(2000);
}

void loop() {
  static unsigned long next = 0;

  int switch_state = digitalRead(switch_pin);
  int count = 0;

  while (switch_state == HIGH){
    count = count + 1;
    delay(1000);
    switch_state = digitalRead(switch_pin);
    if (count >= 3 && powerOn == true) {
      powerOn = false;
      RGB_color(255,0,0);
      Serial.println("Eco-mode active");
      break;
    } else if (count >= 3 && powerOn == false) {
      powerOn = true;
      RGB_color(0,255,0);
      Serial.println("Full throttle!");
      break;
    }
  }

  if (powerOn == true){
    unsigned long now = millis();

    if (now > next) {
      temp1 = dht.readTemperature();
      hum1 = dht.readHumidity();
      while (temp1 == NAN || hum1 == NAN){
          RGB_color(255,0,0);
          delay(5000);
          temp1 = dht.readTemperature();
          hum1 = dht.readHumidity();
        }

      int deltaT = abs(temp-temp1);
      int deltaH = abs(hum-hum1);

      if (
          (temp1 > 16.0 && deltaT >= 1)
          || (temp1 <= 16.0 && deltaT >= 5)
          || (hum1 < 60.0 && deltaH >= 1)
          || (hum1 >= 60.0 && deltaH >= 5)
        ){

        temp = temp1;
        hum = hum1;

        RGB_color(0,255,0);
        Serial.print("Temperature: ");
        Serial.println(temp);
        Serial.print("Humidity: ");
        Serial.println(hum);

        Serial.println("Testing flask ");
        if ( client.connect(hostname,port) == 0 ) {
          Serial.println("Flask Test Failed!");
        } else {
          Serial.println("Flask Test Success!");
          client.print("GET " + uri + arguments[0] + serialNumber +
                        arguments[1] + temp +
                        arguments[2] + hum +
                        " HTTP/1.1\r\n" +
                        "Host: " + hostname + "\r\n" +
                        "Connection: close\r\n" +
                        "\r\n");
          delay(500);

        }

        client.stop();
        Serial.println();
        Serial.println("Connection closed");

      } else {
        Serial.println("temp or hum not changed");
        RGB_color(255,255,0);
      }
      next = now + 600000;
    } else {
      delay(1000);
    }
  }

}

Этопример данных, которые не должны были быть записаны, потому что они не следуют моей логике оператора if (числа сверху - это временные метки):

example data

Ответы [ 3 ]

1 голос
/ 11 октября 2019

tmp и hum - неинициализированные переменные.

Итак, при первом запуске вы вычислите deltaH и deltaT на основе случайных значений мусора из этих областей памяти. Таким образом, шансы получить высокие значения дельты близки к 100%.

Таким образом, у вас будет как минимум 2 условия, которые выполняются из-за высоких значений дельты.

Чтобы избежать подобных вещейВозьмите за правило присваивать значения переменным, прежде чем выполнять с ними какие-либо операции. Это дает вам известную, хорошо определенную ситуацию.

Чтобы отлаживать подобные вещи, просто напечатайте каждое значение, которое является частью вашего условия! Если значения выключены, выясните причину и устраните причину.

1 голос
/ 10 октября 2019

Не уверен, что эта строка даст ожидаемый результат:

while (temp1 == NAN || hum1 == NAN)

, поскольку NAN == NAN должен всегда возвращать false, условие всегда ложно, и цикл никогда не вводится, что означает, что вы могли илине может иметь постоянных значений с первой попытки измерения (до while).

try

while (isnan(temp1) || isnan(hum1))
0 голосов
/ 12 октября 2019

Ребята, я действительно ценю оказанную помощь. Очевидно, проблема была в использовании общего блока питания для смартфонов и планшетов, который, по-видимому, имеет функцию безопасности, которая отключает его при недостаточном потреблении энергии. Это вызвало в моем устройстве раздражающую петлю перезагрузки. Я заказываю специальный банк питания с низким током от SparkFun: https://www.sparkfun.com/products/14367

Это должно работать просто отлично. Спасибо всем еще раз.

...