From a1aee4134c24c6a858f2dc8cc17c643406bbc8e9 Mon Sep 17 00:00:00 2001 From: Hickmeister <35031453+Hickmeister@users.noreply.github.com> Date: Mon, 13 Jan 2025 21:42:35 +0000 Subject: [PATCH] added ESP32 Code --- esp32Code/dryer/main.ino | 226 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 esp32Code/dryer/main.ino diff --git a/esp32Code/dryer/main.ino b/esp32Code/dryer/main.ino new file mode 100644 index 0000000..35e0697 --- /dev/null +++ b/esp32Code/dryer/main.ino @@ -0,0 +1,226 @@ +#include +#include +#include +#include +#include "Adafruit_AHTX0.h" + +// WiFi Credentials +const char* ssid = "HickmanWiFi"; +const char* password = "BlackBriar8787@@"; + +// Sensor and Server Instances +Adafruit_AHTX0 aht; +AsyncWebServer server(80); + +// Pins for Relays +#define FAN_RELAY_PIN 26 +#define HEATER_RELAY_PIN 25 // GPIO 25 for heater relay + +// Dryer State Variables +bool dryerOn = false; +bool fanRelayState = false; +bool heaterRelayState = false; +float currentTemperature = 0.0; +float currentHumidity = 0.0; +float targetTemperature = 0.0; +int dryingTime = 0; // Total drying time in minutes +int remainingTime = 0; // Remaining drying time in minutes +unsigned long startTime = 0; // Time when the dryer was started (millis) + +// Historical Data +const int maxHistory = 180; +std::vector tempHistory; +std::vector humidityHistory; + +// Initialize Relays and Sensor +void setup() { + Serial.begin(115200); + + // Connect to WiFi + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + delay(1000); + Serial.println("Connecting to WiFi..."); + } + Serial.println("Connected to WiFi"); + + // AHT10 Sensor Setup + if (!aht.begin()) { + Serial.println("Failed to find AHT10 sensor"); + while (1) delay(10); + } + Serial.println("AHT10 Found"); + + // Setup Relay Pins + pinMode(FAN_RELAY_PIN, OUTPUT); + pinMode(HEATER_RELAY_PIN, OUTPUT); + digitalWrite(FAN_RELAY_PIN, LOW); + digitalWrite(HEATER_RELAY_PIN, LOW); + + // Web Server Endpoints + server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", "Filament Dryer Control"); + }); + + server.on("/status", HTTP_GET, [](AsyncWebServerRequest *request) { + sensors_event_t humidity, temp; + aht.getEvent(&humidity, &temp); + + currentTemperature = temp.temperature; + currentHumidity = humidity.relative_humidity; + + // Update remaining drying time + if (dryerOn) { + unsigned long elapsedTime = (millis() - startTime) / 60000; // Convert to minutes + remainingTime = dryingTime > elapsedTime ? dryingTime - elapsedTime : 0; + + // Automatically turn off dryer when time is up + if (remainingTime == 0) { + dryerOn = false; + heaterRelayState = false; + fanRelayState = false; + digitalWrite(HEATER_RELAY_PIN, LOW); + digitalWrite(FAN_RELAY_PIN, LOW); + Serial.println("Drying completed. Dryer turned off."); + } + } else { + remainingTime = 0; + } + + // Store historical data + if (tempHistory.size() >= maxHistory) tempHistory.erase(tempHistory.begin()); + if (humidityHistory.size() >= maxHistory) humidityHistory.erase(humidityHistory.begin()); + tempHistory.push_back(currentTemperature); + humidityHistory.push_back(currentHumidity); + + String response = "{"; + response += "\"dryerOn\":" + String(dryerOn ? "true" : "false") + ","; + response += "\"fanRelayState\":" + String(fanRelayState ? "true" : "false") + ","; + response += "\"heaterRelayState\":" + String(heaterRelayState ? "true" : "false") + ","; + response += "\"temperature\":" + String(currentTemperature) + ","; + response += "\"humidity\":" + String(currentHumidity) + ","; + response += "\"targetTemperature\":" + String(targetTemperature) + ","; + response += "\"dryingTime\":" + String(dryingTime) + ","; // Total drying time + response += "\"remainingTime\":" + String(remainingTime) + ","; // Remaining time + + // Serialize temperature and humidity history +response += "\"tempHistory\":["; +for (size_t i = 0; i < tempHistory.size(); i++) { + response += String(tempHistory[i]); + if (i < tempHistory.size() - 1) response += ","; +} +response += "],"; + +response += "\"humidityHistory\":["; +for (size_t i = 0; i < humidityHistory.size(); i++) { + response += String(humidityHistory[i]); + if (i < humidityHistory.size() - 1) response += ","; +} +response += "]"; + + + response += "}"; + + request->send(200, "application/json", response); + }); + + server.on("/control", HTTP_POST, [](AsyncWebServerRequest *request) { + int params = request->params(); + for (int i = 0; i < params; i++) { + AsyncWebParameter* p = request->getParam(i); + if (p->name() == "dryerOn") { + dryerOn = (p->value() == "true"); + if (dryerOn) { + startTime = millis(); + fanRelayState = true; + } + } else if (p->name() == "targetTemperature") { + targetTemperature = p->value().toFloat(); + } else if (p->name() == "dryingTime") { + dryingTime = p->value().toInt(); + } + } + + request->send(200, "application/json", "{\"status\":\"success\"}"); + }); + + // CORS Handling + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Headers", "*"); + + // Start Server + server.begin(); +} + +// Monitor and Update +void loop() { + sensors_event_t humidity, temp; + aht.getEvent(&humidity, &temp); + currentTemperature = temp.temperature; + currentHumidity = humidity.relative_humidity; + + // Safety Controls + if (currentTemperature > 26.0) { + fanRelayState = true; + digitalWrite(FAN_RELAY_PIN, HIGH); // Force fan on + Serial.println("Safety: Fan forced ON due to high temperature."); + } + + // Dryer Control Logic + if (dryerOn) { + if (currentTemperature < targetTemperature) { + heaterRelayState = true; + digitalWrite(HEATER_RELAY_PIN, HIGH); + } else { + heaterRelayState = false; + digitalWrite(HEATER_RELAY_PIN, LOW); + } + + // Ensure the fan is always on when the heater is active + fanRelayState = true; + digitalWrite(FAN_RELAY_PIN, HIGH); + } else { + heaterRelayState = false; + digitalWrite(HEATER_RELAY_PIN, LOW); + if (currentTemperature <= 26.0) { + fanRelayState = false; + digitalWrite(FAN_RELAY_PIN, LOW); + } + } + + // Manual Serial Command Handling + handleSerialCommands(); + + delay(5000); // Update sensor readings every 5 seconds +} + +// Handle Serial Commands to Control Relays +void handleSerialCommands() { + if (Serial.available() > 0) { + String command = Serial.readStringUntil('\n'); + command.trim(); + + if (command == "fan on") { + fanRelayState = true; + digitalWrite(FAN_RELAY_PIN, HIGH); + Serial.println("Fan relay activated."); + } else if (command == "fan off") { + fanRelayState = false; + digitalWrite(FAN_RELAY_PIN, LOW); + Serial.println("Fan relay deactivated."); + } else if (command == "heater on") { + heaterRelayState = true; + digitalWrite(HEATER_RELAY_PIN, HIGH); + fanRelayState = true; + digitalWrite(FAN_RELAY_PIN, HIGH); + Serial.println("Heater relay activated. Fan ON for safety."); + } else if (command == "heater off") { + heaterRelayState = false; + digitalWrite(HEATER_RELAY_PIN, LOW); + Serial.println("Heater relay deactivated."); + } else { + Serial.println("Unknown command. Use 'fan on', 'fan off', 'heater on', or 'heater off'."); + } + } +}