Initial commit
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
.pio/
 | 
			
		||||
credentials.h
 | 
			
		||||
							
								
								
									
										22
									
								
								platformio.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								platformio.ini
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
; PlatformIO Project Configuration File
 | 
			
		||||
;
 | 
			
		||||
;   Build options: build flags, source filter
 | 
			
		||||
;   Upload options: custom upload port, speed and extra flags
 | 
			
		||||
;   Library options: dependencies, extra library storages
 | 
			
		||||
;   Advanced options: extra scripting
 | 
			
		||||
;
 | 
			
		||||
; Please visit documentation for the other options and examples
 | 
			
		||||
; https://docs.platformio.org/page/projectconf.html
 | 
			
		||||
 | 
			
		||||
[env]
 | 
			
		||||
platform = espressif8266
 | 
			
		||||
framework = arduino
 | 
			
		||||
monitor_speed = 115200
 | 
			
		||||
upload_speed = 500000
 | 
			
		||||
 | 
			
		||||
# Serial1 (sign data) maps to D4 by default
 | 
			
		||||
[env:d1_mini]
 | 
			
		||||
board = d1_mini
 | 
			
		||||
 | 
			
		||||
[env:nodemcuv2]
 | 
			
		||||
board = nodemcuv2
 | 
			
		||||
							
								
								
									
										8
									
								
								src/credentials.h.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/credentials.h.example
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
namespace credentials {
 | 
			
		||||
    const String ssid = "my SSID";
 | 
			
		||||
    const String psk = "my PSK";
 | 
			
		||||
 | 
			
		||||
    const String mdnsHostname = "led-marquee-sign";
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										52
									
								
								src/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/main.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
#include <ESP8266WiFiMulti.h>
 | 
			
		||||
#include <ESP8266mDNS.h>
 | 
			
		||||
#include <ESP8266WebServer.h>
 | 
			
		||||
 | 
			
		||||
#include "credentials.h"
 | 
			
		||||
#include "webserver.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
 | 
			
		||||
static ESP8266WiFiMulti wifiMulti;
 | 
			
		||||
 | 
			
		||||
void setup() {
 | 
			
		||||
    // serial console, for use via USB (also exposed to TXD0/RXD0 GPIOs)
 | 
			
		||||
    Serial.begin(115200);
 | 
			
		||||
 | 
			
		||||
    // transmit-only UART port, used for communication with the LED sign
 | 
			
		||||
    // the BAUD rate was deducued from the communication sent to the USB 12V UART adapter by the available Windows
 | 
			
		||||
    // software
 | 
			
		||||
    Serial1.begin(9600);
 | 
			
		||||
 | 
			
		||||
    // configure WiFi and connect to the network
 | 
			
		||||
    wifiMulti.addAP(credentials::ssid.c_str(), credentials::psk.c_str());
 | 
			
		||||
    Serial.println("Connecting to Wi-Fi network...");
 | 
			
		||||
    while (wifiMulti.run() != WL_CONNECTED) {
 | 
			
		||||
        delay(1000);
 | 
			
		||||
        Serial.print(".");
 | 
			
		||||
    }
 | 
			
		||||
    Serial.println();
 | 
			
		||||
    Serial.print("Connected to ");
 | 
			
		||||
    Serial.print(WiFi.SSID());
 | 
			
		||||
    Serial.print(", IP address: ");
 | 
			
		||||
    Serial.println(WiFi.localIP());
 | 
			
		||||
 | 
			
		||||
    // might be handy to have the IP written on the sign
 | 
			
		||||
    sendTextToSign(WiFi.localIP().toString());
 | 
			
		||||
 | 
			
		||||
    // publish this service using mDNS so that it's easy to find it in the LAN
 | 
			
		||||
    if (MDNS.begin(credentials::mdnsHostname)) {
 | 
			
		||||
        Serial.println("mDNS started up successfully");
 | 
			
		||||
    } else {
 | 
			
		||||
        Serial.println("Error: failed to start mDNS");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // configure HTTP endpoints
 | 
			
		||||
    configureWebServer();
 | 
			
		||||
 | 
			
		||||
    // don't forget to start the webserver!
 | 
			
		||||
    webServer.begin();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void loop() {
 | 
			
		||||
    webServer.handleClient();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								src/util.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/util.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
enum Brightness {
 | 
			
		||||
    Normal,
 | 
			
		||||
    Bright,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void sendTextToSign(String text, Brightness brightness = Bright) {
 | 
			
		||||
    // debugging
 | 
			
		||||
    Serial.print("Sending text \"");
 | 
			
		||||
    Serial.print(text);
 | 
			
		||||
    Serial.println("\"");
 | 
			
		||||
 | 
			
		||||
    // TODO: find out how the brightness attribute in the LED sign is encoded in the UART signal
 | 
			
		||||
    Serial1.print("f01A\\s");
 | 
			
		||||
    Serial1.print(text);
 | 
			
		||||
    Serial1.print("\r\r\r");
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										68
									
								
								src/webserver.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/webserver.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "util.h"
 | 
			
		||||
 | 
			
		||||
static ESP8266WebServer webServer(80);
 | 
			
		||||
 | 
			
		||||
// use an anonymous namespace for the module's "private" methods
 | 
			
		||||
// this prevents the methods from ending up in the global namespace
 | 
			
		||||
namespace {
 | 
			
		||||
    void handleNotFound() {
 | 
			
		||||
        webServer.send(404, "text/plain", "urm... nope");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void handleIndex() {
 | 
			
		||||
        String htmlText = R"(
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
    <head>
 | 
			
		||||
        <title>LED Marquee Sign Controller</title>
 | 
			
		||||
    </head>
 | 
			
		||||
 | 
			
		||||
    <body>
 | 
			
		||||
        <h1>LED Marquee Sign Controller</h1>
 | 
			
		||||
        <form action="/" method="post">
 | 
			
		||||
            <fieldset>
 | 
			
		||||
                <div>
 | 
			
		||||
                    <label for="text">Text to send:</label>
 | 
			
		||||
                    <input type="text" name="text">
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
                <div>
 | 
			
		||||
                    <label for="bright">Bright mode</label>
 | 
			
		||||
                    <input type="checkbox" name="bright">
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
                <div>
 | 
			
		||||
                    <button>Send</button>
 | 
			
		||||
                </div>
 | 
			
		||||
            </fieldset>
 | 
			
		||||
        </form>
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
        )";
 | 
			
		||||
        webServer.send(200, "text/html", htmlText);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void handleFormSend() {
 | 
			
		||||
        sendTextToSign("HELLO FORM");
 | 
			
		||||
 | 
			
		||||
        // redirect back to root page
 | 
			
		||||
        webServer.sendHeader("Location", "/");
 | 
			
		||||
        webServer.send(303);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // RESTful API endpoint -- returns a proper status code rather than a redirect
 | 
			
		||||
    void handleApiSend() {
 | 
			
		||||
        sendTextToSign("HELLO API");
 | 
			
		||||
        webServer.send(200, "text/plain", "ok");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void configureWebServer() {
 | 
			
		||||
    webServer.onNotFound(handleNotFound);
 | 
			
		||||
 | 
			
		||||
    webServer.on("/", HTTPMethod::HTTP_GET, handleIndex);
 | 
			
		||||
    webServer.on("/", HTTPMethod::HTTP_POST, handleFormSend);
 | 
			
		||||
    webServer.on("/send", HTTPMethod::HTTP_POST, handleApiSend);
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user