//#include <WiFi.h>
#include <PubSubClient.h>
#include <WiFiClientSecure.h> // Library tambahan untuk koneksi TLS
#include "hivemq_cert.h" // File header yang berisi deklarasi sertifikat
#include <ArduinoJson.h>
//#include <BluetoothSerial.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "3ef7e525f8474fde88d328280a4bfd6f.s2.eu.hivemq.cloud"; // Ganti dengan alamat broker HiveMQ atau alamat broker MQTT lainnya
const int mqttPort = 8883; // Port MQTT umumnya adalah 1883
const int numRelays = 4; // Jumlah relay yang dikendalikan
const int lamPin[] = {32, 33, 26, 27}; // Pin untuk setiap relay
const char* mqttTopicPrefix = "relay/"; // Topik awalan untuk relay
WiFiClientSecure espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password, 6);
for (int i = 0; i < numRelays; i++) {
pinMode(lamPin[i], OUTPUT);
digitalWrite(lamPin[i], LOW); // Matikan semua relay saat startup
}
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("Connected to WiFi");
client.setServer(mqttServer, mqttPort);
// Impor sertifikat dari header "hivemq_cert.h"
espClient.setCACert(hivemq_cert);
client.setCallback(callback); // Menghubungkan fungsi callback dengan client MQTT
while (!client.connected()) {
Serial.println("Connecting to MQTT Broker...");
String clientId = "Client-2";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str(),"ipulcatur", "Ipulcatur37")) {
Serial.println("Connected to MQTT Broker");
// Subscribe ke semua topik relay
for (int i = 1; i <= numRelays; i++) {
String topic = mqttTopicPrefix + String(i);
client.subscribe(topic.c_str());
}
} else {
Serial.print("Failed to connect, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
delay(1000);
if (Serial.available()) {
String message = Serial.readStringUntil('\n');
client.publish(mqttTopicPrefix, message.c_str());
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message received on topic: ");
Serial.println(topic);
// Ubah payload menjadi String
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Received message: ");
Serial.println(message);
// Periksa topik untuk setiap relay dan kendalikan relay yang sesuai
for (int i = 1; i <= numRelays; i++) {
String relayTopic = mqttTopicPrefix + String(i);
if (String(topic) == relayTopic) {
if (message.equals("ON")) {
digitalWrite(lamPin[i - 1], HIGH); // Nyalakan relay ke-i
Serial.print("Relay ");
Serial.print(i);
Serial.println(" dinyalakan!");
} else if (message.equals("OFF")) {
digitalWrite(lamPin[i - 1], LOW); // Matikan relay ke-i
Serial.print("Relay ");
Serial.print(i);
Serial.println(" dimatikan!");
}
}
}
}
void reconnect() {
while (!client.connected()) {
Serial.println("Connecting to MQTT Broker...");
String clientId = "Client-2";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str(),"ipulcatur", "Ipulcatur37")) {
Serial.println("Connected to MQTT Broker");
// Subscribe ke semua topik relay
for (int i = 1; i <= numRelays; i++) {
String topic = mqttTopicPrefix + String(i);
client.subscribe(topic.c_str());
}
} else {
Serial.print("Failed to connect, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}