MQTT Subscribes to multiple topics

/*
 * MQTT connection using LOLIN ESP8266 D1 Mini Pro
 * Connects to WiFi, then MQTT broker (running on Raspberry Pi 3b)
 * Subscribes to multiple MQTT topics
 * Publishes an MQTT topic
 * 
* Created by Nick Sebring
* 05-03-2025
 */

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Connect to the WiFi
const char* ssid = "MySSID";
const char* password = "MyPassword!";
const char* mqtt_server = "192.168.#.###";

WiFiClient espClient;
PubSubClient client(espClient);

const int r1 = 0;
const int r2 = 4;
const int r3 = 5;
const int r4 = 14;



// ******************* REMOTE RELAY *****************************
void callback(char* topic, byte* payload, unsigned int length) {

  // Relay 1
  if (strcmp(topic, "R1") == 0) {
    for (int i = 0; i < length; i++) {
      char receivedChar = (char)payload[i];
      if (receivedChar == '0') {
        digitalWrite(r1, LOW);
        Serial.println(F("Relay 1 OFF"));
      }
      if (receivedChar == '1') {
        digitalWrite(r1, HIGH);
        Serial.println(F("Relay 1 ON"));
      }
    }
  }



  // Relay 2
  if (strcmp(topic, "R2") == 0) {
    for (int i = 0; i < length; i++) {
      char receivedChar = (char)payload[i];
      if (receivedChar == '0') {
        digitalWrite(r2, LOW);
        Serial.println(F("Relay 2 OFF"));
      }
      if (receivedChar == '1') {
        digitalWrite(r2, HIGH);
        Serial.println(F("Relay 2 ON"));
      }
    }
  }



  // Relay 3
  if (strcmp(topic, "R3") == 0) {
    for (int i = 0; i < length; i++) {
      char receivedChar = (char)payload[i];
      if (receivedChar == '0') {
        digitalWrite(r3, LOW);
        Serial.println(F("Relay 3 OFF"));
      }
      if (receivedChar == '1') {
        digitalWrite(r3, HIGH);
        Serial.println(F("Relay 3 ON"));
      }
    }
  }



  // Relay 4
  if (strcmp(topic, "R4") == 0) {
    for (int i = 0; i < length; i++) {
      char receivedChar = (char)payload[i];
      if (receivedChar == '0') {
        digitalWrite(r4, LOW);
        Serial.println(F("Relay 4 OFF"));
      }
      if (receivedChar == '1') {
        digitalWrite(r4, HIGH);
        Serial.println(F("Relay 4 ON"));
      }
    }
  }
}



void reconnect() {  // **********************************************************
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print(F("Contacting MQTT server..."));
    // Attempt to connect
    if (client.connect("RelayBank")) {  //assign a "client name".  Each wemos must have a unique name
      Serial.println(F("connected"));

      // ... SUBSCRIBE TO TOPICS
      client.subscribe("R1");
      client.subscribe("R2");
      client.subscribe("R3");
      client.subscribe("R4");


    } else {
      Serial.print(F("Failed to connect. "));
      Serial.println(F(" Attempting connection again in 3 seconds"));
      // Wait 3 seconds before retrying
      delay(3000);
    }
  }
}

void setup() {
  {
    Serial.begin(9600);
    client.setServer(mqtt_server, 1883);
    client.setCallback(callback);
    pinMode(r1, OUTPUT);
    digitalWrite(r1, LOW);  //  Turn off LED at startup

    pinMode(r2, OUTPUT);
    digitalWrite(r2, LOW);  //  Turn off LED at startup

    pinMode(r3, OUTPUT);
    digitalWrite(r3, LOW);  //  Turn off LED at startup

    pinMode(r4, OUTPUT);
    digitalWrite(r4, LOW);  //  Turn off LED at startup
  }


  // Connect to WiFinetwork
  Serial.println();
  Serial.println();
  Serial.print(F("Connecting to "));
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }
  Serial.println(F(""));
  Serial.println(F("WiFi connected"));
  // Print the IP address
  Serial.print(F("Local IP: "));
  Serial.println(WiFi.localIP());
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.publish("Outside/Temp", "140");  // Something like this


  //  delay(5000);  // Report sensor data every 5 seconds
  client.loop();
}

What is your question?

I think Showcase - Arduino Forum is not about asking questions...

1 Like

Ok.