123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- // 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 <MD_MAX72xx.h>
- #include <SPI.h>
- #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;
- }
- }
|