/*
//Button
Select/Save
Up
Down
//rtc
Run Motor Every SetHour for motorDelay
//settings
maxTemp
minTemp
maxHumid
minHumid
Humid on & off
motor delay
motor interval
max Day
*/
#include "DHT.h"
#include <RTClib.h>
#include <Wire.h>
#include <EEPROM.h>
#include "SPI.h"
#include <LiquidCrystal_I2C.h>
#define DHTPIN 7
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
#define BUTTON_PIN A0
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int heater_relay = 5;
const int motor_relay = 6;
const int humidifier_relay = 4;
int maxHeat = 38; //remove value
int minHeat = 35;//remove value
int motor_setting;//remove value
int humid_setting = 60;//remove value
int humid_activate = 1; //remove value
//int lastButtonState;
//int eeprom_interval;
int disp = 1;//remove value
float minTemp = 37.5;
float maxTemp;
byte minHumid;
byte maxHumid;
byte motorTimer; //secs on to off state
byte motorInterval; //hours
byte maxDay;
char elapseTime[32];
//char eeprom_elapseTime[32]= EEPROM.read(7); //for computing days
char t[32];
char d[32];
//for simulation only delete after series to 1 pin all button
#define BUTTON_PIN1 A0
#define BUTTON_PIN2 A1
#define BUTTON_PIN3 A2
int lastButtonState1;
int lastButtonState2;
int lastButtonState3;
//////
int selSet; //if settings is selected
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
Wire.begin();
rtc.begin();
//eeprom_interval = EEPROM.read(0);
pinMode(motor_relay, OUTPUT);
pinMode(heater_relay, OUTPUT);
pinMode(humidifier_relay, OUTPUT);
//pinMode(BUTTON_PIN, INPUT_PULLUP); // enable the internal pull-up resistor
//lastButtonState = analogRead(BUTTON_PIN);
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
//delete after
pinMode(BUTTON_PIN1, INPUT_PULLUP); // enable the internal pull-up resistor
lastButtonState1 = digitalRead(BUTTON_PIN1);
pinMode(BUTTON_PIN2, INPUT_PULLUP); // enable the internal pull-up resistor
lastButtonState2 = digitalRead(BUTTON_PIN2);
pinMode(BUTTON_PIN3, INPUT_PULLUP); // enable the internal pull-up resistor
lastButtonState3 = digitalRead(BUTTON_PIN3);
//////////////////////////////
minTemp = EEPROM.read(0);
maxTemp = EEPROM.read(1);
minHumid = EEPROM.read(2);
maxHumid = EEPROM.read(3);
motorTimer = EEPROM.read(4); //secs on to off state
motorInterval = EEPROM.read(5); //hours
maxDay = EEPROM.read(6);
}
void loop() {
RTCmod();
button();
if (disp == 1)
{
displayrtc();
}
else if (disp == 2)
{
temp_humid();
}
}
void temp_humid()
{
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Check if any reads failed and exit early (to try again).
if (isnan(temperature) || isnan(humidity)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
lcd.setCursor(0, 0);
lcd.print(String("Heat: ") + String(temperature, 1) + String((char)223) + String("C "));
lcd.setCursor(0, 1);
lcd.print(String("Humidity: ") + String(humidity, 0) + String("%"));
lcd.setCursor(0, 2);
lcd.print("Day/s:");
//temp relay
if (maxHeat > temperature)
{
digitalWrite(heater_relay, HIGH); // Turn on
}
else if (maxHeat < temperature)
{
digitalWrite(heater_relay, LOW); // Turn off
}
// humidity relay
if (humid_activate == 1)
{
if (humidity < humid_setting )
{
digitalWrite(humidifier_relay, HIGH); // Turn on
}
else
{
digitalWrite(humidifier_relay, LOW); // Turn off
}
}
}
void button() //not working
{
int buttonState1 = digitalRead(BUTTON_PIN1);
int buttonState2 = digitalRead(BUTTON_PIN2);
int buttonState3 = digitalRead(BUTTON_PIN3);
if (lastButtonState1 != buttonState1)
{ // state changed
delay(50); // debounce time
}
if (lastButtonState2 != buttonState2)
{ // state changed
delay(50); // debounce time
}
if (lastButtonState3 != buttonState3)
{ // state changed
delay(50); // debounce time
}
if (buttonState1 == LOW) //select / save
{
}
else if (buttonState2 == LOW && disp != 0) //up/add
{
delay(100);
lcd.clear();
disp = 2;
Serial.print(disp);
}
else if (buttonState3 == LOW && disp != 0)//down/subtract
{
delay(100);
lcd.clear();
disp = 1;
Serial.print(disp);
}
if (buttonState3 == LOW && buttonState2 == LOW )
{
selSet = 1;
disp = 0;
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("HEAT SETTINGS");
// delay(5000);
}
if (buttonState3 == LOW && disp == 0)
{
minTemp = minTemp + 0.1;
lcd.setCursor(1, 2);
lcd.print(String("MIN. TEMP:") + String(minTemp));
}
else if (buttonState2 == LOW && disp == 0)
{
minTemp = minTemp - 0.1;
lcd.setCursor(1, 2);
lcd.print(String("MIN. TEMP: ") + String(minTemp));
}
if (buttonState1 == LOW)
{
settings();
}
}
void RTCmod() // okay
{
DateTime now = rtc.now();
if (now.hour() > 12) {
sprintf(t, "%02d:%02d:%02d", now.hour() - 12, now.minute(), now.second());
}
else
{
sprintf(t, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
}
sprintf(d, "%02d/%02d/%02d", now.day(), now.month(), now.year());
//Serial.println(t);
// Serial.println(d);
// delay(1000);
}
void displayrtc() //done
{
if (disp == 1)
lcd.setCursor(0, 0);
lcd.print("Automatic Incubator");
lcd.setCursor(6, 2);
lcd.print(t);
lcd.setCursor(5, 3);
lcd.print(d);
}
void settings()
{
// rtc.adjust(DateTime(year, month, date, hh, mm, ss)); //rtc set time
save_eeprom();
}
void save_eeprom()
{
Serial.println(minTemp);
EEPROM.update(0,minTemp); //0 motor interval
}