#include <LiquidCrystal_I2C.h>
#include <dht.h>
dht DHT;
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define DHTsensor 4
#define light_sensor A0
#define lm35 A1
#define moisture_sensor A2
#define water_sensor A3
#define lamp 13
#define fan 12
#define pump 11
int timer1;
int light, moisture;
byte temp_sign[] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};

void setup() {
  lcd.init();
  lcd.backlight();

  pinMode(lamp, OUTPUT);
  pinMode(fan, OUTPUT);
  pinMode(pump, OUTPUT);

  lcd.createChar(0, temp_sign);

  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Automatic greenhouse");
  lcd.setCursor(4, 2);
  lcd.print("by Storozhuk");
  delay(2000);
  lcd.clear();
}

void loop() {
  if (millis() - timer1 >= 1000) {
    timer1 = millis();

    humiditySensor();
    tempSensor();
    lightSensor();
    moistureSensor();

    fanFunction();
    pumpFunction();
    lampFunction();
    waterSensor();
  }
}

void fanFunction() {
  lcd.setCursor(1, 2);
  lcd.print("Fan:");
  if (DHT.humidity >= 30) {
    digitalWrite(fan, LOW);
    lcd.setCursor(5, 2);
    lcd.print("on ");
  } else {
    digitalWrite(fan, HIGH);
    lcd.setCursor(5, 2);
    lcd.print("off");
  }
}

void pumpFunction() {
  lcd.setCursor(1, 3);
  lcd.print("Pump:");
  if (moisture <= 30) {
    digitalWrite(pump, LOW);
    lcd.setCursor(6, 3);
    lcd.print("on  ");
  } else {
    digitalWrite(pump, HIGH);
    lcd.setCursor(6, 3);
    lcd.print("off");
  }
}

void lampFunction() {
  lcd.setCursor(10, 3);
  lcd.print("Lamp:");
  if (light <= 25) {
    digitalWrite(lamp, HIGH);
    lcd.setCursor(15, 3);
    lcd.print("on ");
  } else {
    digitalWrite(lamp, LOW);
    lcd.setCursor(15, 3);
    lcd.print("off");
  }
}

void humiditySensor() {
  int chk = DHT.read11(DHTsensor);
  lcd.setCursor(1, 1);
  lcd.print("Humid:");
  lcd.setCursor(7, 1);
  lcd.print(DHT.humidity);
  lcd.setCursor(9, 1);
  lcd.print("%");
  lcd.setCursor(10, 1);
  lcd.print(" ");
}

void tempSensor() {
  int temp_adc = analogRead(lm35);
  float temp = (temp_adc * 4.88);
  temp = (temp / 10);
  lcd.setCursor(1, 0);
  lcd.print("Temp:");
  lcd.setCursor(6, 0);
  lcd.print(temp);
  lcd.setCursor(8, 0);
  lcd.write(byte(0));
  lcd.setCursor(9, 0);
  lcd.print("C");
  lcd.setCursor(10, 0);
  lcd.print(" ");
}

void lightSensor() {
  light = analogRead(light_sensor);
  light = map(light, 0, 1023, 100, 0);
  lcd.setCursor(11, 1);
  lcd.print("Light:");
  lcd.setCursor(17, 1);
  lcd.print(light);
}

void moistureSensor() {
  moisture = analogRead(moisture_sensor);
  moisture = map(moisture, 0, 900, 0, 100);
  lcd.setCursor(11, 0);
  lcd.print("Soil:");
  if (moisture < 30) {
    lcd.setCursor(16, 0);
    lcd.print("dry");
  } else {
    lcd.setCursor(16, 0);
    lcd.print(moisture);
    lcd.setCursor(18, 0);
    lcd.print(" ");
  }
}

void waterSensor() {
  int water = analogRead(water_sensor);
  water = map(water, 0, 900, 0, 100);
  lcd.setCursor(9, 2);
  lcd.print("Water:");
  if (water < 30) {
    lcd.setCursor(15, 2);
    lcd.print("none");
  } else {
    lcd.setCursor(15, 2);
    lcd.print("full");
  }
}
$abcdeabcde151015202530fghijfghij
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module