First commit

This commit is contained in:
maks_gein 2025-02-17 19:47:18 +03:00
parent 81bcb27e30
commit e0016201bc
2 changed files with 77 additions and 42 deletions

View File

@ -4,4 +4,12 @@
+Edit text in real time via HomeAssistiant +Edit text in real time via HomeAssistiant
+Split sentences into lines(features) +Split sentences into lines(features)
+Enable/disable text scrolling (features) +Enable/disable text scrolling (features)
+Add a drawing as a binary image (features) +Add a drawing as a binary image (features)
+State of panel
+Remote panel on/off
#Docs for API
*Endpoints
+10.131.170.4 - the local static IP
+/api/text - endpoint for editing text (POST)
+/api/led - endpint for on/off panel (POST)
+/api/led - endpoint for check on/off panel (GET), return "{"led":"true"}" if panel ON and "{"led":"false"}" if panel OFF

109
panel.ino
View File

@ -8,14 +8,15 @@
#define DISPLAYS_ACROSS 1 #define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1 #define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
bool panel = true;
const char* ssid = "SKBKIT"; const char* ssid = "SKBKIT";
const char* password = "skbkit2024"; const char* password = "skbkit2024";
WebServer server(80); WebServer server(80);
IPAddress staticIP(10,131,170,4); IPAddress staticIP(10, 131, 170, 4);
IPAddress gateway(10,131,170,1); IPAddress gateway(10, 131, 170, 1);
IPAddress subnet(255,255,255,0); IPAddress subnet(255, 255, 255, 0);
String displayText = "Привет из СКБ \"КИТ\""; String displayText = "Привет из СКБ \"КИТ\"";
//String displayText = "Пизда с членом разлучились("; //String displayText = "Пизда с членом разлучились(";
@ -25,59 +26,85 @@ void IRAM_ATTR triggerScan() {
dmd.scanDisplayBySPI(); dmd.scanDisplayBySPI();
} }
void reader(){} void reader() {}
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
dmd.selectFont(Font_BOLD); dmd.selectFont(Font_BOLD);
WiFi.begin(ssid, password); WiFi.begin(ssid, password);
//WiFi.config(staticIP, gateway, subnet); //WiFi.config(staticIP, gateway, subnet);
if(!WiFi.config(staticIP, gateway, subnet)) { if (!WiFi.config(staticIP, gateway, subnet)) {
Serial.println("Failed to configure Static IP"); Serial.println("Failed to configure Static IP");
} else { } else {
Serial.println("Static IP configured!"); Serial.println("Static IP configured!");
} }
// if(!SPIFFS.begin()){ // if(!SPIFFS.begin()){
// Serial.print("An occurred ERROR"); // Serial.print("An occurred ERROR");
// log_e("OCCURRED ERROR"); // log_e("OCCURRED ERROR");
// return; // return;
// } // }
while (WiFi.status() != WL_CONNECTED) { while (WiFi.status() != WL_CONNECTED) {
delay(500); delay(500);
Serial.print("."); Serial.print(".");
} }
Serial.println("\nConnected to WiFi"); Serial.println("\nConnected to WiFi");
Serial.println(WiFi.localIP()); Serial.println(WiFi.localIP());
// Обрабатываем GET запрос для главной страницы с формой // Обрабатываем GET запрос для главной страницы с формой
server.on("/", HTTP_GET, []() { server.on("/", HTTP_GET, []() {
server.send(200, "text/html", panel = true;
"<!DOCTYPE html>" server.send(200, "text/html",
"<html lang='ru'>" "<!DOCTYPE html>"
"<head>" "<html lang='ru'>"
"<meta charset='UTF-8'>" "<head>"
"<title>Panel text</title>" "<meta charset='UTF-8'>"
"</head>" "<title>Panel text</title>"
"<body>" "</head>"
"<h2>Введите текст для отображения на экране:</h2>" "<body>"
"<form action='/api/text' method='post'><input name='text'><input type='submit'></form>" "<h2>Введите текст для отображения на экране:</h2>"
"</body>" "<form action='/api/text' method='post'><input name='text'><input type='submit'></form>"
"</html>"); "</body>"
"</html>");
});
server.on("/api/led", HTTP_GET, [](){
if(panel){
server.send(200, "application/json", "{\"state\": \"true\"}");
}else if(!panel){
server.send(200, "application/json", "{\"state\": \"false\"}");
};
});
server.on("/api/led", HTTP_POST, [](){
String panelState = server.arg("plain");
Serial.println(panelState);
if (panelState == "{\"led\": \"on\"}"){
Serial.println("Panel on!");
panel = true;
//scanDisplayBySPI();
}else if(panelState == "{\"led\": \"off\"}"){
panel = false;
Serial.println("Panel off!");
SPI.end();
}
server.send(200, "text/html", "");
}); });
// Обрабатываем POST запрос для изменения текста // Обрабатываем POST запрос для изменения текста
server.on("/api/text", HTTP_POST, []() { server.on("/api/text", HTTP_POST, []() {
if (server.hasArg("text")) { panel = true;
if (server.hasArg("text")) {
// Получаем текст с формы без преобразования в HTML-сущности // Получаем текст с формы без преобразования в HTML-сущности
displayText = server.arg("text"); displayText = server.arg("text");
} }
// Отправляем ответ с правильной кодировкой UTF-8 // Отправляем ответ с правильной кодировкой UTF-8
server.send(200, "text/html; charset=UTF-8", server.send(200, "text/html; charset=UTF-8",
"<html><body><h2>Text set to:</h2><p>" + displayText + "</p></body></html>"); "<html><body><h2>Text set to:</h2><p>" + displayText + "</p></body></html>");
}); });
server.begin(); server.begin();
@ -93,19 +120,19 @@ void setup() {
void loop() { void loop() {
server.handleClient(); // Обработка запросов от клиента server.handleClient(); // Обработка запросов от клиента
// Очистка экрана и вывод текста // // Очистка экрана и вывод текста
dmd.clearScreen(true); // dmd.clearScreen(true);
dmd.drawMarquee(displayText.c_str(), displayText.length(), (32 * DISPLAYS_ACROSS) - 1, 0); // dmd.drawMarquee(displayText.c_str(), displayText.length(), (32 * DISPLAYS_ACROSS) - 1, 0);
long start = millis(); // long start = millis();
long timer = start; // long timer = start;
boolean ret = false; // boolean ret = false;
while (!ret) { // while (!ret) {
if ((timer + 30) < millis()) { // if ((timer + 30) < millis()) {
ret = dmd.stepMarquee(-1, 0); // Прокрутка текста // ret = dmd.stepMarquee(-1, 0); // Прокрутка текста
timer = millis(); // timer = millis();
} // }
} // }
} }