Remade the ESP32 code. Fixed some bugs in the website.
This commit is contained in:
parent
837a3f09de
commit
1c361820c7
116
src/arduino/text_display/text_display.ino
Normal file
116
src/arduino/text_display/text_display.ino
Normal file
@ -0,0 +1,116 @@
|
||||
|
||||
// Example sketch which shows how to display some patterns
|
||||
// on a 64x32 LED matrix
|
||||
//
|
||||
|
||||
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
|
||||
#include <WiFi.h>
|
||||
#include <HTTPClient.h>
|
||||
|
||||
|
||||
#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module.
|
||||
#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module.
|
||||
#define PANEL_CHAIN 1 // Total number of panels chained one to another
|
||||
|
||||
//MatrixPanel_I2S_DMA dma_display;
|
||||
MatrixPanel_I2S_DMA *dma_display = nullptr;
|
||||
|
||||
void putPixel(int16_t x, int16_t y, uint16_t color) {
|
||||
dma_display->drawPixel(x, y, color);
|
||||
}
|
||||
|
||||
// Replace with your network credentials
|
||||
const char* ssid = "ssid";
|
||||
const char* password = "password";
|
||||
|
||||
void initWiFi() {
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.begin(ssid, password);
|
||||
Serial.print("Connecting to WiFi ..");
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
Serial.print('.');
|
||||
delay(1000);
|
||||
}
|
||||
Serial.println(WiFi.localIP());
|
||||
}
|
||||
|
||||
String serverName = "https://changethis.com/board/json/";
|
||||
|
||||
|
||||
|
||||
void setup() {
|
||||
initWiFi();
|
||||
// Module configuration
|
||||
HUB75_I2S_CFG mxconfig(
|
||||
PANEL_RES_X, // module width
|
||||
PANEL_RES_Y, // module height
|
||||
PANEL_CHAIN // Chain length
|
||||
);
|
||||
|
||||
|
||||
// Display Setup
|
||||
dma_display = new MatrixPanel_I2S_DMA(mxconfig);
|
||||
dma_display->begin();
|
||||
dma_display->setBrightness8(90); //0-255
|
||||
dma_display->clearScreen();
|
||||
|
||||
// fill the screen with 'black'
|
||||
dma_display->fillScreen(dma_display->color444(0, 0, 0));
|
||||
|
||||
}
|
||||
|
||||
|
||||
// the following variables are unsigned longs because the time, measured in
|
||||
// milliseconds, will quickly become a bigger number than can be stored in an int.
|
||||
unsigned long lastTime = 0;
|
||||
// Timer set to 10 minutes (600000)
|
||||
//unsigned long timerDelay = 600000;
|
||||
// Set timer to 5 seconds (5000)
|
||||
unsigned long timerDelay = 5000;
|
||||
|
||||
void loop() {
|
||||
|
||||
if ((millis() - lastTime) > timerDelay) {
|
||||
//Check WiFi connection status
|
||||
if(WiFi.status()== WL_CONNECTED){
|
||||
HTTPClient http;
|
||||
|
||||
String serverPath = serverName;
|
||||
|
||||
// Your Domain name with URL path or IP address with path
|
||||
http.begin(serverPath.c_str());
|
||||
|
||||
// If you need Node-RED/server authentication, insert user and password below
|
||||
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
|
||||
|
||||
// Send HTTP GET request
|
||||
int httpResponseCode = http.GET();
|
||||
|
||||
if (httpResponseCode>0) {
|
||||
Serial.print("HTTP Response code: ");
|
||||
Serial.println(httpResponseCode);
|
||||
String payload = http.getString();
|
||||
Serial.println(payload);
|
||||
}
|
||||
else {
|
||||
Serial.print("Error code: ");
|
||||
Serial.println(httpResponseCode);
|
||||
}
|
||||
// Free resources
|
||||
http.end();
|
||||
}
|
||||
else {
|
||||
Serial.println("WiFi Disconnected, trying to reconnect");
|
||||
WiFi.reconnect();
|
||||
}
|
||||
lastTime = millis();
|
||||
}
|
||||
}
|
||||
// animate by going through the colour wheel for the first two lines
|
||||
drawText(wheelval);
|
||||
wheelval +=1;
|
||||
|
||||
delay(20);
|
||||
|
||||
|
||||
}
|
@ -21,5 +21,6 @@ from website import views
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
path('board/', views.current_config),
|
||||
path('board/json/', views.current_board),
|
||||
path('board/<int:x>/<int:y>/<str:color>', views.update_board),
|
||||
]
|
||||
|
1
src/place/website/config.py
Normal file
1
src/place/website/config.py
Normal file
@ -0,0 +1 @@
|
||||
URL = "http://127.0.0.1:8000/board/"
|
@ -5,6 +5,8 @@ from django.http import HttpResponse
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from colour import Color
|
||||
from pytz import UTC
|
||||
from .config import URL
|
||||
|
||||
# Change these for your board
|
||||
BOARD_X = 64
|
||||
BOARD_Y = 32
|
||||
@ -17,11 +19,7 @@ BOARD_Y = 32
|
||||
|
||||
# Internal validation
|
||||
def validateBoard(x:int, y:int, board:dict, ip) -> bool:
|
||||
try:
|
||||
ip = RestrictedIP.objects.get(ip=ip)
|
||||
return "RESTRICTED"
|
||||
except ObjectDoesNotExist:
|
||||
pass
|
||||
|
||||
key_counter = 0 # Not using len for optimization purposes
|
||||
|
||||
for row in board:
|
||||
@ -48,12 +46,12 @@ def restrict_or_unrestrict(ip):
|
||||
# if banned for more than 1 minute, unban
|
||||
if timedelta.seconds > 60:
|
||||
ip.delete()
|
||||
return "ALLOWED"
|
||||
return "SUCESS"
|
||||
return "STILL RESTRICTED"
|
||||
except ObjectDoesNotExist:
|
||||
instance = RestrictedIP(ip=ip, time_added=datetime.now())
|
||||
instance.save()
|
||||
return "RESTRICTION"
|
||||
return "SUCCESS"
|
||||
|
||||
# Internal board class
|
||||
class localBoard:
|
||||
@ -83,7 +81,7 @@ class localBoard:
|
||||
instance.save()
|
||||
self.board = Board.objects.latest("update_time")
|
||||
return "SUCCESS"
|
||||
|
||||
|
||||
def HTML(self) -> str:
|
||||
board = self.getBoard()
|
||||
style = """
|
||||
@ -100,30 +98,38 @@ class localBoard:
|
||||
</style>
|
||||
"""
|
||||
|
||||
selected_pixel = """
|
||||
selected_pixel = f"""
|
||||
<script>
|
||||
async function selected_pixel(element) {
|
||||
async function selected_pixel(element) {{
|
||||
var color = document.getElementById("color_picker").value;
|
||||
|
||||
var arr = element.id.split("x")[1].split("y");
|
||||
var x = arr[0];
|
||||
var y = arr[1];
|
||||
|
||||
var url = "http://127.0.0.1:8000/board/" + x + "/" + y + "/" + color.replace("#", "%23");
|
||||
var url = "{URL}" + x + "/" + y + "/" + color.replace("#", "%23");
|
||||
let response = await fetch(url);
|
||||
let result = await response.text();
|
||||
console.log(result);
|
||||
if (result != "RESTRICTED") {
|
||||
if (result != "RESTRICTED") {{
|
||||
element.style.backgroundColor = color;
|
||||
}
|
||||
else {
|
||||
}}
|
||||
else {{
|
||||
alert("You have placed your pixel. Please wait.");
|
||||
}
|
||||
}
|
||||
}}
|
||||
}}
|
||||
</script>
|
||||
"""
|
||||
|
||||
html = f"<html><head><title>Ballin</title></head>{style}<body>{selected_pixel}<table><form>"
|
||||
reload_page = """
|
||||
<script>
|
||||
function reload_page() {
|
||||
location.reload();
|
||||
}
|
||||
|
||||
setTimeout(reload_page, 10000);
|
||||
</script>
|
||||
"""
|
||||
html = f"<html><head><title>Ballin</title>{reload_page}</head>{style}<body>{selected_pixel}<table><form>"
|
||||
for row in board:
|
||||
html += "<tr>"
|
||||
x = 0
|
||||
@ -132,7 +138,7 @@ class localBoard:
|
||||
x += 1
|
||||
html += "</tr>"
|
||||
html += "</table><div class='color'><input type='color' id='color_picker'><p color='white' ><------ pick ur color</p></div></body></html>"
|
||||
return html
|
||||
return html
|
||||
|
||||
# Publicly visible functions
|
||||
def update_board(request, x, y, color):
|
||||
@ -144,7 +150,7 @@ def update_board(request, x, y, color):
|
||||
board[str(y)][int(x)] = color
|
||||
|
||||
ip = restrict_or_unrestrict(request.META["REMOTE_ADDR"])
|
||||
if ip == "STILL RESTRICTED":
|
||||
if ip != "SUCCESS":
|
||||
return HttpResponse("RESTRICTED")
|
||||
res = localBoard().setBoard(board, request.META["REMOTE_ADDR"])
|
||||
return HttpResponse(f"board: {str(res)}, ip: {ip}")
|
||||
@ -153,3 +159,6 @@ def current_config(request):
|
||||
html = localBoard().HTML()
|
||||
return HttpResponse(html)
|
||||
|
||||
def json_board(request):
|
||||
board = localBoard().getBoard()
|
||||
return HttpResponse(board)
|
||||
|
Loading…
x
Reference in New Issue
Block a user