top of page

Egg Incubator using DHT11and Bluetooth for Android app.

Updated: Dec 29, 2022

Incubating eggs is a fun, 21-day project that can be successful with careful attention and a few special pieces of equipment. With care, vigilance and planning, you will be able to hatch baby chicks that grow up to become part of your backyard flock.

Hatching eggs at home can be a fun project for those looking to grow their backyard flocks. Incubating chicken eggs is a 21-day process and requires an egg incubator to help control temperature, humidity and egg turning.


A step-by-step guide to hatching eggs:

For hatching to occur, the eggs must be fertile. Prior to incubation, a fertilized egg can be stored for a maximum of 7 days in a cool room kept at a steady 55-60 degrees Fahrenheit (not in the refrigerator – it’s too cold!). Once the fertilized eggs are placed in the warm incubator, they may develop over the course of 21 days, with the proper incubator set-up and care.

How to set up the egg incubator

Fertile eggs can be hatched by using an egg incubator. An incubator is an enclosed structure with a fan and heater to keep eggs warm during the 21-day incubation period. Here developed using an incubator with some automatic features, such as egg turning (which is critical to chick development and to keep the chick from sticking to the inside surface of the shell) and a circulation fan to facilitate even heat distribution.

Temperature and humidity inside the incubator are critical factors for successfully hatching eggs. Suggested guidelines are as follows:

  • Optimum temperature: 38 degrees Celsius.

  • Temperature range: 37-39 degrees Celsius

  • Don’t let temperature drop below 37 degrees Celsius

  • Do not allow temps of 40 degrees Celsius to last more than a few hours

  • Double-check the incubator’s thermometer with a medical thermometer placed nearby to ensure the gauge is working properly.

  • Relative humidity, day 1-17: 50-55 percent

  • Equivalent to a wet bulb temperature of 29-30 degrees Celsius.

  • Keep water channels in the incubator full to facilitate proper humidity

  • Relative humidity, day 18-21: On day 18, raise the relative humidity to 70 percent

  • Use a hygrometer to ensure humidity levels are correct throughout the incubation period

  • Only open the incubator when necessary – doing so can let heat and humidity escape and can affect the success of the hatch.

  • Increase ventilation as embryos grow bigger, especially from days 18-21.

Keep in mind these are recommendations for hatching chicken eggs

Days 7-10: Candling eggs

Towards the middle of the incubation period at 7 to 10 days, eggs can be candled to determine if the embryos are growing properly.

If you notice broken or leaking eggs, remove them from the incubator as they are not likely to be viable and may contaminate the incubator. After candling, return eggs to the incubator and return to the day 1-24 turning schedule.

Day 1-18: Turning the eggs

After setting the eggs, the incubation process begins. An important part of this process is turning, or rotating, the eggs.

Days 18-21: Pre-hatching

By day 18, the embryo has developed into a chick and will take up most of the space in the egg. The chick is preparing to hatch. You can do a few things to best help the baby chick prepare:

  • Stop egg-turning at day 18 with the larger end of the egg facing up. At this point, the chick will position itself for hatching inside the egg.

  • Maintain a temperature of 38 degrees Celsius but increase humidity to 70 percent.

Day 21: Baby chicks start hatching

Chicks will typically hatch at day 21. If the fertilized eggs were cooled prior to incubation, the process might take a little longer. If you are at day 21 with no hatch, give the eggs a few more days.



Circuit Diagram:





For Programmed ardunio Uno & Price:


Component Required:

1. Arduino UNO R3

2. LCD 20x4

3. Bluetooth HC-05

4. Push Button - 4 nos

5.Dip switch 2

6. relay 230V/10a - 2 nos

7. Fan - 2nos

8. Servo

9. DHT11

10.LED

11. Buzzer


Connections:

The SW1 dip switch 1 selector in 5V position is Temperature Cursor selection and DIP switch GND position for Humidity Cursor selection, after selecting the mode the Push button S3 & S4 for Low value setting increment & Decrement, Push button S1 & S2 for High value setting increment & Decrement for Temperature or Humidity depends on the SW1 dip position.


The SW1 dip switch 2 Position in 5V is Egg Tray Turn on Position and Dip switch GND position is Egg tray Turn Off position.

The Tray Rotation is made for every one hour and is start initially from position 0° to 90° after a minute and start to rotation mode. First Position from 90°,135°,90°,45° repeatedly for every one hour for each angle position.


Timer function

After the 21 days the times comes to day = 0, H = 0, M =0, S = 0 and then Buzzer alert.


Installing Libraries

Easy button : you need to Download and install the Easy button library.

Dht11: you need to Download and install the Easy button library.

LiquidCrystal_I2C.h : you need to Download and install the LiquidCrystal_I2C library.


Subscribe and Download code.

Arduino code:

//Define and adding library

#include <EEPROM.h>

#include <EasyButton.h> //

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

#include <dht.h> //

#include <Servo.h>

Servo myservo; // create servo object to control a servo

int pos; // variable to store the servo position


// eeprom value

byte eeprom_value;


// timer for sensor and delay

long last_read_from_sensor = 0;

const long sensor_read_delay = 1000;


// sensor pin

#define DHT_PIN A0


// sensor setup

dht DHT;


// maximum and minimum

const int TempMin = 15;

const int TempMax = 50;

const int HumiMin = 20;

const int HumiMax = 99;


//Set to humidity/temp

const int THsetbutton = 7;

const int Traybutton = 2;

int Eggtray = 12;

int Buzzer = 11;




// first value

const int LowRange_UPButton = 3;

const int LowRange_DownButton = 4;


int T1setpoint = 25;

const int eeprom_address_TempLowValue = 0;

int H1setpoint = 40;

const int eeprom_address_HumiLowValue = 2;


// second value

const int HighRange_UPButton = 5;

const int HighRange_DownButton = 6;


int T2setpoint = 32;

const int eeprom_address_TempHighValue = 1;

int H2setpoint = 80;

const int eeprom_address_HumiHighValue = 3;




// outputs

const int Heater = 8;

//int heaterstatus;

const int Humidifier = 9;

//int humudifierstatus;



int S = 59; // downcount seconds

int M = 59; // downcount minutes

int H = 23; // downcount hours

int day = 21; // downcount day



// buttons setup

EasyButton button_first_up(LowRange_UPButton);

EasyButton button_first_down(LowRange_DownButton);

EasyButton button_second_up(HighRange_UPButton);

EasyButton button_second_down(HighRange_DownButton);


//////////////////////////////


// temperature setup

double current_temperature;

double current_humidity;


//

byte angle[] = {

B00000,

B00000,

B00100,

B00100,

B00100,

B11111,

B00000,

B00000

};

byte Humidity[] = {

B00100,

B00100,

B01010,

B01010,

B10001,

B10001,

B01010,

B00100

};

byte Thermometer[8]

{

B00100,

B01010,

B01010,

B01110,

B01110,

B11111,

B11111,

B01110

};

byte Indicator[8] = { //icon for sun

0b00000,

0b00100,

0b10101,

0b01110,

0b11111,

0b01110,

0b10101,

0b00100

};

byte Rarrow[] = {

B00000,

B00000,

B00100,

B00010,

B11111,

B00010,

B00100,

B00000

};

byte Larrow[] = {

B00000,

B00000,

B00100,

B01000,

B11111,

B01000,

B00100,

B00000

};

byte to[] = {

B00000,

B00000,

B11100,

B01000,

B01000,

B01011,

B01011,

B00000

};

void setup()

{


// write boot message on lcd

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.backlight();

// write boot message on lcd

lcd.begin(20, 4);

// set the two outputs as high

pinMode(THsetbutton, INPUT);

pinMode(Traybutton, INPUT);

pinMode(Eggtray, OUTPUT);

pinMode(Buzzer, OUTPUT);

pinMode(Heater, OUTPUT);

digitalWrite(Heater, LOW);

pinMode(Humidifier, OUTPUT);

digitalWrite(Humidifier, LOW);

myservo.attach(10); // attaches the servo on pin 9 to the servo object

// initialize serial

Serial.begin(9600);

////////////////////////////////////////////////

// load first value from eeprom

eeprom_value = EEPROM.read(eeprom_address_TempLowValue);

if(eeprom_value != 255)

{

T1setpoint = eeprom_value;

}

// load second value from eeprom

eeprom_value = EEPROM.read(eeprom_address_TempHighValue);

if(eeprom_value != 255)

{

T2setpoint = eeprom_value;

}

void loop()

{

// read buttons

button_first_up.update();

button_first_down.update();

button_second_up.update();

button_second_down.update();


int buttonState = digitalRead(Traybutton); //read the state of the button input

if (buttonState == HIGH) { //pressing the button will produce a LOW state 0V

digitalWrite(Eggtray,HIGH); //the led with turn on

{

lcd.setCursor(0,2);

lcd.print("EGG TURN:ON ");

}


} else{

digitalWrite(Eggtray,LOW); //the led with turn off

lcd.setCursor(0,2);

lcd.print("EGG TURN:OFF");

}

lcd.createChar(0, angle);

lcd.setCursor(15,2);

lcd.write(0);

///////////

lcd.createChar(1, Thermometer);

lcd.setCursor(18,0);

lcd.write(1);

lcd.createChar(2, Humidity);

lcd.setCursor(18,1);

lcd.write(2);


// increase value if it is high, if it is less than the maximum value, and the first value is less than // the second one and also similar that all code apply for Humidification

if(button_first_up.IsPushed() && T1setpoint < TempMax && T1setpoint < (T2setpoint - 1))

{

// increase first_value

if(digitalRead(THsetbutton) == HIGH)

T1setpoint++;

// write on eeprom

EEPROM.write(eeprom_address_TempLowValue, T1setpoint);

}

// decrease value if it is high and if the value is more than the minimum value

if(button_first_down.IsPushed() && T1setpoint > TempMin)

{

// decrease first_value

if(digitalRead(THsetbutton) == HIGH)

T1setpoint--;

// write on eeprom

EEPROM.write(eeprom_address_TempLowValue, T1setpoint);

}


// increase value if it is high and if it is less than the maximum value

if(button_second_up.IsPushed() == HIGH && T2setpoint < TempMax)

{

// increase second_value

if(digitalRead(THsetbutton) == HIGH)

T2setpoint++;

// write on eeprom

EEPROM.write(eeprom_address_TempHighValue, T2setpoint);

}


// decrease value if it is high, if the value is more than the minimum value and if the first value is less than the second one

if(button_second_down.IsPushed() && T2setpoint > TempMin && T1setpoint < (T2setpoint - 1))

{

// decrease second_value

if(digitalRead(THsetbutton) == HIGH)

T2setpoint--;

// write on eeprom

EEPROM.write(eeprom_address_TempHighValue, T2setpoint);

}

/////////////////////////////////////////////////////////////////////////////

// sampling of temperature and humidity after delay

if((millis() - last_read_from_sensor) > sensor_read_delay)

{

// read the temperature

int chk = DHT.read11(DHT_PIN);


switch (chk)

{

case DHTLIB_OK:

current_temperature = DHT.temperature;

current_humidity = DHT.humidity;

// turn outputs on/off according to logic

if(current_temperature <= T1setpoint)

{

// full speed

digitalWrite(Heater, HIGH);

lcd.createChar(3, Indicator);

lcd.setCursor(19,0);

lcd.write(3);

}

else if(current_temperature > T1setpoint && current_temperature < T2setpoint)

{

// half speed

digitalWrite(Heater, HIGH);

lcd.createChar(3, Indicator);

lcd.setCursor(19,0);

lcd.write(3);

}

else

{

// off

digitalWrite(Heater, LOW);

lcd.setCursor(19,0);

lcd.print(" ");

}

/////////////////////////////////////////

//////

if(current_humidity <= H1setpoint)

{

// full speed

digitalWrite(Humidifier, HIGH);

lcd.createChar(3, Indicator);

lcd.setCursor(19,1);

lcd.write(3);

}

else if(current_humidity > H1setpoint && current_humidity < H2setpoint)

{

digitalWrite(Humidifier, HIGH);

lcd.createChar(3, Indicator);

lcd.setCursor(19,1);

lcd.write(3);

}

else

{

digitalWrite(Humidifier, LOW);

lcd.setCursor(19,1);

lcd.print(" ");

}

break;

case DHTLIB_ERROR_CHECKSUM:

break;

case DHTLIB_ERROR_TIMEOUT:

break;

default:

break;

}

// set the last read as now...

last_read_from_sensor = millis();

}

//////////////////////////////////////////

///////////////////////////////////////

lcd.setCursor(0, 0);

lcd.print("T:");

lcd.print(DHT.temperature);

lcd.print((char)223);

lcd.print("C");

// lcd.print(" ");

lcd.setCursor(10,0);

lcd.print(T1setpoint);

lcd.print((char)223);

lcd.print("-");

lcd.print(T2setpoint);

lcd.print((char)223);

//lcd.print("");


lcd.setCursor(0, 1);

lcd.print("H:");

lcd.print(DHT.humidity);

lcd.print("%");

// lcd.print(" ");

lcd.setCursor(10,1);

lcd.print(H1setpoint);

lcd.print("%");

lcd.print("-");

lcd.print(H2setpoint);

lcd.print("%");

// lcd.print("");


// lcd.print(Humidifier););

/////////////////////////////////////////

//TIMER


S--;

delay(1000);

if(S<0)

{

M--;

S=59;

}

if(M<0)

{

H--;

M=59;

}

if (H < 0)

{

H = 23;

day--;

}

////////////////////////////////////

/////////////////////////////////

if (day>1 && H == 23 && M == 59 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

////////////////

if (day>1 && H == 22 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 44; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 21 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 20 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 134; pos += 1) {

myservo.write(pos);

delay(15);

}

}

///////////////////////

if (day>1 && H == 19 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 18 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 44; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 17 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 16 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 134; pos += 1) {

myservo.write(pos);

delay(15);

}

}

///////////////////////

if (day>1 && H == 15 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 14 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 44; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 13 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 12 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 134; pos += 1) {

myservo.write(pos);

delay(15);

}

}

///////////////////////

if (day>1 && H == 11 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 10 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 44; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 9 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 8 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 44; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 7 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 6 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 134; pos += 1) {

myservo.write(pos);

delay(15);

}

}

///////////////////////

if (day>1 && H == 5 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 4 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 44; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 3 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 2 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 134; pos += 1) {

myservo.write(pos);

delay(15);

}

}

///////////////////////

if (day>1 && H == 1 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 89; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

///////////////////////

if (day>1 && H == 0 && M == 0 && S == 0 && (digitalRead(Traybutton) == HIGH))

{

for (pos = 0; pos <= 44; pos += 1) {

myservo.write(pos);

delay(15);

}

lcd.setCursor(19,2);

lcd.print(" ");

}

if (day>0 && H == 0 && M == 0 && S == 0)

{

// Timer completed

digitalWrite(Buzzer, HIGH);

}

else

{

// Buzzer off

digitalWrite(Buzzer, LOW);

}


///////////////////////

lcd.setCursor(0,3);

lcd.print("Day:");

lcd.print(day);

lcd.setCursor(9,3);

lcd.print(":");

lcd.setCursor(12,3);

lcd.print(":");

lcd.setCursor(16,3);

lcd.print("LEFT");

////////////

if(H<0) { H=23; M=59; S=59; } if(M>9)

{

lcd.setCursor(10,3);

lcd.print(M);

}

else

{

lcd.setCursor(10,3);

lcd.print("0");

lcd.setCursor(11,3);

lcd.print(M);

lcd.setCursor(12,3);

lcd.print(":");

}

if(S>9)

{

lcd.setCursor(13,3);

lcd.print(S);

}

else

{

lcd.setCursor(13,3);

lcd.print("0");

lcd.setCursor(14,3);

lcd.print(S);

lcd.setCursor(15,3);

lcd.print(" ");

}

if(H>9)

{

lcd.setCursor(7,3);

lcd.print (H);

}

else

{

lcd.setCursor(7,3);

lcd.print("0");

lcd.setCursor(8,3);

lcd.print(H);

lcd.setCursor(9,3);

lcd.print(":");

}

lcd.setCursor(16,2);

lcd.print(pos);

lcd.print((char)223);


Serial.print(DHT.temperature);

Serial.print("|");

Serial.print(DHT.humidity);

Serial.print("|");

Serial.print(T1setpoint);

Serial.print("|");

Serial.print(T2setpoint);

Serial.print("|");

Serial.print(H1setpoint);

Serial.print("|");

Serial.print(H2setpoint);

Serial.print("|");

Serial.print(pos);

//Serial.print("°");

Serial.print("|");

Serial.print(digitalRead(Heater));

Serial.print("|");

Serial.print(digitalRead(Humidifier));

Serial.print("|");

Serial.print(digitalRead(Eggtray));

Serial.print("\n");

}













Android application:





App Download:





4,126 views13 comments
bottom of page