// **
// *
// Projek ini merupakan tugas individual mengenai implementasi proyek IoT pada simulasi
// wokwi. Proyek ini akan melibatkan penggunaan sensor untuk mengukur data lingkungan
// (misalnya suhu, kelembapan, cahaya, dll) dan mengirimkan data ke sebuah topik MQTT.
// Kemudian, peserta akan memverifikasi pengiriman pesan melalui MQTT client.
// *
// *
// Nama : Dimyati
// No. regis : 1958408840-83
// Penjelasan Tugas :
// Tugas ini merupakan implementasi penerapan proyek IoT dimana saya memilih untuk data
// lingkungan mengenai air[ Water Quality Monitoring (WQM) ]. Sensor yang digunakan yaitu
// sensor DHT type 22 (DHT22), Sensor Photo Resistor dan Sensor pH air (dalam hal ini saya
// menggunakan potentiometer sebagai sensor pH-nya). Mikrocontroller yang digunakan yaitu ESP32.
// Broker public yang digunakan test.mosquitto.org
// **
// *
#include <WiFi.h> // Mengimpor library WiFi untuk ESP32
#include <PubSubClient.h> // Mengimpor library MQTT untuk ESP32
#include <DHT.h> // Mengimpor library sensor DHT untuk ESP32
const int LUX_PIN = 34; // Pin yang terhubung ke sensor cahaya
const float GAMMA = 0.7; // Nilai gamma yang digunakan dalam perhitungan sensor cahaya
const float RL10 = 50; // Resistansi referensi untuk sensor cahaya
#define PH_PIN 35 // Pin yang terhubung ke sensor pH
#define DHT_PIN 15 // Pin yang terhubung ke sensor DHT
#define DHT_TYPE DHT22 // Tipe sensor DHT yang digunakan (DHT22)
DHT dht(DHT_PIN, DHT_TYPE); // Membuat objek DHT dengan pin dan tipe yang ditentukan
const char* ssid = "Wokwi-GUEST"; // SSID jaringan WiFi
const char* password = ""; // Kata sandi jaringan WiFi
const char* mqtt_server = "test.mosquitto.org"; // Alamat broker MQTT
WiFiClient espClient; // Membuat instansi klien WiFi
PubSubClient client(espClient); // Membuat instansi klien MQTT dengan klien WiFi
unsigned long lastMsg = 0; // Variabel untuk menyimpan waktu terakhir pesan dikirim
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA); // Mengatur ESP32 dalam mode station (terhubung ke WiFi)
WiFi.begin(ssid, password); // Menghubungkan ke WiFi dengan SSID dan password yang ditentukan
while (WiFi.status() != WL_CONNECTED) { // Menunggu sampai koneksi WiFi berhasil terhubung
delay(500);
Serial.print(".");
}
randomSeed(micros()); // Menginisialisasi generator bilangan acak dengan waktu dalam mikrodetik
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); // Menampilkan alamat IP lokal ESP32 setelah terhubung
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) { // Mencetak setiap karakter dalam payload pesan MQTT yang diterima
Serial.print((char)payload[i]);
}
}
void reconnect() {
while (!client.connected()) { // Melakukan loop sampai klien MQTT terhubung ke broker
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX); // Menghasilkan ID klien MQTT acak
if (client.connect(clientId.c_str())) { // Mencoba untuk terhubung ke broker MQTT dengan ID klien yang dihasilkan
Serial.println("connected");
client.publish("/WQM/Publish", "Program started"); // Mengirim pesan ke topik MQTT untuk menandai dimulainya program
client.subscribe("/WQM/Subscribe"); //Melakukan subscribe ke topik MQTT yang ditentukan
} else {
Serial.print("failed, rc=");
Serial.print(client.state()); // Menampilkan status koneksi MQTT jika gagal terhubung
Serial.println(" try again in 5 seconds");
delay(5000); // Menunggu 5 detik sebelum mencoba menghubungkan kembali ke MQTT
}
}
}
void setup() {
Serial.begin(115200); // Menginisialisasi komunikasi serial dengan baud rate 115200
pinMode(PH_PIN, INPUT); // Mengatur mode pin sensor pH sebagai input
pinMode(LUX_PIN, INPUT); // Mengatur mode pin sensor cahaya sebagai input
setup_wifi(); // Memanggil fungsi untuk menghubungkan ke jaringan WiFi
client.setServer(mqtt_server, 1883); // Mengatur alamat dan port broker MQTT
client.setCallback(callback); // Mengatur fungsi callback untuk menangani pesan MQTT yang diterima
}
void loop() {
if (!client.connected()) { //Jika klien MQTT tidak terhubung, coba untuk menghubungkan kembali
reconnect();
}
client.loop(); // Memelihara koneksi klien MQTT dan memproses pesan yang masuk
unsigned long now = millis(); // Mendapatkan waktu saat ini dalam milidetik
if (now - lastMsg > 2000) { // Mengirim data sensor setiap 2 detik sekali
lastMsg = now;
float temperature = dht.readTemperature(); // Membaca suhu dari sensor DHT
float humidity = dht.readHumidity(); // Membaca kelembaban dari sensor DHT
int analogValue = analogRead(LUX_PIN); // Membaca nilai analog dari sensor cahaya
float voltage = analogValue * 5/4095.0; // Mengubah nilai analog menjadi tegangan
float resistance = 2000 * voltage / (1 - voltage / 5); // Menghitung resistansi dari sensor cahaya
float Lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA)); // Menghitung nilai Lux
float phValue = map(analogRead(PH_PIN), 0, 4095, 0, 14); // Memetakan nilai tegangan sensor pH ke rentang pH (0-14)
String temp = String(temperature, 1) + " " + "\xB0" + "C"; // Mengonversi suhu ke dalam string dengan 1 desimal
client.publish("/WQM/temp", temp.c_str()); // Mengirimkan nilai suhu ke topik MQTT
String hum = String(humidity, 1) + " %"; // Mengonversi kelembaban ke dalam string dengan 1 desimal
client.publish("/WQM/hum", hum.c_str()); // Mengirimkan nilai kelembaban ke topik MQTT
String lux = String(Lux) + " lx"; // Mengonversi nilai Lux menjadi string
client.publish("/WQM/light", lux.c_str()); // Mengirimkan nilai Lux ke topik MQTT
String ph = String(phValue, 2); // Mengonversi nilai pH menjadi string dengan 2 desimal
client.publish("/WQM/ph", ph.c_str()); // Mengirimkan nilai pH ke topik MQTT
Serial.print("Temp: ");
Serial.println(temp); // Mencetak nilai suhu ke Serial Monitor
Serial.print("Humidity: ");
Serial.println(hum); // Mencetak nilai kelembaban ke Serial Monitor
Serial.print("Lux: ");
Serial.println(lux); // Mencetak nilai Lux ke Serial Monitor
Serial.print("pH: ");
Serial.println(ph); // Mencetak nilai pH ke Serial Monitor
}
}