#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define DHTPIN 15
#define DHTTYPE DHT22
#define SOIL_PIN 34
#define LDR_PIN 35
#define ONE_WIRE_BUS 4
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature soilTemp(&oneWire);
String soilBucket(int v) {
if (v <= 2000) return "Dry";
if (v <= 3000) return "Moist";
if (v <= 3800) return "Wet";
return "Sat";
}
String lightBucket(int v) {
if (v <= 1000) return "Low";
if (v <= 2000) return "Med";
if (v <= 3000) return "Good";
if (v <= 3800) return "High";
return "V.High";
}
void clearLine(uint8_t row) {
lcd.setCursor(0, row);
for (int i = 0; i < 20; i++) lcd.print(' ');
lcd.setCursor(0, row);
}
unsigned long tick = 0;
void setup() {
Serial.begin(115200);
dht.begin();
soilTemp.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0); lcd.print("Smart System (Seedo)");
lcd.setCursor(0, 1); lcd.print("Initializing sensors");
lcd.setCursor(0, 2); lcd.print("DHT22 + DS18B20 +");
lcd.setCursor(0, 3); lcd.print("Moisture + LDR");
delay(1800);
}
void loop() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int moisture = analogRead(SOIL_PIN);
int lightValue = analogRead(LDR_PIN);
soilTemp.requestTemperatures();
float soilC = soilTemp.getTempCByIndex(0);
String soilCat = soilBucket(moisture);
String lightCat = lightBucket(lightValue);
clearLine(0);
if (isnan(temperature) || isnan(humidity)) {
lcd.print("DHT err. retrying...");
} else {
lcd.print("Temp:"); lcd.print((int)round(temperature)); lcd.print("C ");
lcd.print("Humid:"); lcd.print((int)round(humidity)); lcd.print("%");
}
clearLine(1);
// lcd.print("SoilT:");
// if (soilC == DEVICE_DISCONNECTED_C) {
// lcd.print("N/A");
// } else {
// lcd.print((int)round(soilC)); lcd.print("C");
// }
lcd.print("Moist:"); lcd.print(moisture);
lcd.print(" "); lcd.print(soilCat);
clearLine(2);
lcd.print("Light:"); lcd.print(lightValue);
lcd.print(" "); lcd.print(lightCat);
clearLine(3);
lcd.print("OK #"); lcd.print(++tick);
/*
Serial.print("Ambient: "); Serial.print(temperature); Serial.print("C ");
Serial.print(humidity); Serial.println("%");
Serial.print("SoilT: "); Serial.print(soilC); Serial.println("C");
Serial.print("Moisture: "); Serial.println(moisture);
Serial.print("Light: "); Serial.println(lightValue);
Serial.println("-------------------------");
*/
delay(2000);
}