#include <ESP8266WiFi.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
Activación de instrucciones de depuración para la salida serie
#define Depurar 0
#ifデバッグ
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x);}
#define PRINTS(x) Serial.print(F(x))
#define PRINTX(x) Serial.println(x, HEX)
#else
#defineプリント, x)
#defineプリント(X)
#define Imprimir X(x)
#endif
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 8
#define CS_PIN 15 // o SS
Hardware SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
Parámetros de inicio de sesión WiFi – Nombre de red y contraseña
constante chamuscar* SSID = “***********”;
constante chamuscar* contraseña = “***********”;
Objetos y parámetros del servidor WiFi
Servidor WiFi servidor(80);
Parámetros de desplazamiento
uint8_t Retardo de fotograma = 25; Valor de retardo de fotograma predeterminado
textEffect_t Efectos de desplazamiento = PA_SCROLL_LEFT;
Búfer de mensajes global compartido por Wifi y función de desplazamiento
#define BUF_SIZE 512
chamuscar Mensaje de curación[BUF_SIZE];
chamuscar Nuevo mensaje[BUF_SIZE];
Booleano Nuevos mensajes disponibles = falso;
constante chamuscar Respuesta web[] = “HTTP/1.1 200 OK\nTipo de contenido: text/html\n\n”;
constante chamuscar página web[] =
“<! DOCTYPE html>” \
“<html>” \
“< cabeza >” \
“< Title> MajicDesigns Test Page </Title>” \
“< guión>” \
“Strine = \“\“;” \
“función Datos transmitidos()” \
“{” \
“ Sin caché = \“/&nocache=\” + Math.random() * 1000000;” \
“ variable pedir = Novedades XMLHttpRequest();” \
“ Strine = \“&MSG=\” + document.getElementById(\”data_form\”).message.value;” \
“ Strine = Strine + \“/&SD=\” + document.getElementById(\”data_form\”).scroll type.value;” \
“ Strine = Strine + \“/&I=\” + document.getElementById(\”data_form\”).” \
“ Strine = Strine + \“/&SP=\” + document.getElementById(\”data_form\”).speed.value;” \
” request.open(\”GET\”, strLine + nocache, false);” \
” request.send(null);” \
“}” \
“</sCripta>“ \
“</Jefe >” \
“< >” \
“<p><b>Tablón de anuncios inteligente</b></p>” \
“<form id=\”data_form\” name=\”frmText\”>” \
“< Label > Message: <br>< Input Type=\”Text\” name=\”Message\” Max=\”255\”></label>” \
“<br><br>” \
“< input type = \”radio\” name = \”inverted\” value = \”0\” Check > Normal” \
“< input type = \”radio\” name = \”invert\” value = \”1\”> inverted” \
“<br>” \
“< input type = \”radio\” name = \”scroll type\” value = \”L\” Check> Scroll Left” \
“< input type = \”radio\” name = \”scroll type\” value = \”R\”> scroll right” \
“<br><br>” \
“< etiqueta > velocidad: <br> rápido < tipo de entrada =\”Range\” name=\”Speed\”Minimum=\”10\” Max=\”200\”>Slow”\
“<br>” \
“</Formulario >” \
“<br>” \
“< Input Type=\”Send\” Value=\”Send Data\” onclick=\”Outgoing Data()\”>” \
“</> corporal” \
“</html>”;
constante chamuscar *err2Str(wl_status_t código)
{
interruptor (código)
{
caso WL_IDLE_STATUS: devolución(“Ídolo”); quebrar; WiFi está cambiando entre estados
caso WL_NO_SSID_AVAIL: devolución(「NO_SSID_AVAIL」); quebrar; El SSID configurado en el caso no es accesible
caso WL_CONNECTED: devolución(“Conectado”); quebrar; Conexión establecida correctamente
caso WL_CONNECT_FAILED: devolución(「CONNECT_FAILED」); quebrar; Contraseña incorrecta
caso WL_DISCONNECTED: devolución(「CONNECT_FAILED」); quebrar; El módulo no está configurado en modo estación
predeterminado: devolución(“??”);
}
}
uint8_t htui(chamuscar c)
{
c = A la parte superior(c);
Si ((c >= ‘0’) && (c <= ‘9’)) return(c – ‘0’);
Si ((c >= “Oh.”) && (c <= ‘F’)) return(c – ‘A’ + 0xa);
devolución(0);
}
No válido Datos adquiridos(chamuscar *szMesg, uint16_t Len)
El mensaje puede contener los siguientes datos:
Nuevo texto (/&MSG=)
Dirección de desplazamiento (/&SD=)
Invertir (/&I=)
Velocidad (/&SP=)
{
chamuscar *pStart, *Pend; Punteros al principio y al final del texto
Revisa tus mensajes de texto
pStart = strstr(szMesg, “/&MSG=”);
Si (pStart != nulo)
{
chamuscar *Teletipo = Nuevo mensaje;
pStart += 6; Saltar al principio de los datos
Pend = strstr(pStart, “/&”);
Si (Pend != nulo)
{
mientras (pStart != Pend)
{
Si ((*pStart == ‘%’) && isxdigit(*(pStart + 1)))
{
Reemplace el código hexadecimal para %xx con caracteres ASCII.
la letra c = 0;
pStart++;
c += (htui(*pStart++) << 4);
c += htui(*pStart++);
*Teletipo++ = c;
}
de otra manera
*Teletipo++ = *pStart++;
}
*Teletipo = ‘\0’; Terminar la cadena
Nuevos mensajes disponibles = (Colar(Nuevo mensaje) != 0);
Impresión(“\nNuevo mensaje: “, Nuevo mensaje);
}
}
Comprobar la dirección de desplazamiento
pStart = strstr(szMesg, “/&SD=”);
Si (pStart != nulo)
{
pStart += 5; Saltar al principio de los datos
Impresión(“\nDirección de desplazamiento: “, *pStart);
Efectos de desplazamiento = (*pStart == ‘R’ ? PA_SCROLL_RIGHT : PA_SCROLL_LEFT);
P.Establecer efectos de texto(Efectos de desplazamiento, Efectos de desplazamiento);
P.Restablecer pantalla();
}
Comprobar la inversión
pStart = strstr(szMesg, “/&I=”);
Si (pStart != nulo)
{
pStart += 4; Saltar al principio de los datos
Impresión(“\nModo inverso: “, *pStart);
P.Establecer volteo(*pStart == ‘1’);
}
Comprueba la velocidad
pStart = strstr(szMesg, “/&SP=”);
Si (pStart != nulo)
{
pStart += 5; Saltar al principio de los datos
int16_t velocidad = Atoy(pStart);
Impresión(“\nVelocidad: “, P.Obtener velocidad());
P.Establecer velocidad(velocidad);
Retardo de fotograma = velocidad;
}
}
No válido Manejar WiFi(No válido)
{
estático Enumeraciones { S_IDLE, S_WAIT_CONN, S_READ, S_EXTRACT, S_RESPONSE, S_DISCONN } estado = S_IDLE;
estático chamuscar szBuf[1024];
estático uint16_t idxBuf = 0;
estático Cliente WiFi cliente;
estático uint32_t Inicio de la hora;
interruptor (estado)
{
caso S_IDLE: inicialización
Impresión(“\nS_IDLE”);
idxBuf = 0;
estado = S_WAIT_CONN;
quebrar;
caso S_WAIT_CONN: Esperando la conexión
{
cliente = servidor.disponible();
Si (!cliente) quebrar;
Si (!cliente.conexión()) quebrar;
#ifデバッグ
chamuscar szTxt[20];
carrera(szTxt, “%03D:%03D:%03D:%03D”, cliente.IP remota()[0], cliente.IP remota()[1], cliente.IP remota()[2], cliente.IP remota()[3]);
Impresión(“\nNuevo cliente @ “, szTxt);
#endif
Inicio de la hora = Milis();
estado = S_READ;
}
quebrar;
caso S_READ: Obtener la primera fila de datos
Impresión(“\nS_READ “);
mientras (cliente.disponible())
{
chamuscar c = cliente.leer();
Si ((c == ‘\r’) || (c == ‘\n’))
{
szBuf[idxBuf] = ‘\0’;
cliente.flash();
Impresión(“\nRecv: “, szBuf);
estado = S_EXTRACT;
}
de otra manera
szBuf[idxBuf++] = (chamuscar)c;
}
Si (Milis() – Inicio de la hora > 1000)
{
Impresión(“\nTiempo de espera de espera”);
estado = S_DISCONN;
}
quebrar;
caso S_EXTRACT: Extracción de datos
Impresión(“\nS_EXTRACT”);
Extraer una cadena del mensaje (si la hay)
Datos adquiridos(szBuf, BUF_SIZE);
estado = S_RESPONSE;
quebrar;
caso S_RESPONSE: Enviar una respuesta al cliente
Impresión(“\nS_RESPONSE”);
Devolver la respuesta al cliente (página Web)
cliente.Impresión(Respuesta web);
cliente.Impresión(página web);
estado = S_DISCONN;
quebrar;
caso S_DISCONN: Desconectar un cliente
Impresión(“\nS_DISCONN”);
cliente.flash();
cliente.parar();
estado = S_IDLE;
quebrar;
predeterminado: estado = S_IDLE;
}
}
No válido arreglo()
{
serial.empezar(57600);
Impresión(“\n[MD_Parola WiFi Message Display]\nIntroduzca un mensaje de desplazamiento desde su navegador de Internet”);
P.empezar();
P.Establecer fuerza(0);
P.Mostrar claro();
P.Suspensión de pantalla(falso);
P.Desplazamiento de pantalla(Mensaje de curación, PA_LEFT, Efectos de desplazamiento, Retardo de fotograma);
curMessage[0] = Nuevo mensaje[0] = ‘\0’;
Conéctese a una red WiFi e inicialícela
Impresión(“\nDestino”, SSID);
LAN inalámbrica.empezar(SSID, contraseña);
mientras (LAN inalámbrica.posición() != WL_CONNECTED)
{
Impresión(“\n”, err2Str(LAN inalámbrica.posición()));
demorar(500);
}
Impresión(“\nConexión WiFi”);
Inicio del servidor
servidor.empezar();
Impresión(“\nServer iniciado”);
Establecer el primer mensaje como dirección IP
carrera(Mensaje de curación, “%03D:%03D:%03D:%03D”, LAN inalámbrica.Local IP()[0], LAN inalámbrica.Local IP()[1], LAN inalámbrica.Local IP()[2], LAN inalámbrica.Local IP()[3]);
Impresión(“\nIP asignada”, Mensaje de curación);
}
No válido bucle()
{
Manejar WiFi();
Si (P.Mostrar animación())
{
Si (Nuevos mensajes disponibles)
{
Stracpy(Mensaje de curación, Nuevo mensaje);
Nuevos mensajes disponibles = falso;
}
P.Restablecer pantalla();
}
}