38 MQTT example

38.1 Intro
Each FireBeetle board connects to Wi-Fi and subscribes to an MQTT topic. Whenever a new message is published to the topic, the board receives it and changes the color of its built-in RGB LED accordingly.
38.1.1 MQTT Topic
The board listens to the following topic:
agrotech/mqtt_tutorial/LED
You can publish messages to this topic using an MQTT client, such as the MQTTX Web Client. Make sure to connect to the broker broker.emqx.io on port 1883.
38.1.2 Supported Commands
You can send color commands in various formats:
38.1.2.1 🔤 Named Colors
You can use full names or single-letter shorthands (case-insensitive):
| Command | Resulting Color |
|---|---|
red or r |
🔴 Red |
green or g |
🟢 Green |
blue or b |
🔵 Blue |
white or w |
⚪ White |
yellow or y |
🟡 Yellow |
cyan or c |
🟦 Cyan |
magenta or m |
🟣 Magenta |
off or black |
âš« LED Off |
38.1.2.2 🎨 Custom RGB Triplets
You can also send a custom color as a comma-separated RGB value, e.g.:
255,100,0
This would set the LED to an orange-like color. The values should range from 0 to 255.
This setup is ideal for remote visual feedback or synchronized color indicators across multiple ESP32 boards on the same MQTT topic.
38.2 LED subscribe
Download code#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_NeoPixel.h>
#define LED_PIN 5 // built-in WS2812 RGB on FireBeetle 2 = GPIO5 (D8)
#define NUM_LEDS 1
#define BRIGHTNESS 50
const char* ssid = "erez"; // <-- change this
const char* password = "arduino1"; // <-- change this
const char* mqttServer = "broker.emqx.io"; // <== NEW BROKER
int mqttPort = 1883;
const char* mqttTopic = "agrotech/mqtt_tutorial/LED";
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
String msgString;
void setColor(uint8_t r, uint8_t g, uint8_t b) {
strip.setPixelColor(0, strip.Color(r, g, b));
strip.show();
}
void parseColor(String color) {
color.trim();
color.toLowerCase();
// named or shorthand colors
if (color == "r" || color == "red") setColor(255, 0, 0);
else if (color == "g" || color == "green") setColor(0, 255, 0);
else if (color == "b" || color == "blue") setColor(0, 0, 255);
else if (color == "w" || color == "white") setColor(255, 255, 255);
else if (color == "y" || color == "yellow") setColor(255, 255, 0);
else if (color == "m" || color == "magenta") setColor(255, 0, 255);
else if (color == "c" || color == "cyan") setColor(0, 255, 255);
else if (color == "off" || color == "black") setColor(0, 0, 0);
else if (color.indexOf(',') != -1) {
// RGB triplet: "100,200,30"
int r = color.substring(0, color.indexOf(',')).toInt();
int g = color.substring(color.indexOf(',') + 1, color.lastIndexOf(',')).toInt();
int b = color.substring(color.lastIndexOf(',') + 1).toInt();
setColor(r, g, b);
}
else {
Serial.println("Unknown color command");
}
}
void callback(char* topic, byte* message, unsigned int length) {
msgString = String((char*)message, length);
Serial.print("MQTT message received: ");
Serial.println(msgString);
parseColor(msgString);
}
void setupMQTT() {
mqttClient.setServer(mqttServer, mqttPort);
mqttClient.setCallback(callback);
}
void reconnect() {
Serial.println("Connecting to MQTT Broker...");
while (!mqttClient.connected()) {
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (mqttClient.connect(clientId.c_str())) {
Serial.println("Connected to MQTT.");
mqttClient.subscribe(mqttTopic);
} else {
Serial.print(".");
delay(1000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi.");
strip.begin();
strip.setBrightness(BRIGHTNESS);
strip.show(); // off
setupMQTT();
}
void loop() {
if (!mqttClient.connected()) reconnect();
mqttClient.loop();
}