#include <MillisTimerLib.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//Humidity
#include "DHT.h"
#define DHTPIN 26
DHT dht(DHTPIN, DHT22);
//Temperature
#include <OneWire.h>
#include <DallasTemperature.h>
#include <NonBlockingDallas.h> //Include the NonBlockingDallas library
#define ONE_WIRE_BUS 25 //PIN of the Maxim DS18B20 temperature sensor
#define TIME_INTERVAL 500 //Time interval among sensor readings [milliseconds]
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature dallasTemp(&oneWire);
NonBlockingDallas sensorDs18b20(&dallasTemp); //Create a new instance of the NonBlockingDallas class
float t;
float temp;
int heat = 27;
int bzr = 14;
//Turning & Timer
int TM_1 = 18;
int TM_2 = 17;
MillisTimerLib Egg_turn_time(120 * 60 * 1000);
int minutes = 0;
int seconds = 0;
unsigned long day;
bool status = 0;
//Ventilation
int VF_3 = 16;
int VF_4 = 4;
void setup() {
// put your setup code here, to run once:
lcd.init();
lcd.backlight();
pinMode (TM_1, OUTPUT);
pinMode (TM_2, OUTPUT);
pinMode (VF_3, OUTPUT);
pinMode (VF_4, OUTPUT);
pinMode (heat, OUTPUT);
pinMode (bzr, OUTPUT);
Serial.begin(115200);
minutes = EEPROM.read(206);
status = EEPROM.read(207);
//Initialize the sensor passing the resolution, unit of measure and reading interval [milliseconds]
sensorDs18b20.begin(NonBlockingDallas::resolution_12, NonBlockingDallas::unit_C, TIME_INTERVAL);
//Callbacks
sensorDs18b20.onIntervalElapsed(handleIntervalElapsed);
}
void loop() {
//Temperature
sensorDs18b20.update();//Temperature Sensor Updates
//Invoked at every sensor reading (TIME_INTERVAL milliseconds)
//Time
minutes = (Egg_turn_time.timerCount() / 1000) / 60;
if (minutes % 5 == 0 && minutes != 0)
{
EEPROM.write(206, minutes); //safe limit for eeprom
}
seconds = (Egg_turn_time.timerCount() / 1000) % 60;
lcd.setCursor(0, 1);
lcd.print("Turn-");
lcd.print(120 - minutes);
lcd.print(":");
lcd.print(60 - seconds);
lcd.print(" ");
if (seconds == 10) {
lcd.print(" ");
}
//HATCH DAY
day = minutes / 1440;
lcd.setCursor(12, 1);
lcd.print("H-");
lcd.print(20 - int(day));
//Egg Turning
//Serial.print("Counter value: ");
//Serial.println(minutes);
if (Egg_turn_time.timer()) {
status = !status;
EEPROM.write(207, status);
egg_turning();
}
ventilation(); //Ventilation Fan
dhtreading();
temp_fn();
}
void egg_turning()
{
//Right Turn
if (status == 1) {
digitalWrite (TM_1, HIGH);
digitalWrite (TM_2, LOW);
delay(1000);
digitalWrite (TM_1, LOW);
digitalWrite (TM_2, LOW);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Turning Egg CCW");
digitalWrite(bzr, HIGH);
Egg_turn_time.reset();
}
//Left Turn
if (status == 0) {
digitalWrite (TM_1, LOW);
digitalWrite (TM_2, HIGH);
delay(1000);
digitalWrite (TM_1, LOW);
digitalWrite (TM_2, LOW);
//Show on LCD
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Turning Egg CW");
digitalWrite(bzr, HIGH);
Egg_turn_time.reset();
}
}
void ventilation()
{
if (minutes % 60 <= 2) {
digitalWrite (VF_3, HIGH);
digitalWrite (VF_4, LOW);
}
else {
digitalWrite (VF_3, LOW);
digitalWrite (VF_4, LOW);
}
}
void dhtreading()
{
//DHT Reading
float h = dht.readHumidity();
t = dht.readTemperature();
lcd.setCursor(10, 0);
lcd.print("Rh-");
lcd.print(int(h));
lcd.print("%");
}
void handleIntervalElapsed(float temperature, bool valid, int deviceIndex)
{
temp = temperature;
Serial.print("Sensor ");
Serial.print(deviceIndex);
Serial.print(" temperature: ");
Serial.print(temperature);
Serial.println(" °C");
}
void temp_fn()
{
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temp);
lcd.print((char)223);
lcd.print("C");
if (t > 37.85) {
digitalWrite(heat, LOW);
}
if (t < 37.3)
{
digitalWrite(heat, HIGH);
digitalWrite(bzr, LOW);
}
if (t > 38.5) {
digitalWrite(bzr, HIGH);
}
}