// import libraries
#include <dht11.h>
#include <avr/interrupt.h>
#include <LiquidCrystal.h>
// configure lcd display
LiquidCrystal lcd(13, 12, 11, 10, 9, 5);
// arduino pins
const int soilSensorPin = A0;
const int fanPin = 2;
const int heaterPin = 3;
const int dht11Pin = 4;
const int humidifierPin = 6;
const int humidifierSwitchPin = 7;
const int waterPumpPim = 8;
//for debugging and printing to serial command
int PRINT = 1;
//temperature threshold change
int tempChange = 2;
int humPinOn = 0;
dht11 DHT11;
// variables for sensor values
volatile float humidity;
volatile float temperature;
volatile int soilMoisture;
//setup mode for pins
void setupPins() {
pinMode(fanPin, OUTPUT);
pinMode(heaterPin, OUTPUT);
pinMode(humidifierPin, OUTPUT);
pinMode(humidifierSwitchPin, OUTPUT);
pinMode(waterPumpPim, OUTPUT);
}
//enable timer1
void enableTimers() {
TCCR1A = B00000000;
TCCR1B = B00000101;
TIMSK1 = B00000001;
TCNT1 = 0xC2F6;
}
//fucntion for timer1
void timer1Function() {
readDHT11();
readSoilMoisture();
printSensorValues();
}
// ISR for timer1
ISR(TIMER1_OVF_vect) {
timer1Function();
TCNT1 = 0xC2F6;
}
//lcd setup
void lcdSetup() {
lcd.begin(16, 2);
}
// main setup function
void setup() {
if (PRINT) {
Serial.begin(9600);
}
setupPins();
lcdSetup();
enableTimers();
int chk = DHT11.read(dht11Pin);
}
//threshold for different values
int tempratureThreshold = 100;
int humidityThreshold = 1;
int soilMoistureThreshold = 1023;
int bufferSoilMoistureThreshold = soilMoistureThreshold;
/*
function to handle serial commands
threshold can be set as
temperatureThreshold, humidityThreshold, soilMoistureThreshold
via serail command
*/
void handleSerialCommands() {
if (Serial.available() > 0) {
for (int x = 0; x < 4; x++) {
switch (x) {
case 0:
tempratureThreshold = Serial.parseFloat();
Serial.print("Temperature threshold set to ");
Serial.println(tempratureThreshold);
break;
case 1:
humidityThreshold = Serial.parseFloat();
if(humidityThreshold==0){
humidityThreshold=1;
}
Serial.print("Humidity threshold set to ");
Serial.println(humidityThreshold);
break;
case 2:
soilMoistureThreshold = Serial.parseFloat();
if (soilMoistureThreshold == 0) {
soilMoistureThreshold = 1023;
}
bufferSoilMoistureThreshold = soilMoistureThreshold;
Serial.print("Soil Moisture threshold set to ");
Serial.println(soilMoistureThreshold);
break;
}
}
while (Serial.available() > 0) {
char t = Serial.read();
}
}
}
//flags for tracking status of various components
volatile bool fanOn = false;
volatile bool heaterOn = false;
volatile bool humidiferOn = false;
volatile bool waterPumpOn = false;
//read humidity and temperature from dht11 sensor
void readDHT11() {
// int chk = DHT11.read(dht11Pin);
humidity = (float)DHT11.humidity;
temperature = (float)DHT11.temperature;
if (temperature > tempratureThreshold + tempChange) {
fanOn = true;
heaterOn = false;
Serial.println("Fan ✔");
Serial.println("------------------------------------");
Serial.println("Heater ✘");
Serial.println("------------------------------------");
} else if (temperature < tempratureThreshold - tempChange) {
fanOn = false;
heaterOn = true;
Serial.println("Fan ✘");
Serial.println("------------------------------------");
Serial.println("Heater ✔");
Serial.println("------------------------------------");
} else {
fanOn = false;
heaterOn = false;
Serial.println("Fan ✘");
Serial.println("------------------------------------");
Serial.println("Heater ✘");
Serial.println("------------------------------------");
}
if (humidity < humidityThreshold) {
humidiferOn = true;
Serial.println("Humidfier ✔");
Serial.println("------------------------------------");
} else {
humidiferOn = false;
Serial.println("Humidfier ✘");
Serial.println("------------------------------------");
}
}
//read soil moisture value
void readSoilMoisture() {
soilMoisture = analogRead(soilSensorPin);
if (soilMoisture > soilMoistureThreshold) {
waterPumpOn = true;
Serial.println("Pump ✔");
Serial.println("------------------------------------");
} else {
waterPumpOn = false;
Serial.println("Pump ✘");
Serial.println("------------------------------------");
}
}
//fucntions to turn on or off fan and heater using digitalWrite() function
void fanOnFunc() {
digitalWrite(fanPin, HIGH);
}
void heaterOnFunc() {
digitalWrite(heaterPin, HIGH);
}
void fanOffFunc() {
digitalWrite(fanPin, LOW);
}
void heaterOffFunc() {
digitalWrite(heaterPin, LOW);
}
//control fan
void controlFan() {
int chk = DHT11.read(dht11Pin);
if (fanOn) {
fanOnFunc();
} else {
fanOffFunc();
}
if (heaterOn) {
heaterOnFunc();
} else {
heaterOffFunc();
}
}
//fucntions to turn on or off humidifier using digitalWrite() function
void humidifierOnFunc() {
digitalWrite(humidifierPin, HIGH);
delay(100);
if (humPinOn == 0) {
digitalWrite(humidifierSwitchPin, HIGH);
delay(100);
digitalWrite(humidifierSwitchPin, LOW);
humPinOn = 1;
}
}
void humidifierOffFunc() {
digitalWrite(humidifierPin, LOW);
humPinOn = 0;
}
//control humidifier
void controlHumidifier() {
if (humidity < humidityThreshold) {
humidifierOnFunc();
} else {
humidifierOffFunc();
}
}
//fucntions to turn on or off water pump using digitalWrite() function
void waterPumpOnFunc() {
digitalWrite(waterPumpPim, HIGH);
delay(2000);
digitalWrite(waterPumpPim, LOW);
waterPumpOn = false;
bufferSoilMoistureThreshold = soilMoistureThreshold;
soilMoistureThreshold = 1023;
}
void waterPumpOffFunc() {
digitalWrite(waterPumpPim, LOW);
}
//control water pump
void controlWaterPump() {
if (waterPumpOn) {
waterPumpOnFunc();
} else {
waterPumpOffFunc();
}
}
//print sensor value on serial command
void printSensorValues() {
Serial.print("Temperature: ");
Serial.println(temperature, 2);
Serial.println("------------------------------------");
Serial.print("Humidity: ");
Serial.println(humidity, 2);
Serial.println("------------------------------------");
Serial.print("Soil Moisture: ");
Serial.println(soilMoisture);
Serial.println("------------------------------------");
}
// print status of components on LCD
void lcdPrint() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("FAN-");
if (fanOn) {
lcd.print("ON");
} else {
lcd.print("OFF");
}
lcd.print(" HEAT-");
if (heaterOn) {
lcd.print("ON");
} else {
lcd.print("OFF");
}
lcd.setCursor(0, 1);
lcd.print("HUM-");
if (humidiferOn) {
lcd.print("ON");
} else {
lcd.print("OFF");
}
lcd.print(" WP-");
if (waterPumpOn) {
lcd.print("ON");
} else {
lcd.print("OFF");
}
}
int soilMoistureSecCounter = 0;
//main loop
void loop() {
controlFan();
controlHumidifier();
controlWaterPump();
lcdPrint();
delay(1000);
handleSerialCommands();
soilMoistureSecCounter++;
if (soilMoistureSecCounter == 6) {
soilMoistureSecCounter = 0;
soilMoistureThreshold = bufferSoilMoistureThreshold;
}
}