• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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/
 
Сверху Снизу