Skip to content

Instantly share code, notes, and snippets.

@lamegaton
Created October 17, 2018 22:50
Show Gist options
  • Save lamegaton/dc64d487822ad2bd73d733cfbafc89ce to your computer and use it in GitHub Desktop.
Save lamegaton/dc64d487822ad2bd73d733cfbafc89ce to your computer and use it in GitHub Desktop.
use ESP8266 + Max7219 LED matrix, the speed is very slow, need to be improved
// credits to https://github.com/MajicDesigns/MD_MAX72XX
#include <ESP8266WiFi.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
//Declare hardware
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN 14 // or SCK
#define DATA_PIN 13 // or MOSI
#define CS_PIN 15 // or SS
// Global message buffers shared by Wifi and Scrolling functions
#define CHAR_SPACING 1 // pixels between characters
// Global message buffers shared by Serial and Scrolling functions
#define BUF_SIZE 75
char curMessage[BUF_SIZE];
char newMessage[BUF_SIZE];
bool newMessageAvailable = false;
uint16_t scrollDelay; // in milliseconds
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
WiFiServer server(80); //Initialize the server on Port 80
char WebResponse[] = "HTTP/1.1 200 OK\nContent-Type: text/html\n\n";
char WebPage[] =
"<!DOCTYPE html>" \
"<html>" \
"<head>" \
"<title>Testing Button</title>" \
"</head>" \
"<br><input type=\"button\" name=\"b1\" value=\"Turn Left\" onclick=\"location.href='/left'\">" \
"<br><br><br>" \
"<input type=\"button\" name=\"b1\" value=\"Turn Right\" onclick=\"location.href='/right'\">" \
"<br><br><br>" \
"<input type=\"button\" name=\"b1\" value=\"Turn EM\" onclick=\"location.href='/em'\">" \
"</html>";
void scrollDataSink(uint8_t dev, MD_MAX72XX::transformType_t t, uint8_t col)
// Callback function for data that is being scrolled off the display
{
#if PRINT_CALLBACK
Serial.print("\n cb ");
Serial.print(dev);
Serial.print(' ');
Serial.print(t);
Serial.print(' ');
Serial.println(col);
#endif
}
uint8_t scrollDataSource(uint8_t dev, MD_MAX72XX::transformType_t t)
// Callback function for data that is required for scrolling into the display
{
static char *p = curMessage;
static uint8_t state = 0;
static uint8_t curLen, showLen;
static uint8_t cBuf[8];
uint8_t colData;
// finite state machine to control what we do on the callback
switch(state)
{
case 0: // Load the next character from the font table
showLen = mx.getChar(*p++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf);
curLen = 0;
state++;
// if we reached end of message, reset the message pointer
if (*p == '\0')
{
p = curMessage; // reset the pointer to start of message
if (newMessageAvailable) // there is a new message waiting
{
strcpy(curMessage, newMessage); // copy it in
newMessageAvailable = false;
}
}
// !! deliberately fall through to next state to start displaying
case 1: // display the next part of the character
colData = cBuf[curLen++];
if (curLen == showLen)
{
showLen = CHAR_SPACING;
curLen = 0;
state = 2;
}
break;
case 2: // display inter-character spacing (blank column)
colData = 0;
if (curLen == showLen)
state = 0;
curLen++;
break;
default:
state = 0;
}
return(colData);
}
void scrollText(void)
{
static uint32_t prevTime = 0;
// Is it time to scroll the text?
if (millis()-prevTime >= scrollDelay)
{
mx.transform(MD_MAX72XX::TSL); // scroll along - the callback will load all the data
prevTime = millis(); // starting point for next time
}
}
void setup() {
WiFi.mode(WIFI_AP); //Our ESP8266-12E is an AccessPoint
WiFi.softAP("O", "123456789"); // Provide the (SSID, password); .
server.begin(); // Start the HTTP Server
Serial.begin(115200);
// Display initialization
mx.begin();
mx.setShiftDataInCallback(scrollDataSource);
mx.setShiftDataOutCallback(scrollDataSink);
strcpy(curMessage, "1010");
newMessage[0] = '\0';
IPAddress HTTPS_ServerIP = WiFi.softAPIP();//obtain the IP of the server
Serial.print("Server IP is: \n");
Serial.print(HTTPS_ServerIP);
}
void loop() {
//Read what the browser has sent into a String class and print the request to the monitor
WiFiClient client = server.available();//Gets a client that is connected to the server and has data available for reading.
//String request = client.readString();
String request1 = client.readStringUntil('\r');
//Looking under the hood
//Serial.println(request);
//Serial.println(request1);
if(request1.indexOf("/left")!= -1){//if it finds /left it will print yes
Serial.println("send left babe");
strcpy(curMessage, "<<<<");
}
else if(request1.indexOf("/right")!= -1){
Serial.println("send right babe");
strcpy(curMessage, ">>>>");
}
else if(request1.indexOf("/em")!= -1){
Serial.println("send em");
strcpy(curMessage, "ERR!");
}
// //HTML document
// String s = "HTTP/1.1 200 OK\r\n";
// s +="Connect-Type: text/html\r";
// s +="<!DOCUMENT HTML>\r\n<html>\r\n";
// s +="<br><input type=\"button\" name=\"b1\" value=\"Turn Left\" onclick=\"location.href='/left'\">";
// s +="<br><br><br>";
// s +="<input type=\"button\" name=\"b1\" value=\"Turn Right\" onclick=\"location.href='/right'\">";
// s +="</html>\n" ;
client.flush(); //clear all info
client.print(WebResponse);
client.print(WebPage);
//Serial.println("Client disonnected"); //Looking under the hood
scrollDelay = 0;
scrollText();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment