Hi everyone,
I’m working on combining two separate ESP8266 projects, but I’m having some difficulty merging their functionalities. Here’s a quick overview of the two codes I want to integrate:
Code 1:
This code controls a fan and light system with configurable on/off timers via a web interface. It uses the AsyncWebServer library, stores settings in EEPROM, and updates timer values in real-time.
Code 2:
This code monitors temperature and humidity using the AHT10 sensor and controls a relay and a humidifier based on configurable thresholds. It also uses EEPROM for saving configurations and includes a web interface for user settings.
My Goal:
I want to create a single codebase that integrates the following:
- Fan and light control with on/off timers.
- Relay and humidifier control based on temperature and humidity thresholds.
- A unified web interface to configure all settings (timers, temperature, humidity, etc.).
- Persistent storage for all settings using EEPROM.
I’ve tried merging the codes, but I’m facing challenges with overlapping functions, libraries, and managing the timers and states simultaneously.
My Questions:
- How can I efficiently integrate both web interfaces without conflict?
- What’s the best way to handle multiple timers and states in one loop()?
- Are there any examples of combining projects like this, or tips for managing complexity?
I’d appreciate any advice, examples, or suggestions to simplify the integration process. Let me know if you’d like to see the full code for each project. and mt idea for web page look likr this https://codepen.io/pars-tondar/pen/zxOwEyE
Thank you!
#include <Wire.h>
#include <Thinary_AHT10.h>
#include <ESP8266WiFi.h>
#include <ESPAsyncWebServer.h>
#include <NTPClient.h>
#include <EEPROM.h> // اضافه کردن کتابخانه EEPROM
AHT10Class AHT10;
AsyncWebServer server(80);
// تنظیمات شبکه
const char* ssid = "9KEYnew";
const char* password = "n123456789";
const int relayPin = D5;
const int humidifierPin = D7; // پین ترانزیستور مرطوبکننده
float currentTemp = 0;
float currentHumidity = 0;
int minTemp = 20; // حداقل دمای پیشفرض
int maxTemp = 25; // حداکثر دمای پیشفرض
int minHumidity = 40; // مقدار پیشفرض حداقل رطوبت
int maxHumidity = 60; // مقدار پیشفرض حداکثر رطوبت
int lampWattage = 100;
bool relayState = false;
bool humidifierState = false;
unsigned long lastUpdate = 0;
const int updateInterval = 10000;
// تعریف اندازه حافظه EEPROM
#define EEPROM_SIZE 10
// تابع برای ذخیره تنظیمات در EEPROM
void saveSettings() {
EEPROM.begin(EEPROM_SIZE);
EEPROM.write(0, minTemp); // ذخیره حداقل دما
EEPROM.write(1, maxTemp); // ذخیره حداکثر دما
EEPROM.write(2, minHumidity);
EEPROM.write(3, maxHumidity);
EEPROM.commit();
EEPROM.end();
Serial.println("Settings saved!");
}
// تابع برای بارگذاری تنظیمات از EEPROM
void loadSettings() {
EEPROM.begin(EEPROM_SIZE);
minTemp = EEPROM.read(0);
maxTemp = EEPROM.read(1);
minHumidity = EEPROM.read(2);
maxHumidity = EEPROM.read(3);
EEPROM.end();
// بررسی صحت مقادیر و تنظیم پیشفرض در صورت غیرمعتبر بودن
if (minTemp < 0 || minTemp > 80) minTemp = 20;
if (maxTemp < 0 || maxTemp > 80 || maxTemp <= minTemp) maxTemp = 25;
if (minHumidity < 0 || minHumidity > 100) minHumidity = 40;
if (maxHumidity < 0 || maxHumidity > 100 || maxHumidity <= minHumidity) maxHumidity = 60;
Serial.println("Settings loaded!");
}
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(relayPin, OUTPUT);
pinMode(humidifierPin, OUTPUT);
digitalWrite(relayPin, LOW);
digitalWrite(humidifierPin, LOW);
if (AHT10.begin(eAHT10Address_Low))
Serial.println("Init AHT10 Success.");
else
Serial.println("Init AHT10 Failure.");
// بارگذاری تنظیمات از EEPROM
loadSettings();
// ایجاد نقطه دسترسی
WiFi.softAP(ssid, password);
Serial.println("Access Point Started");
Serial.print("SSID: ");
Serial.println(ssid);
Serial.print("IP Address: ");
Serial.println(WiFi.softAPIP());
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/html", getHTML());
});
server.on("/settemp", HTTP_GET, [](AsyncWebServerRequest *request){
if (request->hasParam("minTemp")) {
minTemp = request->getParam("minTemp")->value().toInt();
}
if (request->hasParam("maxTemp")) {
maxTemp = request->getParam("maxTemp")->value().toInt();
}
if (request->hasParam("watt")) {
lampWattage = request->getParam("watt")->value().toInt();
}
if (request->hasParam("minHum")) {
minHumidity = request->getParam("minHum")->value().toInt();
}
if (request->hasParam("maxHum")) {
maxHumidity = request->getParam("maxHum")->value().toInt();
}
// ذخیره تنظیمات جدید در EEPROM
saveSettings();
request->redirect("/");
});
server.begin();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - lastUpdate >= updateInterval) {
lastUpdate = currentMillis;
readSensor();
}
controlRelay();
controlHumidifier();
}
void readSensor() {
currentHumidity = AHT10.GetHumidity();
currentTemp = AHT10.GetTemperature();
Serial.println("Humidity(%RH):\t\t" + String(currentHumidity) + "%");
Serial.println("Temperature(℃):\t" + String(currentTemp) + "℃");
}
void controlRelay() {
if (currentTemp >= maxTemp) { // خاموش کردن رله در دمای بالاتر از حداکثر
if (relayState) {
relayState = false;
}
digitalWrite(relayPin, LOW);
} else if (currentTemp < minTemp) { // روشن کردن رله در دمای کمتر از حداقل
if (!relayState) {
relayState = true;
}
digitalWrite(relayPin, HIGH);
}
}
void controlHumidifier() {
if (currentHumidity < minHumidity) {
if (!humidifierState) {
humidifierState = true;
digitalWrite(humidifierPin, HIGH);
}
} else if (currentHumidity > maxHumidity) {
if (humidifierState) {
humidifierState = false;
digitalWrite(humidifierPin, LOW);
}
}
}
String getHTML() {
String html = "<html><body><h1>Temperature and Humidity</h1>";
html += "<p>Temperature: " + String(currentTemp) + " °C</p>";
html += "<p>Humidity: " + String(currentHumidity) + " %</p>";
html += "<h2>Settings</h2>";
html += "<form action=\"/settemp\" method=\"get\">";
html += "<label for=\"minTemp\">Minimum Temperature (°C):</label>";
html += "<input type=\"number\" name=\"minTemp\" value=\"" + String(minTemp) + "\" min=\"0\" max=\"80\"><br>";
html += "<label for=\"maxTemp\">Maximum Temperature (°C):</label>";
html += "<input type=\"number\" name=\"maxTemp\" value=\"" + String(maxTemp) + "\" min=\"0\" max=\"80\"><br>";
html += "<label for=\"watt\">Lamp Wattage:</label>";
html += "<select name=\"watt\" id=\"watt\">";
for (int i = 100; i <= 1000; i += 100) {
html += "<option value=\"" + String(i) + "\"" + (i == lampWattage ? " selected" : "") + ">" + String(i) + " W</option>";
}
html += "</select><br>";
html += "<label for=\"minHum\">Minimum Humidity (%):</label>";
html += "<input type=\"number\" name=\"minHum\" value=\"" + String(minHumidity) + "\" min=\"0\" max=\"100\"><br>";
html += "<label for=\"maxHum\">Maximum Humidity (%):</label>";
html += "<input type=\"number\" name=\"maxHum\" value=\"" + String(maxHumidity) + "\" min=\"0\" max=\"100\"><br>";
html += "<input type=\"submit\" value=\"Update Settings\">";
html += "</form>";
html += "<h2>Device Status</h2>";
html += "<p>Relay: " + String(relayState ? "ON" : "OFF") + "</p>";
html += "<p>Humidifier: " + String(humidifierState ? "ON" : "OFF") + "</p>";
html += "</body></html>";
return html;
}
2th code
#include <Wire.h>
#include <Thinary_AHT10.h>
#include <ESP8266WiFi.h>
#include <ESPAsyncWebServer.h>
#include <EEPROM.h> // Include the EEPROM library
AHT10Class AHT10;
AsyncWebServer server(80);
// Network settings
const char* ssid = "ESP8266-Access-Point"; // Set the SSID of the Access Point
const char* password = "123456789"; // Set the password for the Access Point
// Pin definitions
const int fanPin = D6;
const int lightPin = D0;
// On/off times in hours and minutes
int fanOnHour = 0;
int fanOnMin = 1;
int fanOffHour = 0;
int fanOffMin = 1;
int lightOnHour = 0;
int lightOnMin = 1;
int lightOffHour = 0;
int lightOffMin = 1;
// Timer settings
unsigned long startMillis;
unsigned long currentMillis;
int seconds = 0;
int minutes = 0;
int hours = 0;
int days = 0;
// Status of fan and light
bool fanState = false;
bool lightState = false;
// EEPROM storage
void loadSettings() {
EEPROM.begin(512);
fanOnHour = EEPROM.read(0);
fanOnMin = EEPROM.read(1);
fanOffHour = EEPROM.read(2);
fanOffMin = EEPROM.read(3);
lightOnHour = EEPROM.read(4);
lightOnMin = EEPROM.read(5);
lightOffHour = EEPROM.read(6);
lightOffMin = EEPROM.read(7);
EEPROM.end();
}
void saveSettings() {
EEPROM.begin(512);
EEPROM.write(0, fanOnHour);
EEPROM.write(1, fanOnMin);
EEPROM.write(2, fanOffHour);
EEPROM.write(3, fanOffMin);
EEPROM.write(4, lightOnHour);
EEPROM.write(5, lightOnMin);
EEPROM.write(6, lightOffHour);
EEPROM.write(7, lightOffMin);
EEPROM.end();
}
// Wi-Fi and Web server setup
void setupWiFi() {
// Start the Access Point
WiFi.softAP(ssid, password); // Set the SSID and password for the AP
// Print the IP address assigned to the ESP8266
Serial.println("Access Point Started");
Serial.print("IP Address: ");
Serial.println(WiFi.softAPIP());
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
String html = "<html><body>";
html += "<h1>Control System</h1>";
html += "<form action='/set' method='POST'>";
html += "Fan On Time (hours:minutes): <input type='number' name='fanOnHour' min='0' max='23' value='" + String(fanOnHour) + "'> : <input type='number' name='fanOnMin' min='0' max='59' value='" + String(fanOnMin) + "'><br>";
html += "Fan Off Time (hours:minutes): <input type='number' name='fanOffHour' min='0' max='23' value='" + String(fanOffHour) + "'> : <input type='number' name='fanOffMin' min='0' max='59' value='" + String(fanOffMin) + "'><br>";
html += "Light On Time (hours:minutes): <input type='number' name='lightOnHour' min='0' max='23' value='" + String(lightOnHour) + "'> : <input type='number' name='lightOnMin' min='0' max='59' value='" + String(lightOnMin) + "'><br>";
html += "Light Off Time (hours:minutes): <input type='number' name='lightOffHour' min='0' max='23' value='" + String(lightOffHour) + "'> : <input type='number' name='lightOffMin' min='0' max='59' value='" + String(lightOffMin) + "'><br>";
html += "<input type='submit' value='Set'>";
html += "</form>";
// Show the status of the fan and light
html += "<h2>Status:</h2>";
html += "<p>Fan: " + String(fanState ? "ON" : "OFF") + "</p>";
html += "<p>Light: " + String(lightState ? "ON" : "OFF") + "</p>";
// Display timer information
html += "<h2>Timer Status:</h2>";
html += "<p>Seconds: " + String(seconds) + "</p>";
html += "<p>Minutes: " + String(minutes) + "</p>";
html += "<p>Hours: " + String(hours) + "</p>";
html += "<p>Days: " + String(days) + "</p>";
html += "</body></html>";
request->send(200, "text/html", html); // Send the response to the client
});
server.on("/set", HTTP_POST, [](AsyncWebServerRequest *request){
fanOnHour = request->arg("fanOnHour").toInt();
fanOnMin = request->arg("fanOnMin").toInt();
fanOffHour = request->arg("fanOffHour").toInt();
fanOffMin = request->arg("fanOffMin").toInt();
lightOnHour = request->arg("lightOnHour").toInt();
lightOnMin = request->arg("lightOnMin").toInt();
lightOffHour = request->arg("lightOffHour").toInt();
lightOffMin = request->arg("lightOffMin").toInt();
saveSettings();
// Redirect to the main page after saving settings
request->redirect("/"); // Use request->redirect to redirect the user to the main page
});
server.begin();
}
void setup() {
Serial.begin(115200);
pinMode(fanPin, OUTPUT);
pinMode(lightPin, OUTPUT);
loadSettings(); // Load settings from EEPROM
setupWiFi();
startMillis = millis();
}
void loop() {
currentMillis = millis();
// Calculate time
if (currentMillis - startMillis >= 1000) {
startMillis = currentMillis;
seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
}
if (minutes >= 60) {
minutes = 0;
hours++;
}
if (hours >= 24) {
hours = 0;
days++;
}
}
// Control the intake fan and light system
static unsigned long fanTimer = 0;
static unsigned long lightTimer = 0;
if (fanState) {
digitalWrite(fanPin, HIGH);
} else {
digitalWrite(fanPin, LOW);
}
if (lightState) {
digitalWrite(lightPin, HIGH);
} else {
digitalWrite(lightPin, LOW);
}
// Timer for fan and light on/off control
if (fanState && (millis() - fanTimer >= (fanOnHour * 3600000 + fanOnMin * 60000))) {
fanState = false;
fanTimer = millis();
}
if (!fanState && (millis() - fanTimer >= (fanOffHour * 3600000 + fanOffMin * 60000))) {
fanState = true;
fanTimer = millis();
}
if (lightState && (millis() - lightTimer >= (lightOnHour * 3600000 + lightOnMin * 60000))) {
lightState = false;
lightTimer = millis();
}
if (!lightState && (millis() - lightTimer >= (lightOffHour * 3600000 + lightOffMin * 60000))) {
lightState = true;
lightTimer = millis();
}
}