#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <PubSubClient.h>
// Inisialisasi LCD I2C (alamat default 0x27, ukuran 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin rotary encoder
#define CLK 18
#define DT 19
// Variabel untuk perhitungan RPM
volatile int counter = 0;
int lastStateCLK;
unsigned long lastTime = 0;
int rpm = 0;
// WiFi dan MQTT konfigurasi
const char* ssid = "Wokwi-GUEST"; // Ganti dengan SSID WiFi Anda
const char* password = "";
const char* mqtt_server = "kmi-iot.id"; // Ganti dengan alamat MQTT broker Anda
const int mqtt_port = 1885;
WiFiClient espClient;
PubSubClient client(espClient);
// Fungsi rotary encoder
void IRAM_ATTR updateEncoder() {
int currentStateCLK = digitalRead(CLK);
if (currentStateCLK != lastStateCLK && currentStateCLK == HIGH) {
if (digitalRead(DT) != currentStateCLK) {
counter++; // Putaran searah jarum jam
} else {
counter--; // Putaran berlawanan arah jarum jam
}
}
lastStateCLK = currentStateCLK;
}
// Fungsi koneksi WiFi
void setup_wifi() {
lcd.setCursor(0, 0);
lcd.print("Connecting WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
lcd.print(".");
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Connected");
delay(2000);
lcd.clear();
}
// Fungsi koneksi MQTT dengan batas percobaan
bool reconnect() {
int attempts = 0;
while (!client.connected() && attempts < 5) { // Maksimal 5 percobaan
lcd.setCursor(0, 0);
lcd.print("Connecting MQTT");
if (client.connect("ESP32Client")) { // ID client MQTT
lcd.setCursor(0, 1);
lcd.print("MQTT Connected");
delay(2000);
lcd.clear();
return true;
} else {
lcd.setCursor(0, 1);
lcd.print("Retrying... ");
lcd.print(attempts + 1);
delay(2000);
attempts++;
}
}
return false; // Jika gagal setelah 5 percobaan
}
void setup() {
// Inisialisasi pin rotary encoder
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
lastStateCLK = digitalRead(CLK);
attachInterrupt(digitalPinToInterrupt(CLK), updateEncoder, CHANGE);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Setup WiFi dan MQTT
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
// Cek dan coba koneksi ulang MQTT jika terputus
if (!client.connected()) {
if (!reconnect()) {
lcd.setCursor(0, 0);
lcd.print("MQTT Failed!");
delay(2000); // Tunggu sebelum mencoba lagi di loop berikutnya
return;
}
}
client.loop();
// Hitung RPM
unsigned long currentTime = millis();
if (currentTime - lastTime >= 1000) { // Perhitungan tiap 1 detik
rpm = counter * 60; // Konversi ke RPM
counter = 0; // Reset counter
lastTime = currentTime;
// Tampilkan nilai RPM di LCD
lcd.setCursor(0, 0);
lcd.print("RPM: ");
lcd.print(rpm);
lcd.print(" "); // Clear sisa karakter
// Kirim data RPM ke topik MQTT
char rpmData[10];
sprintf(rpmData, "%d", rpm);
client.publish("TI2A/tubes/kelompok_2/rpm", rpmData);
}
}