#include <DHT.h>
#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ThingsBoard.h>
#include <Arduino_MQTT_Client.h>
// WiFi credentials
char ssid[] = "Wokwi-GUEST";
char password[] = "";
#define TB_SERVER "thingsboard.cloud"
#define TOKEN "MFi3Cyacfb8PFroLbqlt"
WiFiClient espClient;
Arduino_MQTT_Client mqttClient(espClient);
ThingsBoard tb(mqttClient);
// Pin definitions
#define DHTPIN 15 // Pin data pada sensor DHT22
#define DHTTYPE DHT22 // Tipe sensor DHT22
#define SOIL_PIN 34 // Pin data pada soil sensor
#define RELAY_PIN 18 // Pin kontrol pada relay
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C dan ukuran LCD (20x4)
// Function to connect to WiFi
void connectToWiFi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("\nFailed to connect to WiFi.");
} else {
Serial.println("\nConnected to WiFi");
}
}
void connectToThingsBoard() {
if (!tb.connected()) {
Serial.println("Connecting to ThingsBoard server");
if (!tb.connect(TB_SERVER, TOKEN)) {
Serial.println("Failed to connect to ThingsBoard");
} else {
Serial.println("Connected to ThingsBoard");
}
}
}
void sendDataToThingsBoard(float temperature, float humidity, float soilMoisture) {
tb.sendTelemetryData("temperature", temperature);
tb.sendTelemetryData("humidity", humidity);
tb.sendTelemetryData("soilMoisture", soilMoisture);
Serial.println("Data sent to ThingsBoard");
}
void setup() {
// Initialize serial communication
Serial.begin(9600);
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize DHT sensor
dht.begin();
// Initialize relay pin
pinMode(RELAY_PIN, OUTPUT);
// Connect to WiFi
connectToWiFi();
connectToThingsBoard();
}
void loop() {
// Delay between readings
delay(2000);
// Read temperature and humidity from DHT sensor
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Read soil moisture value
int soilMoistureRaw = analogRead(SOIL_PIN);
// Map the raw soil moisture value to a percentage
float soilMoisturePercentage = map(soilMoistureRaw, 0, 4095, 0, 100);
// Check if readings are valid
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Gagal membaca data dari sensor DHT22!");
return;
}
// Print values to serial monitor
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.print(" °C, Kelembaban: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Kelembaban Tanah: ");
Serial.print(soilMoisturePercentage);
Serial.println(" %");
// Display values on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Kelembaban: ");
lcd.print(humidity);
lcd.print(" %");
lcd.setCursor(0, 2);
lcd.print("K. Tanah: ");
lcd.print(soilMoisturePercentage);
lcd.print(" %");
// Control relay based on temperature
if (temperature > 28.0) {
digitalWrite(RELAY_PIN, HIGH); // Activate relay
Serial.println("Relay diaktifkan.");
} else {
digitalWrite(RELAY_PIN, LOW); // Deactivate relay
Serial.println("Relay dimatikan.");
}
// Reconnect to ThingsBoard if connection is lost
if (!tb.connected()) {
connectToThingsBoard();
}
// Send data to ThingsBoard
sendDataToThingsBoard(temperature, humidity, soilMoisturePercentage);
}