#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include "HX711.h"
// Pin Definitions
#define DHTPIN 8
#define DHTTYPE DHT11
#define RELAY_HEATER 4
#define RELAY_FAN 5
#define BUTTON_PARAM 9
#define BUTTON_INC 6
#define BUTTON_START 7
#define LOADCELL_DOUT 3
#define LOADCELL_SCK 2
// LCD I2C address 0x27, 16 columns, 2 rows
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
HX711 scale;
// User-defined targets
float targetWeight = 500.0; // grams
int targetHumidity = 60; // %
int maxTemperature = 40; // °C
// Modes
int settingParam = 0; // 0=weight, 1=humidity, 2=temp
bool dryingStarted = false;
void setup() {
lcd.init();
lcd.backlight();
dht.begin();
scale.begin(LOADCELL_DOUT, LOADCELL_SCK);
scale.set_scale(); // to calibrate later
scale.tare();
pinMode(RELAY_HEATER, OUTPUT);
pinMode(RELAY_FAN, OUTPUT);
pinMode(BUTTON_PARAM, INPUT_PULLUP);
pinMode(BUTTON_INC, INPUT_PULLUP);
pinMode(BUTTON_START, INPUT_PULLUP);
digitalWrite(RELAY_HEATER, LOW);
digitalWrite(RELAY_FAN, LOW);
lcd.print("Set Parameters:");
delay(1000);
}
void loop() {
if (!dryingStarted) {
parameterSettingMode();
} else {
dryingOperationMode();
}
}
void parameterSettingMode() {
lcd.clear();
showCurrentSetting();
delay(500);
if (!digitalRead(BUTTON_PARAM)) {
settingParam = (settingParam + 1) % 3;
delay(500);
}
if (!digitalRead(BUTTON_INC)) {
switch (settingParam) {
case 0: targetWeight += 10; break;
case 1: targetHumidity += 5; break;
case 2: maxTemperature += 1; break;
}
delay(500);
}
if (!digitalRead(BUTTON_START)) {
dryingStarted = true;
lcd.clear();
lcd.print("Drying Started");
delay(1000);
}
}
void showCurrentSetting() {
lcd.setCursor(0, 0);
if (settingParam == 0) lcd.print("Target Wt: " + String(targetWeight) + "g");
else if (settingParam == 1) lcd.print("Target Hum: " + String(targetHumidity) + "%");
else if (settingParam == 2) lcd.print("Max Temp: " + String(maxTemperature) + "C");
lcd.setCursor(0, 1);
lcd.print("Press Start Btn");
}
void dryingOperationMode() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
float weight = scale.get_units();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:" + String((int)temperature) + "C H:" + String((int)humidity) + "%");
lcd.setCursor(0, 1);
lcd.print("Wt:" + String((int)weight) + "g");
if (temperature < maxTemperature && humidity > targetHumidity) {
digitalWrite(RELAY_HEATER, HIGH);
} else {
digitalWrite(RELAY_HEATER, LOW);
}
if (humidity > targetHumidity) {
digitalWrite(RELAY_FAN, HIGH);
} else {
digitalWrite(RELAY_FAN, LOW);
}
if (weight <= targetWeight && humidity <= targetHumidity) {
digitalWrite(RELAY_HEATER, LOW);
digitalWrite(RELAY_FAN, LOW);
lcd.clear();
lcd.print("Drying Complete");
while (1);
}
delay(2000);
}