Created
October 17, 2018 22:50
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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