#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <NTC_Thermistor.h>
#include "customchar.h"
#include <EEPROM.h>
#include "define.h"
float hum;
float temp;
char tempStr[6];
char humStr[5];
float temp_setting = 30.0;
float hum_setting = 70.0;
int day_setting = 21;
int engine_setting = 1;
enum {Normal, Temperature, Humidity, Day, Engine, SensorType, ResetDefault};
int setting_mode = Normal;
int sensor_type = 0; // 0 for DHT, 1 for NTC
int up_state = 0;
int down_state = 0;
int save_state = 0;
int setting_state = 0;
int prev_up_state = 0;
int prev_down_state = 0;
int prev_save_state = 0;
int prev_setting_state = 0;
unsigned long engine_time = 0;
unsigned long start_time = 0;
int engine_interval = 3600000;
int engine_duration = 60000;
int day_count = 0;
float calculateTemperature(float resistance) {
const float B = 3950.0; // B value of the NTC thermistor
const float R0 = 10000.0; // Resistance at a known temperature (usually room temperature)
// Calculate temperature using the Steinhart-Hart equation
float inv_T = 1.0 / (273.15 + 25.0) + (1.0 / B) * log(resistance / R0);
// Convert to Celsius
float tempNTC = 1.0 / inv_T - 273.15;
return tempNTC;
}
Servo heatGateServo;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Wire.begin();
dht.begin();
lcd.init();
lcd.clear();
lcd.backlight();
lcd.createChar(0, TempChar);
lcd.createChar(1, HumChar);
lcd.createChar(2, Ochar);
heatGateServo.attach(13);
pinMode(UP_PIN, INPUT_PULLUP);
pinMode(DOWN_PIN, INPUT_PULLUP);
pinMode(SAVE_PIN, INPUT_PULLUP);
pinMode(SETTING_PIN, INPUT_PULLUP);
pinMode(Heater_PIN_7, OUTPUT);
pinMode(FAN_PIN_8, OUTPUT);
pinMode(LED_Engine_PIN_9, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED_Day_Finished_11, OUTPUT);
pinMode(BUZZER_PIN_12, OUTPUT);
lcd.setCursor(0, 0);
lcd.print(" H - Electro");
delay(2000);
lcd.clear();
start_time = millis();
}
void check_buttons(void) {
up_state = digitalRead(UP_PIN);
down_state = digitalRead(DOWN_PIN);
save_state = digitalRead(SAVE_PIN);
setting_state = digitalRead(SETTING_PIN);
/*if (up_state == LOW && down_state == LOW) {
// Enter the reset default menu
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Reset Default");
lcd.setCursor(0, 1);
lcd.print("Press UP & DOWN");
// Wait for both UP and DOWN buttons to be released
while (digitalRead(UP_PIN) == LOW || digitalRead(DOWN_PIN) == LOW) {
delay(50);
}
// Wait for both UP and DOWN buttons to be pressed simultaneously
while (digitalRead(UP_PIN) == HIGH || digitalRead(DOWN_PIN) == HIGH) {
delay(50);
}
// Restore default settings
temp_setting = 30.0;
hum_setting = 70.0;
day_setting = 21;
engine_setting = 1;
engine_time = millis();
start_time = millis();
day_count = 0;
// Reset any other settings as needed
// Return to normal mode
setting_mode = Normal;
}*/
if (setting_state == LOW && prev_setting_state == HIGH) {
// Enter the settings menu
// Move to the next setting
setting_mode = (setting_mode + 1) % 6;
lcd.clear(); // Clear the screen when moving to the next setting
}
else if (up_state == LOW && prev_up_state == HIGH) {
// Increase the value of the currently selected setting or change sensor_type
if (setting_mode == SensorType) {
sensor_type = (sensor_type + 1) % 2;
} else {
switch (setting_mode) {
case Temperature:
temp_setting += 0.5;
break;
case Humidity:
if (sensor_type == 0) {
hum_setting += 1.0;
}
break;
case Day:
day_setting += 1;
break;
case Engine:
engine_setting = (engine_setting % 9) + 1;
break;
// Handle other cases as needed
}
}
} else if (down_state == LOW && prev_down_state == HIGH) {
// Decrease the value of the currently selected setting or change sensor_type
if (setting_mode == SensorType) {
sensor_type = (sensor_type + 1) % 2;
} else {
switch (setting_mode) {
case Temperature:
temp_setting -= 0.5;
break;
case Humidity:
if (sensor_type == 0) {
hum_setting -= 1.0;
}
break;
case Day:
day_setting -= 1;
break;
case Engine:
engine_setting = (engine_setting + 7) % 9 + 1;
break;
// Handle other cases as needed
}
}
}
prev_up_state = up_state;
prev_down_state = down_state;
prev_save_state = save_state;
prev_setting_state = setting_state;
}
void loop() {
if (sensor_type == 0) {
hum = dht.readHumidity();
temp = dht.readTemperature();
} else if (sensor_type == 1) {
// Read NTC value
int ntcValue = analogRead(NTC_PIN);
float resistance = 10000.0 / ((1023.0 / ntcValue) - 1.0);
temp = calculateTemperature(resistance); // Update the temp variable
hum = 0.0; // Set a default value or handle it based on your project requirements
}
if (temp > temp_setting + 2.0) {
heatGateServo.write(90);
digitalWrite(FAN_PIN_8, HIGH);
} else if (temp < temp_setting) {
heatGateServo.write(180);
digitalWrite(FAN_PIN_8, LOW);
}
if (isnan(temp) || isnan(hum)) {
lcd.setCursor(0, 0);
lcd.print("No Sensor Detect");
} else {
dtostrf(temp, 4, 1, tempStr);
dtostrf(hum, 2, 0, humStr);
}
unsigned long elapsedTime = millis() - start_time;
unsigned long elapsedDays = elapsedTime / (24UL * 60UL * 60UL * 1000UL);
check_buttons();
if (setting_mode == SensorType) {
lcd.setCursor(0, 0);
lcd.print("Sensor Type");
lcd.setCursor(0, 1);
lcd.print(sensor_type == 0 ? "DHT" : "NTC");
} else if (setting_mode == Temperature) {
lcd.setCursor(0, 0);
lcd.print("Temp Mode");
lcd.setCursor(0, 1);
lcd.print("T: ");
lcd.print(temp_setting);
lcd.print(" C");
} else if (setting_mode == Humidity && sensor_type == 0) {
lcd.setCursor(0, 0);
lcd.print("Humidity Mode");
lcd.setCursor(0, 1);
lcd.print("H: ");
lcd.print(hum_setting);
lcd.print(" %");
}else if (setting_mode == Humidity && sensor_type == 1) {
lcd.setCursor(0, 0);
lcd.print("Humidity Mode");
lcd.setCursor(0, 1);
lcd.print("NTC Without HUM");
}
else if (setting_mode == Day) {
lcd.setCursor(0, 0);
lcd.print("Day Mode");
lcd.setCursor(0, 1);
lcd.print("D: ");
lcd.print(day_setting);
}
else if (setting_mode == Engine) {
lcd.setCursor(0, 0);
lcd.print("Engine Mode");
lcd.setCursor(0, 1);
lcd.print("M: ");
lcd.print(engine_setting);
}
else if (setting_mode == Normal) {
// display the normal mode screen
if (sensor_type == 0){// set temp
lcd.setCursor(0, 0);
lcd.write(byte(0));
lcd.print(tempStr);
lcd.setCursor(5, 0);
lcd.write(byte(2));
lcd.print("C");
}
else if(sensor_type == 1){
lcd.setCursor(0, 0);
lcd.write(byte(0));
lcd.print(temp);
lcd.setCursor(5, 0);
lcd.write(byte(2));
lcd.print("C");
}
if (sensor_type == 0){// set Humidity
lcd.setCursor(8, 0);
lcd.write(byte(1));
lcd.print(humStr);
lcd.print("%");}
else if (sensor_type == 1){// set Humidity
lcd.setCursor(8, 0);
lcd.print("NTC");}
// Motor Time
lcd.setCursor(13, 0);
lcd.print("M");
lcd.print(":");
lcd.print(engine_setting);
// Day and counter
lcd.setCursor(0, 1);
// Calculate the elapsed time in seconds, minutes, and hours
unsigned long elapsedSeconds = elapsedTime / 1000UL;
unsigned long elapsedMinutes = elapsedSeconds / 60UL;
unsigned long elapsedHours = elapsedMinutes / 60UL;
// Display the countdown in hours:minutes:seconds
lcd.print(elapsedHours % 24, DEC);
lcd.print(":");
lcd.print(elapsedMinutes % 60, DEC);
lcd.print(":");
lcd.print(elapsedSeconds % 60, DEC);
lcd.print("(");
lcd.print(elapsedDays);
lcd.print(")");
// Display the remaining days
lcd.print(" =D");
lcd.print(day_setting); }
if (temp < temp_setting + 0.5) {
digitalWrite(Heater_PIN_7, HIGH);
} else if (temp > temp_setting - 0.5) {
digitalWrite(Heater_PIN_7, LOW);
}
if (millis() - engine_time >= engine_interval * engine_setting) {
digitalWrite(LED_Engine_PIN_9, HIGH);
delay(engine_duration);
digitalWrite(LED_Engine_PIN_9, LOW);
engine_time = millis();
} else if (day_count >= day_setting - 1) {
digitalWrite(LED_Day_Finished_11, HIGH);
}
}