#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 7
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16,2);
int on_off_switch = A0;
int Humidity_down_pin = A2;
int Heaterandfanpin = A3;
int timer_pin = A1; //pin for the timer dry button
int buzzerPin = 3;
int defaulthumiditytarget = 50;
int min_humidity_target = 20;
int maxtemp = 50;
unsigned long dry_timer = 30; //minutes
//////////////////////////////////////////////////////////////////////
//dont edit below//dont edit below//dont edit below//dont edit below//
//////////////////////////////////////////////////////////////////////
int prev_on_off_state = HIGH;
int mode = 2;
int savedtemp = 0;
int savedhum = 0;
int newhumiditytarget = 50; //default humidity target
int refresh = HIGH;
int before_timer_humidity = 30;
int timer_already_tripped = HIGH;
int temperature;
int humidity;
unsigned long time1 ; //couter to check
unsigned long time2 ; //counter to check
unsigned long saved_time2 ;
void setup() {
dht.begin();
//Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(on_off_switch, INPUT_PULLUP);
pinMode(Humidity_down_pin, INPUT_PULLUP);
pinMode(timer_pin, INPUT_PULLUP);
pinMode(Heaterandfanpin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
}
void loop() {
digitalRead(on_off_switch);
digitalRead(Humidity_down_pin);
digitalRead(timer_pin);
time2 = millis() - time1;
temperature = dht.readTemperature();
humidity = dht.readHumidity();
if(temperature >= maxtemp){
tone(buzzerPin, 3000);
} else {
noTone(buzzerPin);
}
// OFF - MODE 0
if(digitalRead(on_off_switch) == HIGH && mode != 0){ //set to mode 0 if "off"
refresh = HIGH;
prev_on_off_state = HIGH;
digitalWrite(Heaterandfanpin, LOW);
newhumiditytarget = defaulthumiditytarget;
mode = 0;
timer_already_tripped = HIGH;
}
if(digitalRead(on_off_switch) == LOW){ //if "on"
if(temperature >= maxtemp){
digitalWrite(Heaterandfanpin, LOW);
mode = 1;
}
if(prev_on_off_state == HIGH){
prev_on_off_state = LOW;
if(mode != 2){ //and its no already in mode 2
mode = 2; //put into mode 2
refresh = HIGH;
}
}
// AUTO - MODE 2 AND MODE 1
if(digitalRead(Humidity_down_pin) == LOW){ //if you press the button
if(mode != 2){ //and its no already in mode 2
mode = 2; //put into mode 2
refresh = HIGH;
}
if(newhumiditytarget > min_humidity_target){ //if the humidity above min humidity
newhumiditytarget = newhumiditytarget - 5; //subtract 5%
refresh = HIGH;
delay(500);
}
else {
newhumiditytarget = defaulthumiditytarget; //otherwise reset to default min
refresh = HIGH;
delay(500);
}
timer_already_tripped = LOW;
}
if(mode == 1 || mode == 2){ //seperately? if ever in mode 2
if(temperature <= maxtemp){
if(humidity >= newhumiditytarget){ //if high humidity
digitalWrite(Heaterandfanpin, HIGH); //turn on the heater
mode = 2;
}
else {
digitalWrite(Heaterandfanpin, LOW); //turn off the heater
mode = 1;
}
}
}
//TIMER - MODE 3
if(digitalRead(timer_pin) == LOW){
if(temperature <= maxtemp){
digitalWrite(Heaterandfanpin, HIGH);
mode = 3;
time1 = millis();
timer_already_tripped = LOW;
saved_time2 = 0;
if(newhumiditytarget != 0){ //save the non 0 value of prev humidity target
before_timer_humidity = newhumiditytarget;
newhumiditytarget = 0;
refresh = HIGH;
}
}
}
if(time2 >= dry_timer*60000 && timer_already_tripped == LOW){ //execute this once after timer elapsed
timer_already_tripped = HIGH;
newhumiditytarget = before_timer_humidity; // restore to prev humidity target
refresh = HIGH;
mode = 2;
}
}
if(savedtemp + 1 <= temperature || savedtemp -1 >= temperature){ //refresh the display only if this value changes
savedtemp = temperature;
refresh = HIGH;
}
if(savedhum + 1 <= humidity || savedhum - 1 >= humidity){ //refresh the display only if this value changes
savedhum = humidity;
refresh = HIGH;
}
if(mode == 3){ //refresh the display only if this value changes
if(time2 >= saved_time2 + 1000){
saved_time2 = time2;
refresh = HIGH;
}
}
if(refresh == HIGH){
lcd.clear();
if(mode == 0){
lcd.setCursor(0,0);
lcd.print("OFF");
lcd.setCursor(0,1);
lcd.print(temperature);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(8,1);
lcd.print(humidity);
lcd.print("%");
lcd.noBacklight();
}
if(mode == 1){
lcd.setCursor(0,0);
lcd.print("STANDBY");
lcd.setCursor(0,1);
lcd.print(temperature);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(8,1);
lcd.print(humidity);
lcd.print("%");
lcd.print((char)126);
lcd.print(newhumiditytarget);
lcd.print("%");
lcd.backlight();
}
if(mode == 2){
lcd.setCursor(0,0);
lcd.print("DRYING FILAMENT");
lcd.setCursor(0,1);
lcd.print(temperature);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(8,1);
lcd.print(humidity);
lcd.print("%");
lcd.print((char)126);
lcd.print(newhumiditytarget);
lcd.print("%");
lcd.backlight();
}
if(mode == 3){
lcd.setCursor(0,0);
lcd.print("TIMER");
lcd.setCursor(8,0);
lcd.print(dry_timer - time2/60000);
lcd.print(" min");
lcd.setCursor(0,1);
lcd.print(temperature);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(8,1);
lcd.print(humidity);
lcd.print("%");
lcd.print((char)126);
lcd.print(newhumiditytarget);
lcd.print("%");
lcd.backlight();
}
//Serial.print("Temperature:");
//Serial.println(savedtemp);
//Serial.print("Humidity:");
//Serial.print(humidity);
//Serial.println("%");
//Serial.print("Deumidify mode: ");
//Serial.println(mode);
refresh = LOW;
}
}
SETS 30 MIN TIMER @ 0% HUMIDTY
LOWERS THE HUMIDITY TARGET BY 5%
ON/OFF
(RESETS TO PREVIOUS HUMIDITY TARGET)