Как бы я оптимизировал этот код, чтобы мой arduino nodemcu через некоторое время не зависал - PullRequest
0 голосов
/ 26 марта 2019

У меня есть проект IOT, который контролирует террариум моего хамелеона. Он имеет реле, подключенное к контактам D5 и D6 для управления освещением. Мой Nodemcu 0.9 перестает работать через ~ 20 часов (в это время индикаторы выключены и не включаются, мне всегда приходится сбрасывать настройки nodemcu).

Я читал стек и обнаружил, что строки используют много кучи памяти, поэтому я удалил их все, но проблема все еще сохраняется.

main.cpp

#include <FirebaseArduino.h>
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiUdp.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>

#include "credentials.h"

#define DHTPIN D7
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);
double previousTemperature = 0.0;
double previousHumidity = 0.0;

boolean overRide = false;
boolean uvStatus;
boolean irStatus;

int baskingTime;
int startHour;
int startMinute;
int endTime;

int startTimeMinutes;
int endTimeMinutes;

const int uvPin = D5;
const int irPin = D6;

const char *ssid = "Waifas 2.4";
const char *password = "lsmustud";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 7200, 60000);

void setup()
{
  pinMode(uvPin, OUTPUT);
  pinMode(irPin, OUTPUT);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
  }

  timeClient.begin();

  //initialize firebase
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);

  Firebase.setBool(OVERRIDE, false);
  baskingTime = Firebase.getInt(BASKING_TIME);
  startHour = Firebase.getInt(START_HOUR);
  startMinute = Firebase.getInt(START_MINUTE);
  uvStatus = Firebase.getBool(UV_STATUS);
  irStatus = Firebase.getBool(IR_STATUS);

  startTimeMinutes = startHour * 60 + startMinute;
  endTimeMinutes = startHour * 60 + startMinute + baskingTime * 60;

  Firebase.stream(DB_PATH);

  dht.begin();
}

void loop()
{
  timeClient.update();
  int clientHour = timeClient.getHours();
  int clientMinute = timeClient.getMinutes();
  int currentTimeMinutes = clientHour * 60 + clientMinute;

  if (Firebase.failed())
  {
    delay(1000);
    Firebase.stream(DB_PATH);
    return;
  }

  if (Firebase.available())
  {
    FirebaseObject event = Firebase.readEvent();
    String eventPath = event.getString("path");
    eventPath.toLowerCase();
    if (eventPath == "/override")
    {
      overRide = Firebase.getBool(OVERRIDE);
    }
    if (eventPath == "/uvstatus")
    {
      uvStatus = Firebase.getBool(UV_STATUS);
    }
    if (eventPath == "/irstatus")
    {
      irStatus = Firebase.getBool(IR_STATUS);
    }
    if (eventPath == "/baskingtime" || eventPath == "/starthour" || eventPath == "/startminute")
    {
      baskingTime = Firebase.getInt(BASKING_TIME);
      startHour = Firebase.getInt(START_HOUR);
      startMinute = Firebase.getInt(START_MINUTE);

      endTime = startHour + baskingTime;

      if (endTime >= 24)
      {
        endTime = endTime - 24;
      }

      startTimeMinutes = startHour * 60 + startMinute;
      endTimeMinutes = endTime * 60 + startMinute;
    }
  }

  if (!overRide)
  {
    if (startTimeMinutes <= currentTimeMinutes && currentTimeMinutes <= endTimeMinutes)
    {
      if (!uvStatus)
      {
        Firebase.setBool(UV_STATUS, true);
        uvStatus = true;
      }
      if (!irStatus)
      {
        Firebase.setBool(IR_STATUS, true);
        irStatus = true;
      }
    }
    else
    {
      if (uvStatus)
      {
        Firebase.setBool(UV_STATUS, false);
        uvStatus = false;
      }
      if (irStatus)
      {
        Firebase.setBool(IR_STATUS, false);
        irStatus = false;
      }
    }
  }

  if (uvStatus)
  {
    digitalWrite(uvPin, LOW);
  }
  else
  {
    digitalWrite(uvPin, HIGH);
  }

  if (irStatus)
  {
    digitalWrite(irPin, LOW);
  }
  else
  {
    digitalWrite(irPin, HIGH);
  }

  double t = dht.readTemperature();
  double h = dht.readHumidity();

  if (isnan(h) || isnan(t))
  {
  }
  else
  {
    if (h != previousHumidity)
    {
      previousTemperature = h;
      Firebase.setFloat(HUMIDITY, h);
    }
    if (t != previousTemperature)
    {
      previousTemperature = t;
      Firebase.setFloat(TEMPERATURE, t);
    }
  }
  delay(1000);
}

Credentials.h

//define firebase login
#define FIREBASE_HOST "someDatabase.someGoogleLink.com"
#define FIREBASE_AUTH "someSecret"

//db path
#define DB_PATH "/control/"

#define BASKING_TIME "/control/baskingTime"
#define IR_STATUS "/control/irStatus"
#define UV_STATUS "/control/uvStatus"
#define START_MINUTE "/control/startMinute"
#define START_HOUR "/control/startHour"
#define OVERRIDE "/control/overRide"
#define TEMPERATURE "/temperature"
#define HUMIDITY "/humidity"

Не могли бы вы помочь мне исправить это? Я не программист, просто любитель, поэтому мне очень трудно это понять.

...