• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как объединить два скетча?

mikkinikki

New member
Делаю гроубокс с автоматическим включением, выключением лампы, регулировкой температуры и влажности. Имеются таки железки: Wemos D1 mini; ёмкостной датчик влажности почвы; модуль часов в реальном времени DS1302; датчик температуры и влажности DHT 21; 4-х канальный твердотельный релейный модуль G3MB-202P.
Есть скетч автоматизации, который меня полностью устраивает, хотя, может он и не идеальный, я не сильно разбираюсь, но главное - работает так, как я хочу. Я вижу в нем где можно изменить пределы температуры и влажности, периоды и продолжительность работы железок. И есть скетч для web-сервера, который отображает показания датчиков и состояние реле.
Как объединить два скетча, что-бы все работало?

C++:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <DHT.h>

#define DHTTYPE DHT21

int sensorPin = A0;
uint8_t DHTPin = 2;
DHT dht(DHTPin, DHTTYPE);

MDNSResponder mdns;

// Wi-Fi
const char* ssid = "*****************";
const char* password = "*************";

byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 222); // здесь можно изменить IP адрес контроллера
IPAddress gateway(192, 168, 1, 1); // IP адрес роутера
IPAddress subnet(255, 255, 255, 0);

ESP8266WebServer server(80);

int lamp = 14;
int ventil = 12;
int water = 13;

void setup(void) {
  // preparing GPIOs
  pinMode(lamp, OUTPUT);
  pinMode(ventil, OUTPUT);
  pinMode(water, OUTPUT);
 
  delay(100);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);

  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder started");
  }

  //+++++++++++++++++++++++ START  ЛАМПА ++++++++++++++++++++
  server.on("/", []() {
    server.send(200, "text/html", webPage());
  });
  server.on("/socket1On", []() {
    digitalWrite(lamp, HIGH);
    server.send(200, "text/html", webPage());
    delay(100);

  });
  server.on("/socket1Off", []() {
    digitalWrite(lamp, LOW);
    server.send(200, "text/html", webPage());
    delay(100);
  });
  //+++++++++++++++++++++++ END  ЛАМПА ++++++++++++++++++++

  //+++++++++++++++++++++++ START  ВЫТЯЖКА  ++++++++++++++++++++

  server.on("/socket2On", []() {
    digitalWrite(ventil, HIGH);
    server.send(200, "text/html", webPage());
    delay(100);
  });
  server.on("/socket2Off", []() {
    digitalWrite(ventil, LOW);
    server.send(200, "text/html", webPage());
    delay(100);
  });
  // +++++++++++++++++++++++ END  ВЫТЯЖКА ++++++++++++++++++++

  //+++++++++++++++++++++++ START  УВЛАЖНИТЕЛЬ  ++++++++++++++++++++

  server.on("/socket3On", []() {
    digitalWrite(water, HIGH);
    server.send(200, "text/html", webPage());
    delay(100);
  });
  server.on("/socket3Off", []() {
    digitalWrite(water, LOW);
    server.send(200, "text/html", webPage());
    delay(100);
  });
  // +++++++++++++++++++++++ END  УВЛАЖНИТЕЛЬ ++++++++++++++++++++



  server.begin();
  Serial.println("HTTP server started");
}

void loop(void){
  server.handleClient();
}

String webPage()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  String web;
  web += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/> <meta charset=\"utf-8\"><title>ESP 8266</title><style>button{color:red;padding: 10px 27px;}</style></head>";
  web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">ESP8266 Web Server</h1><div>";

  //++++++++++ ЛАМПА  +++++++++++++
  web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">----ЛАМПА----</p>";
  if (digitalRead(lamp) == 1)
  {
    web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
  }
  else
  {
    web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
  }
  web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket1On\"><button>ON</button></a>&nbsp;<a href=\"socket1Off\"><button>OFF</button></a></div>";
  // ++++++++ ЛАМПА +++++++++++++

  //++++++++++ ВЫТЯЖКА +++++++++++++
  web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">----ВЫТЯЖКА----</p>";
  if (digitalRead(ventil) == 1)
  {
    web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
  }
  else
  {
    web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
  }
  web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket2On\"><button>ON</button></a>&nbsp;<a href=\"socket2Off\"><button>OFF</button></a></div>";
  // ++++++++ ВЫТЯЖКА +++++++++++++

  //++++++++++ УВЛАЖНИТЕЛЬ +++++++++++++
  web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">----УВЛАЖНИТЕЛЬ----</p>";
  if (digitalRead(water) == 1)
  {
    web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
  }
  else
  {
    web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
  }
  web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket3On\"><button>ON</button></a>&nbsp;<a href=\"socket3Off\"><button>OFF</button></a></div>";
  // ++++++++ УВЛАЖНИТЕЛЬ +++++++++++++

  //++++++++++ Влажность почвы +++++++++++++
  web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">-Влажность почвы-</p>";
  web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #5191e4;margin: 0 auto;\">" + String((int)analogRead(sensorPin)) + "</div>";
  // ++++++++ Влажность почвы  +++++++++++++

  //++++++++++ Температура в боксе +++++++++++++
  web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">-Температура в боксе-</p>";
  web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #5191e4;margin: 0 auto;\">" + String((int)t) + "</div>";
  // ++++++++ Температура в боксе +++++++++++++

  //++++++++++ Влажность в боксе +++++++++++++
  web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">-Влажность в боксе-</p>";
  web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #5191e4;margin: 0 auto;\">" + String((int)h) + "</div>";
  // ++++++++ Влажность в боксе +++++++++++++

  // ========REFRESH=============
  web += "<div style=\"text-align:center;margin-top: 20px;\"><a href=\"/\"><button style=\"width:158px;\">REFRESH</button></a></div>";
  // ========REFRESH=============


  web += "</div>";
  return (web);
}
 

mikkinikki

New member
Второй скетч
C++:
#include <DHT.h">
#include <DS1302.h>
#define DHTPin 2
#define DHTTYPE DHT21
int maxHum = 50; // предел влажность
int maxTemp = 27; // предел температура
float currentTemp = 25; // текущая температура, в процессе работы ее значение меняеться
float currentHum = 32;
DHT dht(DHTPIN, DHTTYPE);

Time t;
int d; // Переменная в которую записываются текущий показатель часов
int m; // Переменная в которую записываются текущий показатель минут
int s; // Переменная в которую записываются текущий показатель секунд
DS1302 rtc(5, 4, 0); /* Подключение the DS1302
  CE pin (RES) -> Arduino Digital 7 -> wemos d1-5
  I/O pin (DAT) -> Arduino Digital 8 -> wemos d2-4
  SCLK pin(CLK) -> Arduino Digital 9 -> wemos d3-0
*/

uint32_t myTimer1;
int period = 99000; //
uint32_t myTimerVentil;
uint32_t myTimerPump;
uint32_t myTimerWater;

// пины для поключения
int lamp = 14;
int ventil = 12;
int water = 13;
int pump = 15;
int sensorPin = A0;

bool lampState = false;
int lastMin;
int last15Min;
int lastHour;

void setup() {
  Serial.begin(9600);
  dht.begin();
  pinMode(ventil, OUTPUT);//вентилятор
  pinMode(lamp, OUTPUT);//лампа
  pinMode(water, OUTPUT);//увлажнитель воздуха
  pinMode(pump, OUTPUT); //помпа
}
void loop() {
  t = rtc.getTime();
  d = t.hour, DEC;
  m = t.min, DEC;
  s = t.sec, DEC;

    if (d >= 5 && d < 23) { //включаем лампу с 5 по 23
    digitalWrite(lamp, HIGH);
    if (!lampState) Serial.println("Лампа включена");
    lampState = true;
  }
  // выключаем лампу в 23
  else {
    digitalWrite(lamp, LOW);
    if (lampState) Serial.println("Лампа выключена");
    lampState = false;
  }
  // здесь запускаем вытяжку каждые 15 минут
  if (m % 15 == 0 && m != last15Min) {
    Serial.print(rtc.getTimeStr());
    last15Min = m;
    digitalWrite(ventil, HIGH); // включаем кулер
    Serial.println(" - Вытяжка запущена на 20 c.");
    delay(20000); // время работы вытяжки
    digitalWrite(ventil, LOW); // отключаем вытяжку
    Serial.println("Вытяжка остановлена");
  }

 
  if (m % 2 == 0 && m != lastMin) { // выполняется через каждые 2 минуты, период менять ЗДЕСЬ
    Serial.println("--");
    Serial.println(rtc.getTimeStr());
    lastMin = m;
    myTimer1 += period;              // сброс таймера
    getValueDHT(5, 2); // запускаем функцию измерения влажности и температуры 5 измерений с интервалом 2 сек.
    if (currentTemp > maxTemp && !digitalRead(ventil)) {
      digitalWrite(ventil, HIGH); // включаем кулер
      myTimerVentil = millis(); // фиксируем время включение кулера
      Serial.println("Кулер запущен");
    }
    if (currentHum < maxHum && !digitalRead(water)) {
      digitalWrite(water, HIGH); // включаем увлажнитель
      myTimerWater = millis(); // фиксируем время включения увлажнителя
      Serial.println("Включен увлажнитель");
    }
  }
  if (d % 2 > 0 && m < 3 && s >= 35 && d != lastHour) { // выполняется каждую первую минуту нечетного часа т.е. раз в 2 часа
    Serial.println(rtc.getTimeStr());
    lastHour = d;
    if (getValueSensor(10, 3) < 900) { // запускаем функцию измерения влажности почвы и  полученое значение сравниваем с пределом. ПРЕДЕЛ ДЛЯ ПОМПЫ МЕНЯТЬ ЗДЕСЬ
      digitalWrite(pump, HIGH); // включаем помпу
      myTimerPump = millis(); // фиксируем время включения помпы
      Serial.println("Помпа запущена");
    }
  }

  if (millis() - myTimerVentil >= 30000) { // выключаем кулер через 30 с.
    if (digitalRead(ventil)) {
      Serial.print(rtc.getTimeStr());
      Serial.println("  Кулер остановлен");
    }
    digitalWrite(ventil, LOW);

  }
  if (millis() - myTimerWater >= 30000) { // выключаем увлажнитель через 30 с.
    if (digitalRead(water)) {
      Serial.print(rtc.getTimeStr());
      Serial.println("  Увлажнитель отключен");
    }
    digitalWrite(water, LOW);

  }
  if (millis() - myTimerPump >= 10000) { // выключаем помпу через 10 с.
    if (digitalRead(pump)) {
      //Serial.print(rtc.getTimeStr());
      //Serial.println("  Помпа остановлена");
    }
    digitalWrite(pump, LOW);

  }
}

//функция определения влажности почвы
int getValueSensor(int quantity, int Interval) {
  int sum = 0;
  for (int i = 0; i < quantity; i++) {
    sum += analogRead(sensorPin);
    delay (Interval);
  }
  int result = sum / quantity;
  Serial.print(result);
  Serial.println(" - Влажность почвы");
  return result;
}

//функция определения температуры и влажности
void getValueDHT(int quantity, int Interval) {
  if (isnan(dht.readHumidity()) || isnan(dht.readTemperature())) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  float h = 0;
  float t = 0;
  for (int i = 0; i < quantity; i++) {
    h += dht.readHumidity();
    t += dht.readTemperature();
    delay (Interval);
  }
  h = h / quantity;
  t = t / quantity;
  currentTemp = t;
  currentHum = h;
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");
  return;
}
 

esp340

Active member
А по существу - вариантов два. Первый - почитать умные книжки по программированию и написать код самому. Второй - заказать кому-то за вознаграждение (в 200 грн. думаю в этот раз не уложитесь).
 

flashdaze

New member
Есть хороший ресурс, в котором собирается прошивка из кучи уже готового различного функционала. Там же вроде как есть возможность создавать свои собственные наборы. https://wifi-iot.com/p/esp8266rtos/
 
Сверху Снизу