#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"
#include <EEPROM.h>
#include <DHT.h>
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define pump 5
#define valve1 2
#define valve2 18
#define Buzzer 4
#define RotA 34
#define RotB 35
#define But 32
#define DHT22_PIN 26 // ESP32 pin GPIO26 connected to DHT22 sensor
DHT dht22(DHT22_PIN, DHT22);
const int BUTTON_PIN = But; // the number of the pushbutton pin
const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds
const int LONG_PRESS_TIME = 1000; // 1000 milliseco
// Variables will change:
int lastState = LOW; // the previous state from the input pin
int currentState; // the current reading from the input pin
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
bool isPressing = false;
bool isLongDetected = false;
int counter=0;
int Astate;
int LastState;
int t1;
int t2;
int t3;
int t4;
int Dur;
void setup()
{
pinMode(5, OUTPUT); //Bump
pinMode(4, OUTPUT); //Buzzer
pinMode(2, OUTPUT); // Valve 1
pinMode(18, OUTPUT); // Valve 2
pinMode(RotA, INPUT);
pinMode(RotB, INPUT);
pinMode(But, INPUT_PULLUP);
pinMode(BUTTON_PIN, INPUT_PULLUP); //Button 2
//attachInterrupt(32, Button , LOW);
lastState = digitalRead(BUTTON_PIN);
Serial.begin(9600);
dht22.begin(); //Start Humidity+Temp Sensor
///////////////////////EEPROM///////////////////////////////
/*
1- SetterTemp, حرارة التفريخ
2- HatchTemp , حراره التفقيس
3- SetterHumid , رطوبة التفريخ
4- HatchHumid , رطوبة الفقس
5- SettingDays , أيام التفري
6- HatchDays , أيام الفقس
7- MotorPerios , تردد المحرك بالدقيقه
8- FlippingTime ,بالثانية مدة التقليب
9- TempThresh , عتبة الحرارة
10- HumidThresh , عتبة الرطوبة
*/
//use 10 bytes from EEPROM
EEPROM.begin(9);
if (EEPROM.read(0)== 0 ||EEPROM.read(0)== 37.5){ //SetterTemp, حرارة التفريخ
EEPROM.write(0,37.5);
EEPROM.commit();
};
if (EEPROM.read(1)==0||EEPROM.read(1)== 37){ //HatchTemp , حراره التفقيس
EEPROM.write(1,37);
EEPROM.commit();
};
if (EEPROM.read(2)==0||EEPROM.read(2)== 52){ //SetterHumid , رطوبة التفريخ
EEPROM.write(2,52);
EEPROM.commit();
};
if (EEPROM.read(3)==0||EEPROM.read(3)== 75){ //HatchHumid , رطوبة الفقس
EEPROM.write(3,75);
EEPROM.commit();
};
if (EEPROM.read(4)==0||EEPROM.read(4)== 18){ //SettingDays , أيام التفري
EEPROM.write(4,18);
EEPROM.commit();
};
if (EEPROM.read(5)==0||EEPROM.read(5)== 3){ //HatchDays , أيام الفقس
EEPROM.write(5,3);
EEPROM.commit();
};
if (EEPROM.read(6)==0||EEPROM.read(6)== 90){ //MotorPerios , تردد المحرك بالدقيقه
EEPROM.write(6,90);
EEPROM.commit();
};
if (EEPROM.read(7)==0||EEPROM.read(7)== 10){ //FlippingTime ,بالثانية مدة التقليب
EEPROM.write(7,10);
EEPROM.commit();
};
if (EEPROM.read(8)==0||EEPROM.read(8)== 1){ //TempThresh , عتبة الحرارة %
EEPROM.write(8,5);
EEPROM.commit();
};
if (EEPROM.read(9)==0||EEPROM.read(9)== 1){ //HumidThresh , عتبة الرطوبة %
EEPROM.write(9,5);
EEPROM.commit();
};
//=================================
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display();
delay(2);
display.clearDisplay();
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(50,5);
display.print("EGG");
display.display();
display.setCursor(12,23);
display.print("INCUBATOR");
display.display();
display.setCursor(20,46);
display.setTextSize(1);
display.print("by Ahmad Alsaleh");
display.display();
delay(2000);
display.clearDisplay();
//================================
}
void loop()
{
TempAndHumid(); // function 1 : Reading and Displaying Temp and Humidity
Button();
}
void TempAndHumid(){ // شاشة عرض الحرارة و الرطوبة الحالية
// read humidity
float humi = dht22.readHumidity();
// read temperature in Celsius
float tempC = dht22.readTemperature();
// read temperature in Fahrenheit
float tempF = dht22.readTemperature(true);
// check whether the reading is successful or not
if ( isnan(tempC) || isnan(tempF) || isnan(humi)) {
Serial.println("Failed to read from DHT22 sensor!");
} else {
Serial.print("Humidity: ");
Serial.print(humi);
Serial.print("%");
Serial.print(" | ");
Serial.print("Temperature: ");
Serial.print(tempC);
Serial.print("°C ~ ");
Serial.print(tempF);
Serial.println("°F");
int Line_space = 21;
// Printing Tempruture
display.setTextSize(2);
display.setCursor(0,0);
display.print(">");
display.setCursor(11,0);
display.print("Temp");
display.display();
display.setTextSize(2);
display.setCursor(60,0);
display.print(tempC);
display.display();
// Printing Humidity
display.setTextSize(2);
display.setCursor(0,0+Line_space);
display.print(">");
display.setCursor(11,0+Line_space);
display.print("Humd");
display.display();
display.setTextSize(2);
display.setCursor(60,0+Line_space);
display.print(humi);
display.display();
// Printing Day
display.setTextSize(2);
display.setCursor(0,0+Line_space+Line_space);
display.print(">");
display.setCursor(11,0+Line_space+Line_space);
display.print("DAY#");
display.display();
display.setTextSize(2);
display.setCursor(60,0+Line_space+Line_space);
display.print("3");
display.display();
delay(1000);// wait a 1 seconds between readings
}
}
void Button() // زر التحكم
{
currentState = digitalRead(BUTTON_PIN);
int Bfunction =0;
if(lastState == HIGH && currentState == LOW) { // button is pressed
pressedTime = millis();
isPressing = true;
isLongDetected = false;
Serial.println("Pressed");
} else if(lastState == LOW && currentState == HIGH) { // button is released
isPressing = false;
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
Serial.println("Released");
}
if(isPressing == true && isLongDetected == false) {
long pressDuration = millis() - pressedTime;
if( pressDuration > LONG_PRESS_TIME ) {
Serial.println("A LONG press is detected");
Bfunction =1;
isLongDetected = true;
}
else if( pressDuration < SHORT_PRESS_TIME ){
Serial.println("A short press is detected");
Bfunction =0;
}
if(Bfunction==0) { SystemSetup();
}
else if(Bfunction==1){ ResetDays();
}
}
// save the the last state
lastState = currentState;
}
void ResetDays(){ // شاشة إعادة عد الأبام
Serial.println("RESETTING DAYS");
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(4,10);
display.print("RESET DAYS");
display.display();
display.setTextSize(2);
display.setCursor(0,50);
display.print(">");
// YES OR NO
display.setCursor(11,50);
display.print("YES"); //SetterTemp
display.display();
display.setTextSize(2);
display.setCursor(87,50);
display.print("NO");
display.display();
delay(2500);
display.clearDisplay();
}
void SystemSetup(){ // شاشة إعدادات النظام
Serial.println("SETUP MODE");
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(30,5);
display.print("SETUP");
display.display();
display.setCursor(30,23);
display.print("MODE");
display.display();
delay(1500);
display.clearDisplay();
///////////////// SETUP MODE PAGE 1
/*
1- SetterTemp, حرارة التفريخ
2- HatchTemp , حراره التفقيس
3- SetterHumid , رطوبة التفريخ
4- HatchHumid , رطوبة الفقس
5- SettingDays , أيام التفري
*/
display.clearDisplay();
int Line_space = 11;
// Printing SetterTemp
display.setTextSize(1);
display.setCursor(0,0);
display.print(">");
display.setCursor(11,0);
display.print("SetterTemp"); //SetterTemp
display.display();
display.setTextSize(1);
display.setCursor(87,0);
display.print("37.5");
display.display();
display.setTextSize(1);
display.setCursor(110,0);
display.print("C");
display.display();
// Printing HatchTemp
display.setTextSize(1);
display.setCursor(0,0+Line_space);
display.print(">");
display.setCursor(11,0+Line_space);
display.print("HatchTemp"); //HatchTemp
display.display();
display.setTextSize(1);
display.setCursor(90,0+Line_space);
display.print("37");
display.display();
display.setTextSize(1);
display.setCursor(110,0+Line_space);
display.print("C");
display.display();
// Printing SetterHumid
display.setTextSize(1);
display.setCursor(0,0+Line_space+Line_space);
display.print(">");
display.setCursor(11,0+Line_space+Line_space);
display.print("SetterHumid"); //SetterHumid
display.display();
display.setTextSize(1);
display.setCursor(90,0+Line_space+Line_space);
display.print("55");
display.display();
display.setTextSize(1);
display.setCursor(110,0+Line_space+Line_space);
display.print("%");
display.display();
// Printing HatchHumid
display.setTextSize(1);
display.setCursor(0,0+Line_space+Line_space+Line_space);
display.print(">");
display.setCursor(11,0+Line_space+Line_space+Line_space);
display.print("HatchHumid"); //HatchHumid
display.display();
display.setTextSize(1);
display.setCursor(97,0+Line_space+Line_space+Line_space);
display.print("60");
display.display();
display.setTextSize(1);
display.setCursor(110,0+Line_space+Line_space+Line_space);
display.print("%");
display.display();
// Printing SettingDays
display.setTextSize(1);
display.setCursor(0,0+Line_space+Line_space+Line_space+Line_space);
display.print(">");
display.setCursor(11,0+Line_space+Line_space+Line_space+Line_space);
display.print("SettingDays"); //SettingDays
display.display();
display.setTextSize(1);
display.setCursor(97,0+Line_space+Line_space+Line_space+Line_space);
display.print("18");
display.display();
display.setTextSize(1);
display.setCursor(110,0+Line_space+Line_space+Line_space+Line_space);
display.print("D");
display.display();
delay(1000);// wait a 1 seconds between readings
///////////////// SETUP MODE PAGE 2
/*
6- HatchDays , أيام الفقس
7- MotorPerios , تردد المحرك بالدقيقه
8- FlippingTime ,بالثانية مدة التقليب
9- TempThresh , عتبة الحرارة
10- HumidThresh , عتبة الرطوبة
*/
display.clearDisplay();
Line_space = 11;
// Printing Hatching Days
display.setTextSize(1);
display.setCursor(0,0);
display.print(">");
display.setCursor(11,0);
display.print("Hatching Days"); //Hatching Days
display.display();
display.setTextSize(1);
display.setCursor(90,0);
display.print("90");
display.display();
display.setTextSize(1);
display.setCursor(110,0);
display.print("D");
display.display();
// Printing Motor Timming
display.setTextSize(1);
display.setCursor(0,0+Line_space);
display.print(">");
display.setCursor(11,0+Line_space);
display.print("Motor Every"); //MOTOR EVERY ?
display.display();
display.setTextSize(1);
display.setCursor(90,0+Line_space);
display.print("90");
display.display();
display.setTextSize(1);
display.setCursor(110,0+Line_space);
display.print("m");
display.display();
// Printing filliping Duration
display.setTextSize(1);
display.setCursor(0,0+Line_space+Line_space);
display.print(">");
display.setCursor(11,0+Line_space+Line_space);
display.print("Flip for"); //EGG FLIIPING
display.display();
display.setTextSize(1);
display.setCursor(90,0+Line_space+Line_space);
display.print("10");
display.display();
display.setTextSize(1);
display.setCursor(110,0+Line_space+Line_space);
display.print("s");
display.display();
// Printing Temp threshold
display.setTextSize(1);
display.setCursor(0,0+Line_space+Line_space+Line_space);
display.print(">");
display.setCursor(11,0+Line_space+Line_space+Line_space);
display.print("Temp threshold "); //TEMP Threshold
display.display();
display.setTextSize(1);
display.setCursor(97,0+Line_space+Line_space+Line_space);
display.print("1");
display.display();
display.setTextSize(1);
display.setCursor(110,0+Line_space+Line_space+Line_space);
display.print("%");
display.display();
// Printing Humidity threshold
display.setTextSize(1);
display.setCursor(0,0+Line_space+Line_space+Line_space+Line_space);
display.print(">");
display.setCursor(11,0+Line_space+Line_space+Line_space+Line_space);
display.print("Humd threshold "); //TEMP Threshold
display.display();
display.setTextSize(1);
display.setCursor(97,0+Line_space+Line_space+Line_space+Line_space);
display.print("2");
display.display();
display.setTextSize(1);
display.setCursor(110,0+Line_space+Line_space+Line_space+Line_space);
display.print("%");
display.display();
delay(1000);// wait a 1 seconds between readings
display.clearDisplay();
}