#include <DHTesp.h>
#include <WiFi.h>
#include <ESP32Servo.h>
#include <PubSubClient.h>
#include <HX711.h>
#include <math.h>
// Pin Definitions
#define TRIG_PIN 3
#define ECHO_PIN 2
#define DHT_PIN 15
#define DO_PIN 13
#define LOADCELL_DOUT_PIN 18
#define LOADCELL_SCK_PIN 19
#define MQ135_PIN 20
#define LED_PIN 21
#define LDR_PIN 36 // Pin untuk LDR (gunakan pin ADC yang sesuai)
#define WATERPUMP_PIN 22 // Pin untuk water pump
#define SOIL_MOISTURE_PIN 34 // Pin untuk sensor kelembaban tanah
#define RELAY_PIN 37 // Pin relay untuk kontrol gas mq
#define BUZZER_PIN 46 // Pin untuk buzzer
// ThingsBoard Credentials
#define TOKEN "SX5ruNOmikfOw4InUhJ6"
#define TB_SERVER "thingsboard.cloud"
// WiFi Credentials
#define WIFI_AP "Wokwi-GUEST"
#define WIFI_PASS ""
// Servo and Scale Objects
Servo myServo;
HX711 scale;
WiFiClient espClient;
PubSubClient client(espClient);
// Sensor Objects
DHTesp dhtSensor;
float temp, hum;
long distance = 0;
int airQualityThreshold = 500;
float setPoint = 100;
// Faktor Kalibrasi untuk HX711
float calibration_factor = 2280.0;
// Constants for LDR sensor
const float GAMMA = 0.7;
const float RL10 = 50;
void setup() {
Serial.begin(115200);
// Initialize WiFi and ThingsBoard
iniWiFi();
client.setServer(TB_SERVER, 1883);
// Initialize Sensors
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(DO_PIN, INPUT);
pinMode(MQ135_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
pinMode(BUZZER_PIN, OUTPUT); // Buzzer pin mode
// Initialize Servo
myServo.attach(21); // Ubah ke pin yang sesuai dan valid untuk PWM
myServo.write(90);
// Initialize Scale
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(calibration_factor);
scale.tare();
// Initialize Water Pump
pinMode(WATERPUMP_PIN, OUTPUT);
digitalWrite(WATERPUMP_PIN, LOW); // Water pump awalnya mati
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
iniWiFi();
}
if (!client.connected()) {
reconnect();
}
client.loop();
// Read temperature and humidity from DHT sensor
TempAndHumidity data = dhtSensor.getTempAndHumidity();
temp = data.temperature;
hum = data.humidity;
Serial.println("Temperature: " + String(temp));
Serial.println("Humidity: " + String(hum));
// Mengaktifkan buzzer jika kelembaban lebih dari 50%
if(hum > 50){
tone(BUZZER_PIN, 500); // Suara pertama
delay(1000);
tone(BUZZER_PIN, 800); // Suara kedua
delay(1000);
} else {
noTone(BUZZER_PIN); // Matikan buzzer jika kelembaban < 50%
}
// Servo control based on temperature
if (data.temperature > 40) {
myServo.write(0);
} else {
myServo.write(90);
}
// Measure distance using ultrasonic sensor
distance = measureDistance();
Serial.println("Distance: " + String(distance) + " cm");
// Measure light intensity using LDR
int analogValue = analogRead(LDR_PIN);
float voltage = analogValue / 1024.0 * 5.0;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
Serial.println("Light Intensity: " + String(lux) + " lux");
// Read weight from HX711
float weight = scale.get_units();
Serial.println("Weight: " + String(weight) + " kg");
// Read air quality from MQ-135
int airQuality = analogRead(MQ135_PIN);
Serial.print("Air Quality Value: ");
Serial.println(airQuality);
// LED Indicator for Air Quality
if (airQuality > airQualityThreshold) {
Serial.println("Air Quality: Bad");
digitalWrite(RELAY_PIN, HIGH);
} else {
Serial.println("Air Quality: Good");
digitalWrite(RELAY_PIN, LOW);
}
// Read soil moisture and control water pump
int16_t soilMoistureValue = analogRead(SOIL_MOISTURE_PIN);
String soilMoistureStatus = soilMoistureValue < 2165 ? "WET" : soilMoistureValue > 3135 ? "DRY" : "OK";
Serial.println("Soil Moisture Status: " + soilMoistureStatus);
if (soilMoistureStatus == "DRY") {
digitalWrite(WATERPUMP_PIN, HIGH); // Aktifkan water pump
Serial.println("Water Pump ON");
} else {
digitalWrite(WATERPUMP_PIN, LOW); // Matikan water pump
Serial.println("Water Pump OFF");
}
// Send data to ThingsBoard
String payload = "{\"temperature\":" + String(temp) + ",\"humidity\":" + String(hum) +
",\"distance\":" + String(distance) + ",\"lux\":" + String(lux) +
",\"weight\":" + String(weight) + ",\"airQuality\":" + String(airQuality) +
",\"soilMoisture\":\"" + soilMoistureStatus + "\"}";
Serial.println("Mengirimkan data: " + payload);
// Publish data to ThingsBoard
if (client.publish("v1/devices/me/telemetry", payload.c_str())) {
Serial.println("Data terkirim ke ThingsBoard");
} else {
Serial.println("Gagal mengirim data ke ThingsBoard");
}
delay(10000);
}
void iniWiFi() {
Serial.println("Menghubungkan...");
WiFi.begin(WIFI_AP, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("Terhubung!");
}
void reconnect() {
while (!client.connected()) {
Serial.print("Menghubungkan ke ThingsBoard...");
if (client.connect("ESP32", TOKEN, "")) {
Serial.println("Terhubung!");
} else {
Serial.print("Gagal, rc=");
Serial.print(client.state());
Serial.println(" mencoba lagi dalam 1 detik");
delay(1000);
}
}
}
long measureDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}