#include <WiFi.h>
#include <MQTT.h>
#include <LiquidCrystal_I2C.h>
#include <NusabotSimpleTimer.h>
WiFiClient net;
MQTTClient client;
LiquidCrystal_I2C lcd(0x27, 16, 2);
NusabotSimpleTimer timer;
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
const int pinRed = 2;
const int pinGreen = 4;
const int pinBlue = 16;
const int pinRelay1 = 33;
const int pinRelay2 = 25;
const int pinRelay3 = 26;
const int pinRelay4 = 27;
const int pinLDR = 34;
const int ambangCahaya = 1000;
String statusR1, statusR2, statusR3, statusR4;
bool modeOtomatis = false;
void connect() {
rgb(1, 0, 0);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
rgb(0, 1, 0);
while (!client.connect("SMAN6Palopo")) {
delay(500);
}
rgb(0, 0, 1);
client.subscribe("smartRelay/#", 1);
}
void tampilkanStatusRelay() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("R1: " + statusR1 + " R2: " + statusR2);
lcd.setCursor(0, 1);
lcd.print("R3: " + statusR3 + " R4: " + statusR4);
}
void setRelay(int pin, bool nyala) {
digitalWrite(pin, nyala);
String statusVar = nyala ? "ON" : "OFF";
if (pin == pinRelay1) {
client.publish("smartRelay/relay1/status", statusVar, true, 1);
statusR1 = statusVar;
}
if (pin == pinRelay2) {
client.publish("smartRelay/relay2/status", statusVar, true, 1);
statusR2 = statusVar;
}
if (pin == pinRelay3) {
client.publish("smartRelay/relay3/status", statusVar, true, 1);
statusR3 = statusVar;
}
if (pin == pinRelay4) {
client.publish("smartRelay/relay4/status", statusVar, true, 1);
statusR4 = statusVar;
}
}
void subscribe(String topic, String data) {
if (topic == "smartRelay/mode") {
modeOtomatis = (data == "auto");
}
if (!modeOtomatis) {
if (topic == "smartRelay/relay1") {
if(data == "nyala"){
setRelay(pinRelay1, true);
} else{
setRelay(pinRelay1, false);
}
}
if (topic == "smartRelay/relay2") {
if(data == "nyala"){
setRelay(pinRelay2, true);
} else{
setRelay(pinRelay2, false);
}
}
if (topic == "smartRelay/relay3") {
if(data == "nyala"){
setRelay(pinRelay3, true);
} else{
setRelay(pinRelay3, false);
}
}
if (topic == "smartRelay/relay4") {
if(data == "nyala"){
setRelay(pinRelay4, true);
} else{
setRelay(pinRelay4, false);
}
}
tampilkanStatusRelay();
}
}
void checkLDR() {
int nilaiLDR = analogRead(pinLDR);
Serial.println("LDR: " + String(nilaiLDR));
client.publish("smartRelay/ldr", String(nilaiLDR), true, 1);
if (modeOtomatis) {
bool gelap = nilaiLDR < ambangCahaya;
setRelay(pinRelay1, gelap);
setRelay(pinRelay2, gelap);
setRelay(pinRelay3, gelap);
setRelay(pinRelay4, gelap);
tampilkanStatusRelay();
}
}
void setup() {
pinMode(pinRed, OUTPUT);
pinMode(pinGreen, OUTPUT);
pinMode(pinBlue, OUTPUT);
pinMode(pinRelay1, OUTPUT);
pinMode(pinRelay2, OUTPUT);
pinMode(pinRelay3, OUTPUT);
pinMode(pinRelay4, OUTPUT);
lcd.init();
lcd.backlight();
WiFi.begin(ssid, pass);
client.begin("broker.emqx.io", net);
client.onMessage(subscribe);
timer.setInterval(1000, checkLDR);
connect();
tampilkanStatusRelay();
}
void loop() {
client.loop();
timer.run();
if (!client.connected()) {
connect();
}
}
void rgb(bool red, bool green, bool blue) {
digitalWrite(pinRed, red);
digitalWrite(pinGreen, green);
digitalWrite(pinBlue, blue);
}