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