#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <string>
// Suhu air - DHT22
#define DHTPIN 19
#define DHTTYPE DHT22 // Tipe sensor (DHT22)
// pH air - Potensiometer di pin 34
const int pHPin = 34;
float pHValue;
// Turbidity (Kekeruhan) - Potensiometer di pin 35
const int turbidityPin = 35;
float turbidityValue;
// Oksigen Terlarut (DO)
float dissolvedOxygen = 8.5;
// DHT22
DHT dht(DHTPIN, DHTTYPE);
// Konfigurasi WiFi dan MQTT
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define MQTT_SERVER "rduha3c.localto.net"
#define MQTT_PORT 8443
#define MQTT_TOPIC "sistemPendeteksiAirSungai"
WiFiClient espClient;
PubSubClient client(espClient);
void setupWifi() {
Serial.print("Connecting to WiFi [ ");
Serial.print(ssid);
Serial.println(" ]");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void setupMqtt() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected to MQTT");
client.publish(MQTT_TOPIC, "Device connected");
} else {
Serial.print("MQTT connection failed: ");
Serial.println(client.state());
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
// WiFi dan MQTT
setupWifi();
client.setServer(MQTT_SERVER, MQTT_PORT);
// Mulai sensor DHT
dht.begin();
}
void loop() {
if (!client.connected()) setupMqtt();
client.loop();
// Membaca kelembapan dan suhu dari DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Cek jika pembacaan sensor gagal
if (isnan(humidity) || isnan(temperature)) {
Serial.println(F("Failed to read from DHT sensor!"));
delay(2000);
return;
}
// Sensor Oksigen Terlarut (DO) - simulasi dengan perubahan acak
dissolvedOxygen += random(-10, 10) * 0.01; // Perubahan acak
if (dissolvedOxygen < 0) dissolvedOxygen = 0; // Hindari nilai negatif
Serial.print("DO Value: ");
Serial.print(dissolvedOxygen);
Serial.println(" mg/L");
// Sensor pH (Potensiometer di pin 34)
int analogValue = analogRead(pHPin);
pHValue = map(analogValue, 0, 4095, 0, 14); // Konversi nilai ADC ke pH (0-14)
Serial.print("pH Value: ");
Serial.println(pHValue);
// Sensor Kekeruhan (Turbidity) (Potensiometer di pin 35)
int analogValueTurbidity = analogRead(turbidityPin);
turbidityValue = map(analogValueTurbidity, 0, 4095, 50, 0); // Rentang kekeruhan 1000-0 NTU
Serial.print("Turbidity Value: ");
Serial.println(turbidityValue);
// Membuat payload JSON
StaticJsonDocument<300> doc;
doc["temperature"] = temperature;
doc["humidity"] = humidity;
doc["dissolvedOxygen"] = dissolvedOxygen;
doc["pH"] = pHValue;
doc["turbidity"] = turbidityValue;
// Mengirim data ke MQTT
String message;
serializeJson(doc, message);
Serial.println("MQTT Payload: " + message);
client.publish(MQTT_TOPIC, message.c_str());
delay(10000); // Delay untuk mengurangi frekuensi pengiriman
}