// mosquitto_sub -h broker.mqtt-dashboard.com -t /myrelay/status //mosquitto_sub -h broker.mqtt-dashboard.com -t /myrelay/cnt //control //mosquitto_pub -h broker.mqtt-dashboard.com -t /myrelay/control -m 7 // again untuk mematikan // mosquitto_pub -h broker.mqtt-dashboard.com -t /myrelay/control -m 7 #include #include const char* ssid = "mywifi"; const char* password = "mypassword"; // Definisikan informasi broker MQTT const char* mqtt_server = "broker.mqtt-dashboard.com"; //broker.emqx.io //broker.hivemq.com const int mqtt_port = 1883; const char* mqtt_username = ""; // Biarkan kosong jika tidak ada const char* mqtt_password = ""; // Biarkan kosong jika tidak ada // Inisialisasi koneksi WiFi WiFiClient espClient; // Inisialisasi koneksi MQTT PubSubClient client(espClient); // Daftar status relay (0 = OFF, 1 = ON) int relayStatus[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int rly1 = 16; int rly2 = 14; int rly3 = 12; int rly4 = 13; int rly5 = 15; int rly6 = 0; int rly7 = 4; int rly8 = 5; int relayPins[8] = {rly1, rly2, rly3, rly4, rly5, rly6, rly7, rly8}; unsigned long lastMsg = 0; #define MSG_BUFFER_SIZE (50) char msg[MSG_BUFFER_SIZE]; int value = 0; void setup() { // Mulai Serial Serial.begin(115200); // Inisialisasi pin relay sebagai OUTPUT for (int i = 0; i < 8; i++) { pinMode(relayPins[i], OUTPUT); digitalWrite(relayPins[i], LOW); } // Sambungkan ke WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Menghubungkan ke WiFi..."); } Serial.println("Terhubung ke WiFi"); // Tampilkan alamat IP yang diperoleh dari router/hotspot Serial.print("Alamat IP: "); Serial.println(WiFi.localIP()); // Sambungkan ke broker MQTT client.setServer(mqtt_server, mqtt_port); // Gunakan ini jika broker MQTT memerlukan otentikasi // client.setCredentials(mqtt_username, mqtt_password); // Langsung subscribe ke topik yang Anda inginkan client.setCallback(callback); client.subscribe("/myrelay/control"); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); unsigned long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; ++value; snprintf (msg, MSG_BUFFER_SIZE, "send data #%ld", value); Serial.print("Publish message: "); Serial.println(msg); client.publish("/myrelay/cnt", msg); } // Periksa status relay dan kendalikan relay di sini sesuai kebutuhan for (int i = 0; i < 8; i++) { // Contoh: Mengaktifkan relay jika status adalah 1, mematikan jika status adalah 0 int rlystat=relayStatus[i] == (1 ? HIGH : LOW); digitalWrite(relayPins[i], rlystat); // Serial.printf("status relay callback'%d': \n\r", rlystat); } } void callback(char* topic, byte* payload, unsigned int length) { // Serial.print("Pesan yang diterima pada topik '"); // Serial.print(topic); // Serial.print("': "); Serial.printf("Pesan yang diterima pada topik '%s': \n\r", topic); String message = ""; for (int i = 0; i < length; i++) { message += (char)payload[i]; } Serial.print("isi payload: "); Serial.println(message); // Periksa pesan dan ubah status relay sesuai kebutuhan if (strcmp(topic, "/myrelay/control") == 0) { int relayNumber = message.toInt(); if (relayNumber >= 0 && relayNumber < 8) { relayStatus[relayNumber] = 1 - relayStatus[relayNumber]; // Toggle relay status Serial.printf("status relay %d: arrayRLY %d: \n\r", relayNumber, relayStatus[relayNumber]); publishRelayStatus(relayNumber); } } } void publishRelayStatus(int relayNumber) { String topic = "/relay/status/" + String(relayNumber); String payload = String(relayStatus[relayNumber]); client.publish(topic.c_str(), payload.c_str()); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str())) { Serial.println("connected"); // Once connected, publish an announcement... client.publish("/myrelay/status", "Reconnect"); // ... and resubscribe client.subscribe("/myrelay/control"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } }