#include <Wire.h>
#include "LCD.h";
#include <LiquidCrystal.h>
#include <DHT.h>
#include "Servo_ESP32.h"
#if CONFIG_FREERTOS_UNICORE
static const BaseType_t app_cpu = 0;
#else
static const BaseType_t app_cpu = 1;
#endif
LiquidCrystal lcd(13, 12, 14, 27, 26, 25);
//Temperature sensor
#define DHTPIN 23
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
float h, t;
String Degrees = " *C & ";
String Percentage = "%";
//LED pin
const int LED1=18;
const int LED2=2;
const int LED3=19;
//LDR PIN
const int LDR1=2;
const int LDR2=4;
const int LDR3=15;
int ldr1;
int ldr2;
int ldr3;
int ldrThreshold = 100;
int led1State;
//Ultrasonic & servo
const int trig = 33;
const int echo = 32;
const int servoPin = 5;
Servo_ESP32 servo1;
#define SOUND_SPEED 0.034
long duration;
float distance;
int tinggiBak;
int column = 0;
int currentState = 'MainMenu';
void setup() {
Serial.begin(115200);
servo1.attach(servoPin);
lcd.begin(16, 2);
dht.begin();
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
xTaskCreatePinnedToCore( // Use xTaskCreate() in vanilla FreeRTOS
report, // Function to be called
"Report Sensor", // Name of task
1024, // Stack size (bytes in ESP32, words in FreeRTOS)
NULL, // Parameter to pass to function
0, // Task priority (0 to configMAX_PRIORITIES - 1)
NULL, // Task handle
app_cpu);
}
void loop() {
switch(currentState) {
case 'MainMenu': {
lcd.setCursor(3, 0);
lcd.print("*WELLCOME*");
lcd.setCursor(0, 1);
lcd.print("STARTING SENSOR");
delay(1000);
currentState = 'temperature';
break;
}
case 'temperature': {
delay(2000);
lcd.clear();
h = dht.readHumidity();
t = dht.readTemperature();
lcd.setCursor(0, 0);
lcd.print("Reading T & H");
String Stringcomb = t + Degrees + h + Percentage;
lcd.setCursor(0, 1);
lcd.print(Stringcomb);
delay(3000);
lcd.clear();
currentState = 'ldr';
break;
}
case 'ldr': {
lcd.setCursor(0, 0);
lcd.print("Reading LDR...");
delay(2000);
lcd.clear();
ldr1 = analogRead(LDR1);
ldr2 = analogRead(LDR2);
ldr3 = analogRead(LDR3);
if(ldr1 < ldrThreshold ){
digitalWrite(LED1, HIGH);
led1State = 1;
lcd.setCursor(0, 0);
lcd.print("LED 1 & 2 ON");
}
if(ldr1 >= ldrThreshold ){
digitalWrite(LED1, LOW);
lcd.setCursor(0, 0);
lcd.print("LED 1 & 2 OFF");
}
if(ldr2 < ldrThreshold ){
digitalWrite(LED2, HIGH);
}
if(ldr2 >= ldrThreshold ){
digitalWrite(LED2, LOW);
}
if(ldr3 < ldrThreshold ){
digitalWrite(LED3, HIGH);
lcd.setCursor(0, 1);
lcd.print("LED 3 ON");
}
if(ldr3 >= ldrThreshold ){
digitalWrite(LED3, LOW);
lcd.setCursor(0, 1);
lcd.print("LED 3 OFF");
}
delay(3000);
lcd.clear();
currentState = 'ultrasonic';
break;
}
case 'ultrasonic': {
lcd.setCursor(0, 0);
lcd.print("Reading Ultrasnc");
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
distance = duration * SOUND_SPEED/2;
String bak = "bak = ";
String cm = " cm";
tinggiBak = 1000-distance;
String comb = bak + tinggiBak + cm;
lcd.setCursor(0, 1);
lcd.print(comb);
if(distance == (tinggiBak - 100)) { /*bak kosong diasumsi tinggi - 100cm*/
servo1.write(0);
lcd.setCursor(0, 1);
lcd.print("Keran nyala! ");
}
if(distance <= (tinggiBak - 900)) {
servo1.write(90);
lcd.setCursor(0, 1);
lcd.print("Keran dimatikan! ");
}
delay(3000);
lcd.clear();
currentState = 'temperature';
break;
}
}
}
//Task untuk mereport kondisi sensor
void report(void *parameter) {
for(;;) {
delay(10000);
String suhu1 = "Suhu : ";
String humi1 = " Kelembaban : ";
String comb2 = suhu1 + t + Degrees + humi1 + h + Percentage;
Serial.println(comb2);
String Ldr1 = "LDR 1 : ";
String Ldr2 = "LDR 2 : ";
String Ldr3 = "LDR 3 : ";
String lux = " Lux ";
String comb3 = Ldr1 + ldr1 + lux + Ldr2 + ldr2 + lux + Ldr3 + ldr3 + lux;
Serial.println(comb3);
String condled1;
String condled2;
String condled3;
if (led1State == 1) {condled1 = "LED 1 Menyala ";}
if (LED1 == LOW) {condled1 = "LED 1 Mati ";}
if (LED2 == HIGH) {condled2 = "LED 2 Menyala ";}
if (LED2 == LOW) {condled2 = "LED 2 Mati ";}
if (LED3 == HIGH) {condled3 = "LED 3 Menyala ";}
if (LED3 == LOW) {condled3 = "LED 3 Mati ";}
String comb4 = condled1 + condled2 + condled3;
Serial.println(comb4);
String tinggi1 = "Tinggi Air Bak : ";
String cm1 = " cm";
String comb5 = tinggi1 + tinggiBak + cm1;
Serial.println(comb5);
}
}