// Use the MD_MAX72XX library to Print some text on the display // // Demonstrates the use of the library to print text. // // User can enter text on the serial monitor and this will display as a // message on the display. // Library doc https://majicdesigns.github.io/MD_MAX72XX/class_m_d___m_a_x72_x_x.html // // THIS TEST CASE IS SUPPOSE TO BE RUN WITH ESP8266 (Wemos D1 Mini) #include #include #define PRINT(s, v) { Serial.print(F(s)); Serial.print(v); } // Define the number of devices we have in the chain and the hardware interface // NOTE: These pin numbers will probably not work with your hardware and may // need to be adapted #define HARDWARE_TYPE MD_MAX72XX::DR1CR0RR0_HW #define MAX_DEVICES 8 #define CLK_PIN D2 // or SCK #define DATA_PIN D3 // or MOSI #define CS_PIN D4 // or SS // SPI hardware interface //MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); // Arbitrary pins MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); // Text parameters #define CHAR_SPACING 1 // pixels between characters // Global message buffers shared by Serial and Scrolling functions #define BUF_SIZE 75 char message[BUF_SIZE] = "FuwawaMococo"; bool newMessageAvailable = true; void readSerial(void) { static uint8_t putIndex = 0; while (Serial.available()) { message[putIndex] = (char)Serial.read(); if ((message[putIndex] == '\n') || (putIndex >= BUF_SIZE-3)) // end of message character or full buffer { // put in a message separator and end the string message[putIndex] = '\0'; // restart the index for next filling spree and flag we have a message waiting putIndex = 0; newMessageAvailable = true; } else // Just save the next char in next location message[putIndex++]; } } void printText(uint8_t modStart, uint8_t modEnd, char *pMsg) // Print the text string to the LED matrix modules specified. // Message area is padded with blank columns after printing. { uint8_t state = 0; uint8_t curLen; uint16_t showLen; uint8_t cBuf[8]; int16_t col = ((modEnd + 1) * COL_SIZE) - 1; mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::OFF); do // finite state machine to print the characters in the space available { switch(state) { case 0: // Load the next character from the font table // if we reached end of message, reset the message pointer if (*pMsg == '\0') { showLen = col - (modEnd * COL_SIZE); // padding characters state = 2; break; } // retrieve the next character form the font file showLen = mx.getChar(*pMsg++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf); curLen = 0; state++; // !! deliberately fall through to next state to start displaying case 1: // display the next part of the character mx.setColumn(col--, cBuf[curLen++]); // done with font character, now display the space between chars if (curLen == showLen) { showLen = CHAR_SPACING; state = 2; } break; case 2: // initialize state for displaying empty columns curLen = 0; state++; // fall through case 3: // display inter-character spacing or end of message padding (blank columns) mx.setColumn(col--, 0); curLen++; if (curLen == showLen) state = 0; break; default: col = -1; // this definitely ends the do loop } } while (col >= (modStart * COL_SIZE)); mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::ON); } void setup() { mx.begin(); Serial.begin(57600); Serial.print("\n[MD_MAX72XX Message Display]\nType a message for the display\nEnd message line with a newline"); } void loop() { readSerial(); if (newMessageAvailable) { PRINT("\nProcessing new message: ", message); printText(0, MAX_DEVICES-1, message); newMessageAvailable = false; } }