#include <WiFi.h>
#include <ThingsBoard.h>
#include <Arduino_MQTT_Client.h>
#include <LiquidCrystal_I2C.h>
#include <DHTesp.h>
#include <ESP32Servo.h>
#define WIFI_AP "Wokwi-GUEST"
#define WIFI_PASS ""
#define TB_SERVER "thingsboard.cloud"
#define TOKEN "ju99hm8l4j9wkuojc332"
constexpr uint16_t MAX_MASSAGE_SIZE = 128U;
WiFiClient espClient;
Arduino_MQTT_Client mqttClient(espClient);
ThingsBoard tb(mqttClient, MAX_MASSAGE_SIZE);
const int servoPin = 18;
#define DHT_PIN 15
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(0x27, 20, 4);
LiquidCrystal_I2C lcd2(0x27, 20, 4);
#include "FC28.h"
#define SensorFC28_Pin 34
float soil_moisture;
FC28Sensor mySensor;
Servo servo;
void connectWiFi() {
Serial.println("Menghubungkan ke jaringan WiFi..");
while(WiFi.status() != WL_CONNECTED) {
WiFi.begin(WIFI_AP, WIFI_PASS, 6);
Serial.println(".");
delay(500);
}
Serial.println("Berhasil terhubung ke jaringan WiFi!");
Serial.println("---");
delay(1000);
}
void tbReconnect() {
while(!tb.connected()) {
if(WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
Serial.println("Menghubungkan ke server ThingsBoard..");
Serial.println(".");
if(tb.connect(TB_SERVER, TOKEN)) {
Serial.println("Terhubung ke Thingsboard!");
Serial.println("---");
}
else{
Serial.println("Gagal terhubung ke ThingsBoard");
Serial.println("menghubungkan kembali..");
}
}
}
void sendData(float temp, float hum, float soil_moisture) {
String jsonData = "{\"temperature\":" + String(temp) + ", \"humidity\":" + String(hum) + ", \"soil moisture value\":" + String(soil_moisture) + "}";
tb.sendTelemetryJson(jsonData.c_str());
Serial.println("Data terkirim");
}
void setup() {
Serial.begin(9600);
Serial.flush();
pinMode(DHT_PIN, INPUT);
mySensor.initFC28Sensor(115200, SensorFC28_Pin);
servo.attach(servoPin);
Serial.println("");
Serial.println("Smart Farming: Penyiraman Tanaman Otomatis");
Serial.println("IoT - kelompok 9");
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Smart Farming:");
lcd.setCursor(0, 1);
lcd.print("Penyiraman Tanaman");
lcd.setCursor(0, 2);
lcd.print("Otomatis");
lcd.setCursor(0, 3);
lcd.print("IoT - kel. 9");
delay(4000);
lcd.clear();
connectWiFi();
tbReconnect();
}
void loop() {
// Data sensor DHT22
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float hum = data.humidity;
float temp = data.temperature;
Serial.println("Suhu : " + String(temp, 2) + "°C");
Serial.println("Kelembaban : " + String(hum, 1) + "%");
Serial.println("---");
//Data sensor Soil Moisture FC28
soil_moisture = mySensor.getSoilMoisture();
String msg = soil_moisture < 33.33 ? "Basah" : soil_moisture > 66.66 ? "Kering" : "Normal";
Serial.println("Soil Moisture Value : "+String(soil_moisture,2)+"%");
// Output LCD untuk monitoring kondisi tumbuhan
lcd.setCursor(0,0);
lcd.print("Hasil Monitoring");
// Kondisi Tanah
lcd.setCursor(0,1);
lcd.print("Tanah :");
lcd.setCursor(13,1);
lcd.print(msg);
// Suhu
lcd.setCursor(0,2);
lcd.print("Suhu :");
lcd.setCursor(13,2);
lcd.print(temp);
lcd.setCursor(19,2);
lcd.print("C");
// Kelembaban
lcd.setCursor(0,3);
lcd.print("Kelembaban :");
lcd.setCursor(13,3);
lcd.print(hum);
lcd.setCursor(19,3);
lcd.print("%");
delay(1000);
lcd.clear();
// Servo conditional + output LCD untuk penyiraman
if((soil_moisture > 66.66)){
servo.write(180);
lcd.setCursor(0, 0);
lcd.print("Kondisi Tanah Kering");
lcd.setCursor(0, 2);
lcd.print("Menyiram..");
Serial.println("Kondisi Tanah Kering");
Serial.println("Menyiram..");
Serial.println("---");
delay(3000);
}
else{
servo.write(0);
lcd.setCursor(0, 1);
}
lcd.clear();
if(!tb.connected()) {
tbReconnect();
}
sendData(temp, hum, soil_moisture);
delay(1000);
tb.loop();
}