#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
#define DHTPIN 13
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
DHT dht(DHTPIN, DHTTYPE);
//copy from mplabx
//#define Heater_PIN RA0
//#define Humidifyer_PIN RA1
//#define Ifan_PIN RA2
//#define Ofan_PIN RA3
//#define Dfan_PIN RA5
//#define DHT11_PIN RB0
//#define DHT11_PIN_DIR TRISB0
//char Temperature[] = "TEMP : 00 C ";
//char Humidity[] = " RH : 00 % ";
//unsigned char t, T_Byte2, h, RH_Byte2, CheckSum ;
int TmState=1;
int RhState=1;
#define Heater_PIN 6
#define Humidifyer_PIN 2
#define Ifan_PIN 3
#define Ofan_PIN 4
#define Dfan_PIN 5
float h; //humidity
float t; //temperature
void setup() {
// Init
Serial.begin(9600);
lcd.init();
lcd.backlight();
// Print something
lcd.setCursor(3, 0);
lcd.print("Hello, world!");
lcd.setCursor(2, 1);
lcd.print("Wokwi Online IoT");
lcd.setCursor(5, 2);
lcd.print("Simulator");
lcd.setCursor(7, 3);
lcd.print("Enjoy!");
dht.begin();
clearlcd();
delay(1000);
//set pinmodes
pinMode(Heater_PIN, OUTPUT);
pinMode(Humidifyer_PIN, OUTPUT);
pinMode(Ifan_PIN, OUTPUT);
pinMode(Ofan_PIN, OUTPUT);
pinMode(Dfan_PIN, OUTPUT);
}
void clearlcd(){
for (int row = 0; row < 4; row++){
for (int col = 0; col < 20; col++){
lcd.setCursor(col, row);
lcd.print(" ");
//delay(10);
// Serial.println(F("clear"));
}
}
}
void SetStates(void)
{
if (h >= 1 & h <56)
{
RhState = 0;
}
else if (h >= 56 & h <=65)
{
RhState = 1;
}
else if (h >65 & h <=100)
{
RhState = 2;
}
else
{
RhState = 3;
}
if (t >= 1 & t <= 33)
{
TmState = 0;
}
else if (t > 33 & t <= 35)
{
TmState = 1;
}
else if (t > 35 & t <=100)
{
TmState = 2;
}
else
TmState = 3;
}
void SetEquip()
{
if (TmState == 0 & RhState == 0) //Cold Dry
{
/*
digitalWrite(Heater_PIN,HIGH);
digitalWrite(Humidifyer_PIN ,HIGH);
digitalWrite(Ifan_PIN ,HIGH);
digitalWrite(Ofan_PIN,LOW);
Dfan_PIN =1;
*/
//relay is low active 0 is on ; 1 is off
digitalWrite(Heater_PIN,LOW);
digitalWrite(Humidifyer_PIN ,LOW);
digitalWrite(Ifan_PIN,LOW);
digitalWrite(Ofan_PIN,HIGH);
digitalWrite(Dfan_PIN,LOW);
}
else if (TmState == 0 & RhState == 1) //Cold Normal
{
/*
digitalWrite(Heater_PIN,HIGH);
digitalWrite(Humidifyer_PIN ,LOW);
digitalWrite(Ifan_PIN,LOW);
digitalWrite(Ofan_PIN,LOW);
Dfan_PIN =1;
*/
//relay is low active 0 is on ; 1 is off
digitalWrite(Heater_PIN,LOW);
digitalWrite(Humidifyer_PIN ,HIGH);
digitalWrite(Ifan_PIN ,HIGH);
digitalWrite(Ofan_PIN,HIGH);
digitalWrite(Dfan_PIN,LOW);
}
else if (TmState == 0 & RhState == 2)//Cold Wet
{
/*
digitalWrite(Heater_PIN,HIGH);
digitalWrite(Humidifyer_PIN ,LOW);
digitalWrite(Ifan_PIN,LOW);
digitalWrite(Ofan_PIN,LOW);
Dfan_PIN =1;
* */
//relay is low active 0 is on ; 1 is off
digitalWrite(Heater_PIN,LOW);
digitalWrite(Humidifyer_PIN ,HIGH);
digitalWrite(Ifan_PIN ,HIGH);
digitalWrite(Ofan_PIN,HIGH);
digitalWrite(Dfan_PIN,LOW);
}
else if (TmState == 1 & RhState == 0)//Normal Dry
{
/*
digitalWrite(Heater_PIN,LOW);
digitalWrite(Humidifyer_PIN ,HIGH);
digitalWrite(Ifan_PIN ,HIGH);
digitalWrite(Ofan_PIN,LOW);
digitalWrite(Dfan_PIN,HIGH);
*/
//relay is low active 0 is on ; 1 is off
digitalWrite(Heater_PIN,HIGH);
digitalWrite(Humidifyer_PIN ,LOW);
digitalWrite(Ifan_PIN,LOW);
digitalWrite(Ofan_PIN,HIGH);
digitalWrite(Dfan_PIN,LOW);
}
else if (TmState == 1 & RhState == 1)//Normal Normal
{
/*
digitalWrite(Heater_PIN,LOW);
digitalWrite(Humidifyer_PIN ,LOW);
digitalWrite(Ifan_PIN,LOW);
digitalWrite(Ofan_PIN,LOW);
digitalWrite(Dfan_PIN,HIGH);
*/
//relay is low active 0 is on ; 1 is off
digitalWrite(Heater_PIN,HIGH);
digitalWrite(Humidifyer_PIN ,HIGH);
digitalWrite(Ifan_PIN ,HIGH);
digitalWrite(Ofan_PIN,HIGH);
digitalWrite(Dfan_PIN,LOW);
}
else if (TmState == 1 & RhState == 2)//Normal Wet
{
/*
digitalWrite(Heater_PIN,LOW);
digitalWrite(Humidifyer_PIN ,LOW);
digitalWrite(Ifan_PIN,LOW);
digitalWrite(Ofan_PIN,LOW);
digitalWrite(Dfan_PIN,HIGH);
*/
//relay is low active 0 is on ; 1 is off
digitalWrite(Heater_PIN,HIGH);
digitalWrite(Humidifyer_PIN ,HIGH);
digitalWrite(Ifan_PIN ,HIGH);
digitalWrite(Ofan_PIN,HIGH);
digitalWrite(Dfan_PIN,LOW);
}
else if (TmState == 2 & RhState == 0) //Hot Dry
{
/*
digitalWrite(Heater_PIN,LOW);
digitalWrite(Humidifyer_PIN ,HIGH);
digitalWrite(Ifan_PIN ,HIGH);
digitalWrite(Ofan_PIN,HIGH);
Dfan_PIN =1;
*/
//relay is low active 0 is on ; 1 is off
digitalWrite(Heater_PIN,HIGH);
digitalWrite(Humidifyer_PIN ,LOW);
digitalWrite(Ifan_PIN,LOW);
digitalWrite(Ofan_PIN,LOW);
digitalWrite(Dfan_PIN,LOW);
}
else if (TmState == 2 & RhState == 1)//Hot Normal
{
/*
digitalWrite(Heater_PIN,LOW);
digitalWrite(Humidifyer_PIN ,LOW);
digitalWrite(Ifan_PIN ,HIGH);
digitalWrite(Ofan_PIN,HIGH);
digitalWrite(Dfan_PIN,HIGH);
*/
//relay is low active 0 is on ; 1 is off
digitalWrite(Heater_PIN,HIGH);
digitalWrite(Humidifyer_PIN ,HIGH);
digitalWrite(Ifan_PIN,LOW);
digitalWrite(Ofan_PIN,LOW);
digitalWrite(Dfan_PIN,LOW);
}
else if (TmState == 2 & RhState == 2)//Hot Wet
{
/*
digitalWrite(Heater_PIN,LOW);
digitalWrite(Humidifyer_PIN ,LOW);
digitalWrite(Ifan_PIN ,HIGH);
digitalWrite(Ofan_PIN,HIGH);
digitalWrite(Dfan_PIN,HIGH);
*/
//relay is low active 0 is on ; 1 is off
digitalWrite(Heater_PIN,HIGH);
digitalWrite(Humidifyer_PIN ,HIGH);
digitalWrite(Ifan_PIN,LOW);
digitalWrite(Ofan_PIN,LOW);
digitalWrite(Dfan_PIN,LOW);
}
else //Error
{
/*
Heater_PIN =0;
Humidifyer_PIN =0;
digitalWrite(Ifan_PIN ,LOW);
digitalWrite(Ofan_PIN,LOW);
digitalWrite(Dfan_PIN,LOW);
*/
//relay is low active 0 is on ; 1 is off
digitalWrite(Heater_PIN,HIGH);
digitalWrite(Humidifyer_PIN ,HIGH);
digitalWrite(Ifan_PIN ,HIGH);
digitalWrite(Ofan_PIN,HIGH);
digitalWrite(Dfan_PIN,HIGH);
}
}
void DisplayStats()
{
clearlcd();
lcd.setCursor(2, 0);
if (TmState==0) lcd.print("Cold ");
if(TmState==1) lcd.print("Normal ");
if(TmState==2) lcd.print("Hot ");
if(TmState==3) lcd.print("Error ");
lcd.setCursor(11, 0);
if (RhState==0) lcd.print("Dry");
if(RhState==1) lcd.print("Normal");
if(RhState==2) lcd.print("Wet");
if(RhState==3) lcd.print("Error");
lcd.setCursor(1, 1);
if (Heater_PIN==HIGH)
{
lcd.print("Heat OFF");
}
else if (Heater_PIN==0)
{
lcd.print("Heat ON");
}
else
{
lcd.print("Heat=xx");
Serial.print(Heater_PIN);
}
if (Humidifyer_PIN==HIGH)
{
lcd.print("Hdt=OFF ");
}
else if (Humidifyer_PIN==0)
{
lcd.print("Hdt=ON ");
}
else
{
lcd.print("Hdt=xx ");
Serial.print(Humidifyer_PIN);
}
delay(2000);
clearlcd;
lcd.setCursor(1, 2);
if (Ifan_PIN==HIGH)
{
lcd.print("IF=OFF ");
}
else if (Ifan_PIN==0)
{
lcd.print("IF=ON ");
}
else
{
lcd.print("IF=xx ");
Serial.print(Ifan_PIN);
}
if (Ofan_PIN==HIGH)
{
lcd.print("OF=OFF ");
}
else if (Ofan_PIN==0)
{
lcd.print("OF=ON ");
}
else
{
lcd.print("OF=xx ");
Serial.print(Ofan_PIN);
}
lcd.setCursor(5, 3);
if (Dfan_PIN==HIGH)
{
lcd.print("DF=OFF");
}
else if (Dfan_PIN==0)
{
lcd.print("DF=ON");
}
else
{
lcd.print("DF=xx ");
Serial.print(Dfan_PIN);
}
}
void loop() {
// Wait a few seconds between measurements.
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
h = dht.readHumidity();
// Read temperature as Celsius (the default)
t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
lcd.setCursor(1, 0);
lcd.print("Humidity: ");
lcd.print(h);
lcd.print(" %");
lcd.setCursor(1, 1);
lcd.print("Temperature: ");
lcd.print(t);
//lcd.print("°C ");
lcd.setCursor(1, 2);
lcd.print("Heat Index: ");
lcd.print(hic);
delay(2000);
SetStates();
SetEquip();
DisplayStats();
delay(2000);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
}