#define BLYNK_TEMPLATE_ID "TMPL6kf3LaBe-"
#define BLYNK_TEMPLATE_NAME "EGG Incubator"
#define BLYNK_AUTH_TOKEN "W4KV_BqWRkb3mHQ_jhNZS7-3AYd-xvTB"
#include <MillisTimerLib.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
//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;
float set_temp = 37.5;
//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;
int SW_State_VF = 0;
//Blynk Function
BLYNK_WRITE (V4)
{
SW_State_VF = param.asInt();
if (SW_State_VF == 1)
{
digitalWrite (VF_3, HIGH);
digitalWrite (VF_4, LOW);
}
else if (minutes % 60 > 2 && SW_State_VF == 0) {
digitalWrite (VF_3, LOW);
digitalWrite (VF_4, LOW);
}
}
BLYNK_WRITE (V5)
{
set_temp = param.asInt();
}
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);
Blynk.begin(auth, ssid, pass);
//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() {
Blynk.run();
timer.run();
//Temperature
sensorDs18b20.update();//Temperature Sensor Updates
//Invoked at every sensor reading (TIME_INTERVAL milliseconds)
//Time
minutes = (Egg_turn_time.timerCount() / 1000) / 60;
Blynk.virtualWrite(V2, 120 - minutes);
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;
Blynk.virtualWrite(V3, 20 - int(day));
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 && SW_State_VF == 0) {
digitalWrite (VF_3, HIGH);
digitalWrite (VF_4, LOW);
}
else if (minutes % 60 > 2 && SW_State_VF == 0) {
digitalWrite (VF_3, LOW);
digitalWrite (VF_4, LOW);
}
}
void dhtreading()
{
//DHT Reading
float h = dht.readHumidity();
t = dht.readTemperature();
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V1, h);
lcd.setCursor(10, 0);
lcd.print("Rh-");
lcd.print(int(h));
lcd.print("%");
}
void handleIntervalElapsed(float temperature, bool valid, int deviceIndex)
{
temp = temperature;
//Blynk.virtualWrite(V0, temp);
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 > set_temp + 0.5) {
digitalWrite(heat, LOW);
}
if (t < set_temp - 0.5)
{
digitalWrite(heat, HIGH);
digitalWrite(bzr, LOW);
}
if (t > set_temp + 1) {
digitalWrite(bzr, HIGH);
}
}