/* Arduino example code for DHT11, DHT22/AM2302
and DHT21/AM2301 temperature and humidity sensors
with I2C LCD. More info: www.www.makerguides.com */
#include "Adafruit_Sensor.h"
#include "DHT.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
// Set DHT pin:
#define DHTPIN 2
// Define SDA and SCL pin for LCD:
#define SDAPin A4 // Data pin
#define SCLPin A5 // Clock pin
// Set DHT type, uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered):
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4); //Change to (0x27,20,4) for 2004 LCD
//Declaration for Humidity & Heat
float SetTem = 38.0;//Default Set Temperature
float AlarmTemp=39.0;//Default High Temperature Value
float AlarmHumi=60.0;//Default High Humidity Value
float h = 0.00;//Declaration for Humidity
float t = 0.00;//Declaration for Temperature in Degree Celcius(Default)
float f = 0.00;//Declaration for Temperature in Fahrenheit
float hif = 0.00; // Declaration for heat index in Fahrenheit (default)
float hic = 0.00; // Declaration for heat index in Celsius
String Alarm="Working";//Declaration for Alarm when Temperature or Humidity is high or low
//Set Main Temperature
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
int analogValue = analogRead(A0);
//=============For Button Declaration==============================
int menuBut=13;//pin for Menu Button
int plusBut=11;//pin for Plus Button
int minusBut=12;//pin for Minus Button
int but_State=0;//Button State value
int mem_menu=0;//value for menu button memory
int mem_plus=0;//value for plus button memory
int mem_minus=0;//value for minus button memory
int pageNumb=1;//value for pageNumb
int pageLimit=3;//value for page number
int OnDelay=10000;
int Count=1;//variable for number of times used
//Relays Declaration
int R1=4; //Heater relay assign to pin 4
int R2=5; //Extraction fan relay assign to pin 5(High humidity & High temperature)
//Set button description----------------------------
void setup() {
// Setup sensor:
dht.begin();
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(menuBut, INPUT);
pinMode(plusBut, INPUT);
pinMode(minusBut, INPUT);
// Initiate the LCD:
lcd.init();
lcd.backlight();
lcd.setCursor(0, 2);
lcd.print(mem_menu);
digitalWrite(R1, LOW);//Set heater to Off
digitalWrite(R2, LOW);//Set Extractor to off
delay(500);
}
void loop() {
// Wait a few seconds between measurements:
//delay(500);
ReadMainTemp();
Button_Push();
if (pageNumb==1) {Page1();}
if (pageNumb==2) {Page2();}
//Turn On/Off Heater
if (t<SetTem) {
lcd.setCursor(0, 2);
Alarm="Heater On ";
digitalWrite(R1, HIGH);
}else {
//lcd.setCursor(0, 2);
//lcd.print("Heater Off");
digitalWrite(R1, LOW);
}
//Turn On or Off Extractor for High or Low Temperature
if (t>=AlarmTemp) {
lcd.setCursor(0, 2);
Alarm="Temp High ";
digitalWrite(R2, HIGH);
loop();//bypass checking if humidity is high or low
}else {
//lcd.setCursor(0, 2);
//lcd.print("Extractor Off");
digitalWrite(R2, LOW);
}
//Turn On or Off Extractor for High or Low Humidity
if (h>=AlarmHumi) {
lcd.setCursor(0, 2);
Alarm="Humid High ";
digitalWrite(R2, HIGH);
}else {
//lcd.setCursor(0, 2);
//lcd.print("Extractor Off");
digitalWrite(R2, LOW);
}
}
void Button_Push(){
//read menu button
but_State=digitalRead(menuBut);//Button State for when any button is pressed
if((but_State != mem_menu) && (but_State==HIGH)){pageNumb++;lcd.clear();}
if(pageNumb >= pageLimit){pageNumb = 1;}
mem_menu=but_State;//give menu button memory the value of button state
//read plus button
//but_State=digitalRead(plusBut);//Button State for when any button is pressed
//if((but_State != mem_plus) && (but_State==HIGH) && (pageNumb==1)){lcd.clear();}
//mem_plus=but_State;//give menu button memory the value of button state
//read Minus button
//but_State=digitalRead(minusBut);//Button State for when any button is pressed
//if((but_State != mem_minus) && (but_State==HIGH) && (pageNumb==1)){lcd.clear();}
//mem_minus=but_State;//give menu button memory the value of button state
}
void ReadMainTemp()//Read Main Temperature
{
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
// Read the humidity in %:
h = dht.readHumidity();
// Read the temperature as Celsius:
t = dht.readTemperature();
// Read the temperature as Fahrenheit:
f = dht.readTemperature(true);
// Compute heat index in Fahrenheit (default):
hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
hic = dht.computeHeatIndex(t, h, false);
}
void Page1()
{
// Print the temperature and the humidity on the LCD:
lcd.setCursor(0, 0);//(column_index, row_index)
lcd.print("MainTemp: ");
lcd.print(t);
lcd.print(" " "\xDF" "C ");
lcd.setCursor(0, 1);//(column_index, row_index)
lcd.print("Humid: ");
lcd.print(h);
lcd.print(" %");
lcd.setCursor(0, 3);//(column_index, row_index)
lcd.print(Alarm);
}
void Page2()
{
lcd.setCursor(0, 0);//(column_index, row_index)
lcd.print("Set High Temp CutOff");
lcd.setCursor(0, 1);//(column_index, row_index)
lcd.print(pageNumb);
lcd.setCursor(0, 2);//(column_index, row_index)
lcd.print(menuBut);
lcd.setCursor(0, 3);//(column_index, row_index)
lcd.print(but_State);
}
void ReadTemperature()
{
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
}