/*
Alex's ESP GreenHouse
- Device name - Pin Name - Pin No
============================================
- SCL - SCL - GIOP22
- SDA - SDA - GIOP21
- DHT11 - 15 - GIOP15
- Dayligt monitoring - ADC0 - GPIO36
- SoilHumiditySensor01 - ADC3 - GPIO39
- SoilHumiditySensor02 - ADC6 - GPIO34
- Too Much Sun SensorsB - ADC7 - GPIO35
- HatchMotor Relay - 2 - GPIO02
- Water Pump Relay - 4 - GPIO04
- MistMaker Relay - RX2 - GPIO16
- Heater Relay - TX2 - GPIO17
- Grow Light Relay - 4 - GPIO05
Todo: Fans relay
Change LDR fubtionality to too much light
LowWaterLevel sensors and alarm
Add a display button
consider a shiftRegister for the relays
0.01 - Basic setup
0.10 - LCD
0.20 - DHT22 + Night Icon
0.30 - LDR 01
0.40 - Soil Humidity Sensors (Simulator)
0.50 - LDR controller
0.60 - Hatch Servo motor
0.70 - Pump1, Pump2, Heater Realys and LEDs
*/
float ver = 0.70;
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "DHTesp.h"
#include <ESP32Servo.h>
const int servoPin = 5;
#define LDR1 A0 //Day Light Sensor
#define SHS01 A6 //Doil Humidity Sensor 01
#define SHS02 A3 //Doil Humidity Sensor 01
#define hatchOpend 18 //Hatch state LED indicator
#define hatchClosed 19 //Hatch state LED indicator
#define pump1 2
#define p1NOT 4
#define pump2 16
#define p2NOT 17
#define heater 12
#define NOTheater 14
const int DHT_PIN = 15;
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo servo;
String tmpC;
String hum;
int lightLevel;
int SoilHum01Level;
int SoilHum02Level;
int tomatA;
int tomatB;
int pos;
byte crescentMoon[8] = {
B00011,
B00110,
B01100,
B01100,
B01100,
B00110,
B00011,
B00000
};
void setup() {
/*
Serial.begin(115200);
Serial.println("Hello, Neta!");
Serial.print("Welcome to CAGH version: ");
Serial.print(ver);
*/
servo.attach(servoPin, 500, 2400);
pinMode(LDR1, INPUT);
pinMode(SHS01, INPUT);
pinMode(hatchOpend, OUTPUT);
pinMode(hatchClosed, OUTPUT);
pinMode(pump1, OUTPUT);
pinMode(p1NOT, OUTPUT);
pinMode(pump2, OUTPUT);
pinMode(p2NOT, OUTPUT);
pinMode(heater, OUTPUT);
pinMode(NOTheater, OUTPUT);
lcd.init();
lcd.createChar(0, crescentMoon);
lcd.clear();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("CAMP-ARDUINO present");
lcd.setCursor(7, 1);
lcd.print("NETA'S");
lcd.setCursor(4, 2);
lcd.print("GREEN HOUSE");
lcd.setCursor(4, 3);
lcd.print("Version: ");
lcd.setCursor(12, 3);
lcd.print(ver);
for (pos = 0; pos <= 180; pos += 1) {
servo.write(pos);
delay(15);
}
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
delay(3500);
lcd.setCursor(16, 0);
lcd.print(" ");
lcd.setCursor(4, 2);
lcd.print(" ");
lcd.setCursor(4, 3);
lcd.print(" ");
for (pos = 180; pos >= 0; pos -= 1) {
servo.write(pos);
delay(15);
}
}
void loop() {
lightLevel = analogRead(LDR1);
SoilHum01Level = analogRead(SHS01);
SoilHum02Level = analogRead(SHS02);
tomatA = map(SoilHum01Level, 0, 4095, 100, 0);
tomatB = map(SoilHum02Level, 0, 4095, 100, 0);
TnH();
ShL();
lcd.setCursor(0, 3);
lcd.print("It's: ");
if(lightLevel < 2024){
lcd.setCursor(7, 3);
// Display the custom character
lcd.write(byte(0)); // Use lcd.write(byte(0)) to display the custom character
lcd.setCursor(9, 3);
lcd.print("Night Time");
}
if(lightLevel >= 2024){
lcd.setCursor(7, 3);
// Display the custom character
lcd.print("*"); // Use lcd.write(byte(0)) to display the custom character
lcd.setCursor(9, 3);
lcd.print(" Day Time");
}
}
//LightDependentRsistor Controller
/*
void ldrC(){
if(fxTrk == 1){
lcd.setCursor(0, 3);
lcd.print("It's: ");
if(lightLevel < 2024){
lcd.setCursor(7, 3);
// Display the custom character
lcd.write(byte(0)); // Use lcd.write(byte(0)) to display the custom character
lcd.setCursor(9, 3);
lcd.print("Night Time");
}
if(lightLevel >= 2024){
lcd.setCursor(7, 3);
// Display the custom character
lcd.print("*"); // Use lcd.write(byte(0)) to display the custom character
lcd.setCursor(9, 3);
lcd.print("Day Time");
}
}
}
*/
//SoilHumidityLevel
void ShL(){
//lcd.clear();
lcd.setCursor(1, 0);
lcd.print("NETA'S GREEN-HOUSE");
lcd.setCursor(2, 1);
lcd.print("PLANT 1 PLANT 2");
lcd.setCursor(0, 2);
lcd.print(" ");
if(tomatA<10){
lcd.setCursor(4, 2);
lcd.print(tomatA);
lcd.setCursor(5, 2);
lcd.print(" % ");
}
else if(tomatA >= 10 && tomatA<100){
lcd.setCursor(3, 2);
lcd.print(tomatA);
lcd.setCursor(5, 2);
lcd.print(" % ");
}
else{
lcd.setCursor(3, 2);
lcd.print(tomatA);
lcd.setCursor(6, 2);
lcd.print(" %");
}
if(tomatB<10){
lcd.setCursor(14, 2);
lcd.print(tomatB);
lcd.setCursor(15, 2);
lcd.print(" %");
}
else if(tomatB >= 10 && tomatB<100){
lcd.setCursor(14, 2);
lcd.print(tomatB);
lcd.setCursor(16, 2);
lcd.print(" %");
}
else{
lcd.setCursor(13, 2);
lcd.print(tomatB);
lcd.setCursor(17, 2);
lcd.print("%");
}
lcd.setCursor(0, 3);
lcd.print("It's: ");
if(lightLevel < 2024){
lcd.setCursor(7, 3);
// Display the custom character
lcd.write(byte(0)); // Use lcd.write(byte(0)) to display the custom character
lcd.setCursor(9, 3);
lcd.print("Night Time");
}
if(lightLevel >= 2024){
lcd.setCursor(7, 3);
// Display the custom character
lcd.print("*"); // Use lcd.write(byte(0)) to display the custom character
lcd.setCursor(9, 3);
lcd.print(" Day Time");
}
delay(3000);
lcd.setCursor(0, 2);
lcd.print(" ");
if(tomatA < 30){
digitalWrite(pump1, HIGH);
digitalWrite(p1NOT, LOW);
}else {
digitalWrite(pump1, LOW);
digitalWrite(p1NOT, HIGH);
}
if(tomatB < 30){
digitalWrite(pump2, HIGH);
digitalWrite(p2NOT, LOW);
}else {
digitalWrite(pump2, LOW);
digitalWrite(p2NOT, HIGH);
}
}
//Temperature and Humidity
void TnH(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
tmpC = String(data.temperature, 2);
hum = String(data.humidity, 1);
int tmpB = tmpC.toInt();
//Conditions for Hatch Servo
if (tmpB >= 26){
servo.write(180);
digitalWrite(hatchOpend, HIGH);
digitalWrite(hatchClosed, LOW);
}else{
servo.write(0);
digitalWrite(hatchOpend, LOW);
digitalWrite(hatchClosed, HIGH);
}
if (tmpB < 15){
digitalWrite(heater, HIGH);
digitalWrite(NOTheater, LOW);
}else {
digitalWrite(heater, LOW);
digitalWrite(NOTheater, HIGH);
}
//lcd.clear();
lcd.setCursor(1, 0);
lcd.print("NETA'S GREEN-HOUSE");
lcd.setCursor(2, 1);
lcd.print("TEMP c HUMID %");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(2, 2);
lcd.print(tmpC);
lcd.setCursor(13, 2);
lcd.print(hum);
lcd.setCursor(17, 2);
lcd.print(" ");
delay(3000);
}