#include <MQTT.h>
#include <WiFi.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
#define led_kng 12 // led kuning
#define led_mrh 13 // led merah
#define led_hju 14 // led hijau
#define servo_pin 26
#define poten_pin 34 // Potensiometer
#define ptLdr_pin 35 // Photoresistore LDR
#define btn01_pin 4
#define btn02_pin 5
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo myservo;
WiFiClient net;
MQTTClient client;
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
const char mqtt_client[] = "MikaZeeUniq";
const char mqtt_broker[] = "broker.emqx.io";
const char publish_input[] = "IoT_Class/pub/in";
const char publish_output[] = "IoT_Class/pub/out";
const char subscribe_output[] = "IoT_Class/subs/#";
int sudut_servo = 0;
int adc_potensiometer = 0;
int adc_photoresistor = 0;
bool button_1, statusButton_1, lastButton_1, statusLed_1 = 0;
bool button_2, statusButton_2, lastButton_2, statusLed_2 = 0;
String led1_status = "";
String led2_status = "";
unsigned long prevT_lcd = 0;
unsigned long prevT_input = 0;
unsigned long prevT_debounce = 0;
unsigned long debounce_click = 50;
void wifi_setup() {
WiFi.begin(ssid, pass);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print("."); delay(300);
}
Serial.println("\nWiFi Connected");
}
void wifi_loop() {
if (WiFi.status() != WL_CONNECTED) {
wifi_setup();
}
}
void mqtt_setup() {
client.begin(mqtt_broker, net);
client.onMessage(subscribe_mqtt);
Serial.print("Connecting to MQTT");
while (!client.connect(mqtt_client)) {
Serial.print("."); delay(500);
}
Serial.println("\nMQTT Connected");
}
void mqtt_loop() {
if (!client.connected()) {
mqtt_setup();
} client.loop();
}
void subscribe_mqtt(String &topic, String &data) {
Serial.println("incoming: " + topic + " - " + data);
}
void input_loop(){
if(millis() - prevT_input >= 1000){
prevT_input = millis();
float voltage_ldr = adc_photoresistor / 4095. * 5;
float resistance_ldr = 2000 * voltage_ldr / (1 - voltage_ldr / 5);
float lux_ldr = pow(50 * 1e3 * pow(10, 0.7) / resistance_ldr, (1 / 0.7));
// Serial.println("Voltage LDR: " + String(voltage_ldr));
// Serial.println("Resistance LDR: " + String(resistance_ldr));
// Serial.println("============================\n");
}
}
void button_loop(){
if(button_1 != lastButton_1){
prevT_debounce = millis();
}
if(millis() - prevT_debounce > debounce_click){
if(button_1 != statusButton_1){
statusButton_1 = button_1;
if(statusButton_1 == HIGH){
statusLed_1 = !statusLed_1;
}
}
else if(button_2 != statusButton_2){
statusButton_2 = button_2;
if(statusButton_2 == HIGH){
statusLed_2 = !statusLed_2;
}
}
}
if(statusLed_1 == 1) led1_status = "NYALA";
if(statusLed_1 != 1) led1_status = "MATI ";
if(statusLed_2 == 1) led2_status = "NYALA";
if(statusLed_2 != 1) led2_status = "MATI ";
lastButton_1 = button_1;
lastButton_2 = button_2;
delay(10);
}
void output_loop() {
sudut_servo = map(adc_potensiometer, 0, 4095, 0, 180);
myservo.write(sudut_servo);
digitalWrite(led_mrh, statusLed_1);
digitalWrite(led_kng, statusLed_2);
}
void display_loop() {
if (millis() - prevT_lcd >= 1000) {
prevT_lcd = millis();
//lcd.clear();
lcd.setCursor(0, 0); lcd.print("PELATIHAN KELAS IoT");
lcd.setCursor(0, 1); lcd.print("SUDUT SERVO: ");
lcd.setCursor(13, 1); lcd.print(sudut_servo + String(" "));
lcd.setCursor(0, 2); lcd.print("LED MERAH : ");
lcd.setCursor(13,2); lcd.print(led1_status);
lcd.setCursor(0, 3); lcd.print("LED KUNING : ");
lcd.setCursor(13,3); lcd.print(led2_status);
}
}
void setup() {
Serial.begin(115200);
pinMode(led_kng, OUTPUT);
pinMode(led_mrh, OUTPUT);
pinMode(led_hju, OUTPUT);
pinMode(poten_pin, INPUT);
pinMode(btn01_pin, INPUT);
pinMode(btn02_pin, INPUT);
myservo.attach(servo_pin);
// lcd.init();
// lcd.setCursor(0, 0); lcd.print("PELATIHAN KELAS IoT");
// lcd.setCursor(3, 1); lcd.print("BATCH PERTAMA");
// lcd.setCursor(3, 3); lcd.print("AJI ABDUL AZIZ");
// delay(2000);
// lcd.clear();
wifi_setup();
mqtt_setup();
}
void loop() {
wifi_loop();
mqtt_loop();
adc_potensiometer = analogRead(poten_pin);
adc_photoresistor = analogRead(ptLdr_pin);
button_1 = digitalRead(btn01_pin);
button_2 = digitalRead(btn02_pin);
input_loop();
button_loop();
output_loop();
//display_loop();
delay(10);
}