// NAMA : ANDI SETIAWAN
// NPM : 213510241
// KELAS: 7A TEKNIK INFORMATIKA
// UAS : PRAKTIKUM IOT
//***SISTEM MONITORING TANAMAN RUMAH KACA***//
// Id, Name, dan Token untuk terhubung ke BLYNK
#define BLYNK_TEMPLATE_ID "TMPL6ScKFsGpW"
#define BLYNK_TEMPLATE_NAME "MONITORING TANAMAN RUMAH KACA"
#define BLYNK_AUTH_TOKEN "ABCdxsKTyWVAZlbTNh4e9plp54RcmDke"
#define BLYNK_PRINT Serial
// Import library
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <DHTesp.h>
#include <BlynkSimpleEsp32.h>
#define trigPin1 12 // Pin trigger sensor ultrasonik
#define echoPin1 14 // Pin echo sensor ultrasonik
#define servoPin 15 // Pin servo jarak, untuk stok air
#define servo2Pin 2 // Pin servo Suhu dan kelembaban
const int DHT_PIN = 13; // untuk pin DHT
DHTesp dhtSensor; //membuat variabel DHT agar lebih mudah dibaca
//variabel suhu dan kelembaban
int suhu;
int kelembaban;
// Pin led untuk indikator JARAK
#define ledRed 25
#define ledYellow 26
#define ledGreen 27
// Pin rgb untuk indikator suhu
#define rgbRed1 19
#define rgbGreen1 18
#define rgbBlue1 5
// Pin rgb untuk indikator kelembaban
#define rgbRed2 16
#define rgbGreen2 4
#define rgbBlue2 0
char auth[] = BLYNK_AUTH_TOKEN; // Auth Token
char ssid[] = "Wokwi-GUEST"; // Nama hotspot yang digunakan
char pass[] = ""; // Password hotspot yang digunakan
//variabel servo, untuk servo Stok dan servo penyiraman
Servo servo;
Servo servo2;
long duration1, distance1; //variabel untuk menghitung jarak dari sensor
//inisialisasi LCD, menggunakan 2 variabel lcd karena saya memisahkan sensor di 2 looping yg berbeda
LiquidCrystal_I2C lcd(0x27, 16, 2); //lcd untuk menampilkan jarak
LiquidCrystal_I2C lcd2(0x27, 16, 2);//lcd untuk menampilkan suhu dan kelembaban
BlynkTimer timer; //variabel untuk set timer blynk
void sendSensorDataToBlynk(long distance1, int suhu, int kelembaban)
{
Blynk.virtualWrite(V0, distance1); // Virtual pin V0
Blynk.virtualWrite(V1, suhu); // Virtual pin V5 untuk suhu
Blynk.virtualWrite(V2, kelembaban); // Virtual pin V6 untuk kelembaban
}
void updateLCD(long distance1) //fungsi untuk update LCD jarak
{
lcd.clear();
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Nyalakan backlight
lcd.setCursor(0, 0); //set kursor baris 0 kolom 0
lcd.print("Stok Air: ");
lcd.print(distance1);
lcd.print(" cm");
delay(1000);
}
void updateLCD2(int suhu, int kelembaban) // Fungsi untuk update lcd Suhu dan Kelembaban
{
lcd2.clear();
lcd2.init(); // Inisialisasi LCD
lcd2.backlight(); // Nyalakan backlight
lcd2.setCursor(0, 0);//set kursor baris 0 kolom 0
lcd2.print("Suhu: ");
lcd2.print(suhu);
lcd2.print(" C");
lcd2.setCursor(0, 1);//set kursor baris 0 kolom 1
lcd2.print("Kelembaban: ");
lcd2.print(kelembaban);
lcd2.print(" %");
delay(1000);
}
BLYNK_WRITE(V3) //mengontrol servo secara manual menggunakan Blynk apabila kondisi terpenuhi
{
int value = param.asInt();
if (value == 1 && distance1 > 100 && distance1 < 200)
{
servo.write(180); // Buka SERVO STOK AIR
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, HIGH);
digitalWrite(ledGreen, LOW);
delay(1000);
}
else if (value == 0 && distance1 > 100 && distance1 < 200)
{
servo.write(90); // Tutup SERVO STOK AIR
}
}
void loopStokAir() //Fungsi perulangan untuk mendeteksi stok air dengan sensor ultrasonic
{
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration1 = pulseIn(echoPin1, HIGH);
distance1 = (duration1 / 2) * 0.0343; //mengubah nilai duration menjadi jarak
Serial.print("Jarak dengan air: ");
Serial.print(distance1);
Serial.println(" cm");
Blynk.virtualWrite(V0, distance1); // mengirim nilai ke blynk dengan virtual pin V0
//kondisi perulangan
if (distance1 <= 100)
{
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH);
servo.write(90);
delay(1000);
}
else if (distance1 > 100 && distance1 < 200)
{
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, HIGH);
digitalWrite(ledGreen, LOW);
delay(1000);
}
else if (distance1 >= 200)
{
digitalWrite(ledRed, HIGH);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, LOW);
servo.write(180);
delay(1000);
}
else
{
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, LOW);
}
updateLCD(distance1); //update LCD stok air
delay(1000);
}
void loopSuhuKelembaban() //fungsi untuk mendeteksi suhu dan kelembaban dengan sensor DHT
{
TempAndHumidity data = dhtSensor.getTempAndHumidity();
suhu = data.temperature;
kelembaban = data.humidity;
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.println(" C");
Serial.print("Kelembaban: ");
Serial.print(kelembaban);
Serial.println(" %");
Blynk.virtualWrite(V1, suhu); // Blynk Virtual pin V5 untuk suhu
Blynk.virtualWrite(V2, kelembaban); // Blynk Virtual pin V6 untuk kelembaban
// kondisi untuk RGB LED suhu
if (suhu < 20)
{
analogWrite(rgbRed1, 0);
analogWrite(rgbGreen1, 0);
analogWrite(rgbBlue1, 255);
}
else if (suhu >= 20 && suhu < 35)
{
analogWrite(rgbRed1, 0);
analogWrite(rgbGreen1, 255);
analogWrite(rgbBlue1, 0);
}
else
{
analogWrite(rgbRed1, 255);
analogWrite(rgbGreen1, 0);
analogWrite(rgbBlue1, 0);
}
// kondisi untuk RGB LED kelembaban
if (kelembaban < 50)
{
analogWrite(rgbRed2, 255);
analogWrite(rgbGreen2, 0);
analogWrite(rgbBlue2, 0);
}
else if (kelembaban >= 50 && kelembaban < 70)
{
analogWrite(rgbRed2, 0);
analogWrite(rgbGreen2, 255);
analogWrite(rgbBlue2, 0);
}
else if ( kelembaban > 70 )
{
analogWrite(rgbRed2, 0);
analogWrite(rgbGreen2, 0);
analogWrite(rgbBlue2, 255);
}
//kondisi untuk menyiram tanaman dengan membuka servo penyiraman
if (kelembaban < 50 && suhu > 30){
servo2.write(180);
}else{
servo2.write(90);
}
updateLCD2(suhu, kelembaban); //update LCD suhu dan kelembaban
delay(1000);
}
void myTimerEvent() //fungsi untuk menghitung suhu dan kelembaban
{
TempAndHumidity data = dhtSensor.getTempAndHumidity();
suhu = data.temperature;
kelembaban = data.humidity;
Blynk.virtualWrite(V0, suhu);
Blynk.virtualWrite(V1, kelembaban);
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
}
void setup() // fungsi untuk setup seluruh komponen
{
Serial.begin(9600);
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(1000L, myTimerEvent);
servo.attach(servoPin);
servo2.attach(servo2Pin);
// Inisialisasi LCD
lcd.begin(16, 2); //lcd untuk menampilkan stok air
lcd2.begin(16, 2); // lcd untuk mrnampilkan suhu dan kelembaban
lcd.clear();
lcd.init(); // Inisialisasi LCD
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("ANDI SETIAWAN");
lcd.setCursor(0, 1);
lcd.print("NPM: 213510241");
delay(3000);
Blynk.begin(auth, ssid, pass); //untuk blynk token, hotspot dan password
}
void loopAll() //fungsi terus mengulang untuk sensor stok air, suhu, dan kelembaban
{
loopStokAir();
loopSuhuKelembaban();
}
void loop()//fungsi untuk looping seluruhnya termasuk blynk.
{
Blynk.run();
loopAll();
}