#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
// Konfigurasi WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Konfigurasi ThingsBoard
#define THINGSBOARD_SERVER "thingsboard.cloud"
#define TOKEN "tw6fDaIGJ99OUpIpeNIV" // Ganti dengan token dari ThingsBoard
Adafruit_MPU6050 mpu;
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
// Konfigurasi Ultrasonic SR04
const int trigPin = 5;
const int echoPin = 18;
// Pin untuk sensor analog
const int soilSensorPin = 2; // Sensor kelembaban tanah
const int raindropSensorPin = 1; // Potensiometer sebagai pengganti sensor raindrop
const int piezometerSensorPin = 19; // Potensiometer sebagai pengganti sensor piezometer
const int alarmPin = 2; // Pin untuk alarm (menggunakan LED bawaan sebagai contoh)
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client", TOKEN, NULL)) {
Serial.println("connected");
client.publish("v1/devices/me/attributes", "{\"firmware_version\":\"1.0.0\",\"device_type\":\"ESP32_MPU6050\"}");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
Wire.begin(8, 9); // SDA, SCL
setup_wifi();
client.setServer(THINGSBOARD_SERVER, 1883);
client.setKeepAlive(60);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(alarmPin, OUTPUT); // Mengatur alarm sebagai output
Serial.println("Finding MPU6050...");
if (!mpu.begin(0x68, &Wire)) {
Serial.println("Failed to find MPU6050 chip");
while (1) {
delay(10);
}
}
Serial.println("MPU6050 Found!");
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
}
float readUltrasonic() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
float distance = readUltrasonic();
int soilMoisture = analogRead(soilSensorPin);
int raindropValue = analogRead(raindropSensorPin);
int piezometerValue = analogRead(piezometerSensorPin);
// Logika alarm untuk raindrop sensor
if (raindropValue > 60) {
Serial.println("Raindrop value is above 60 - Turning Alarm ON");
digitalWrite(alarmPin, HIGH); // Menyalakan alarm
} else {
Serial.println("Raindrop value is 60 or below - Turning Alarm OFF");
digitalWrite(alarmPin, LOW); // Mematikan alarm
}
String payload = "{";
payload += "\"acceleration_x\":" + String(a.acceleration.x) + ",";
payload += "\"acceleration_y\":" + String(a.acceleration.y) + ",";
payload += "\"acceleration_z\":" + String(a.acceleration.z) + ",";
payload += "\"gyro_x\":" + String(g.gyro.x) + ",";
payload += "\"gyro_y\":" + String(g.gyro.y) + ",";
payload += "\"gyro_z\":" + String(g.gyro.z) + ",";
payload += "\"temperature_mpu\":" + String(temp.temperature) + ",";
payload += "\"distance_sr04\":" + String(distance) + ",";
payload += "\"soil_moisture\":" + String(soilMoisture) + ",";
payload += "\"raindrop_value\":" + String(raindropValue) + ",";
payload += "\"piezometer_value\":" + String(piezometerValue);
payload += "}";
Serial.print("Publishing payload: ");
Serial.println(payload);
if (client.publish("v1/devices/me/telemetry", payload.c_str())) {
Serial.println("Publish OK");
} else {
Serial.println("Publish FAILED");
}
Serial.print("Soil Moisture: ");
Serial.println(soilMoisture);
Serial.print("Raindrop Value: ");
Serial.println(raindropValue);
Serial.print("Piezometer Value: ");
Serial.println(piezometerValue);
Serial.print("Ultrasonic Distance: ");
Serial.println(distance);
Serial.print("Alarm Status: ");
Serial.println(digitalRead(alarmPin) == HIGH ? "ON" : "OFF");
}
}