Introduction: MAX7219 LED Matrix MQTT Using Esp8266
I was trying to connect my MAX7219 LED display to an MQTT server and receive a text from the MQTT subscription to display.
but I didn't get any suitable code on the internet, so I started building my own...
and the result comes quite well...
- you can display any text on led display
- you can adjust intensity of the display
- you can set the scroll speed
Supplies
- An esp8266 development board. (my case it's NODE MCU v1.0)
- MAX7219 LED Matrix Display.
Software needed:
- Arduino IDE.
- An MQTT server. (my case Mosquitto)
Library required:
- ESP8266WiFi.h
- MD_MAX72xx.h
- EspMQTTClient.h
Step 1: Setup Arduino IDE for Esp8266 Development
open preferences of Arduino then paste the below URL in Aditional Boards Manager URLs:
https://arduino.esp8266.com/stable/package_esp8266com_index.json
then Tools > Boards > Boards Manager and search for esp8266 and install it.
now your Arduino ide is ready for esp8266 development.
Step 2: Download External Libraries
now we need some libraries for MAX7219 and MQTT Client.
let's download and set up the libraries
navigate to Sketch > Include Library > Manage Libraries on Arduino IDE
and search for EspMQTTClient and click Install
NB: Install all dependent libraries, it's important
Again search for MD_MAX72xx and click Install
Step 3: Write Some Code Now
Now paste the below code
#include <ESP8266WiFi.h> #include <MD_MAX72xx.h> #include <SPI.h> #include "EspMQTTClient.h" #define MAX_DEVICES 4 // your device count #define CLK_PIN D5 // or SCK #define DATA_PIN D7 // or MOSI #define CS_PIN D4 // or SS // you can set it to any pin #define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW // change according to your display type MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); const uint8_t MESG_SIZE = 255; const uint8_t CHAR_SPACING = 1; uint8_t SCROLL_DELAY = 75; // default scroll delay uint8_t INTENSITY = 5; // default intensity char curMessage[MESG_SIZE]; char newMessage[MESG_SIZE]; bool newMessageAvailable = false; void scrollDataSink(uint8_t dev, MD_MAX72XX::transformType_t t, uint8_t col) {} uint8_t scrollDataSource(uint8_t dev, MD_MAX72XX::transformType_t t) { static enum { S_IDLE, S_NEXT_CHAR, S_SHOW_CHAR, S_SHOW_SPACE } state = S_IDLE; static char *p; static uint16_t curLen, showLen; static uint8_t cBuf[8]; uint8_t colData = 0; switch (state) { case S_IDLE: p = curMessage; if (newMessageAvailable) { strcpy(curMessage, newMessage); newMessageAvailable = false; } state = S_NEXT_CHAR; break; case S_NEXT_CHAR: if (*p == '\0') state = S_IDLE; else { showLen = mx.getChar(*p++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf); curLen = 0; state = S_SHOW_CHAR; } break; case S_SHOW_CHAR: colData = cBuf[curLen++]; if (curLen < showLen) break; showLen = (*p != '\0' ? CHAR_SPACING : (MAX_DEVICES*COL_SIZE)/2); curLen = 0; state = S_SHOW_SPACE; case S_SHOW_SPACE: curLen++; if (curLen == showLen) state = S_NEXT_CHAR; break; default: state = S_IDLE; } return(colData); } EspMQTTClient client( "YOUR_SSID", "YOUR_WIFI_PASSWORD", "YOUR_MQTT_SERVER", // MQTT Broker server ip "YOUR_MQTT_USER", // Can be omitted if not needed "YOUR_MQTT_PASSWORD", // Can be omitted if not needed "MAX7219_DISPLAY", // Client name that uniquely identify your device 1883 // The MQTT port, default to 1883. this line can be omitted ); void scrollText(void) { static uint32_t prevTime = 0; // Is it time to scroll the text? if (millis() - prevTime >= SCROLL_DELAY) { mx.transform(MD_MAX72XX::TSL); // scroll along - the callback will load all the data prevTime = millis(); // starting point for next time } } void setup() { Serial.begin(115200); mx.begin(); mx.control(MD_MAX72XX::INTENSITY, INTENSITY); mx.setShiftDataInCallback(scrollDataSource); mx.setShiftDataOutCallback(scrollDataSink); curMessage[0] = newMessage[0] = '\0'; sprintf(curMessage, "Smart Display"); } void onConnectionEstablished() { // MQTT subscription topic for display text client.subscribe("leddisplay/text", [](const String & payload) { sprintf(curMessage, payload.c_str()); }); <p>// MQTT subscription topic for display intensity controll</p> client.subscribe("leddisplay/intensity", [](const String & payload) { mx.control(MD_MAX72XX::INTENSITY, payload.toInt()); }); // MQTT subscription topic for display scroll speed controll client.subscribe("leddisplay/scroll", [](const String & payload) { SCROLL_DELAY = payload.toInt(); }); } void loop() { client.loop(); scrollText(); }
For detail information, refer to this repository
Step 4: Circuit Diagram
connect MAX7219 display with NODE MCU
Step 5: Upload Code to Esp8266
now choose your correct board type and serial port then hit upload.
Step 6: Test Everything
if everything goes correct then your esp8266 will be connected to your MQTT server.
now, if anything will be published on leddisplay/text topic that will be displayed.
{ topic: "leddisplay/text", payload: "your message here" }
if you want to set the intensity of display
{ topic: "leddisplay/intensity", payload: "2" // max is 15 and min 0 }
if you want to set the scroll speed of display
{ topic: "leddisplay/scroll", payload: "100" // max is 255 and min 0 }
Happy coding