Via een website keuzes doorsturen naar LED scrol matrix
29 berichten
• Pagina 3 van 3 • 1, 2, 3
Re: Via een website keuzes doorsturen naar LED scrol matrix
Nico,
indien ik jouw if er bij zet en de teller++ (moest wel nog een ; achter ), dan wordt er helemaal niks meer getoond op het scherm.
Mvg,
Davy
indien ik jouw if er bij zet en de teller++ (moest wel nog een ; achter ), dan wordt er helemaal niks meer getoond op het scherm.
Mvg,
Davy
Advertisement
Re: Via een website keuzes doorsturen naar LED scrol matrix
OK, even stap per stap.
Ik zet de code in de loop in commentaar :
en ik zet in de handle_button functie de lijn updateDisplay erbij :
Als ik dit uitvoer, dan krijg ik bij het drukken op een knop de meest rechtse pixel kolom van de LED matrix die oplicht.
Druk ik opnieuw op de knop, dan worden dat 2 kolommen, en ga zo maar door.
Dus alles wordt opgebouwd langs rechts, elke klik 1 kolom meer.
Daarna even volgende geprobeerd. Nog steeds met de loop in commentaar.
In de functie updateDisplay zet ik een for lus :
Als ik dan bv op de knop "Drie" klik, krijg ik dit te zien :
Klik ik NOG een keer op de knop "Drie", dan zie ik dit
Mij lijkt dus de millis() functie toch erg belangrijk.
Ik dacht, laat me eens slim zijn. En copieer de code uit de loop in de updateDisplay
Helaas krijg ik dan hetzelfde effect als in het eerste voorbeeld, dus bij elke klik op de knop, wordt er 1 extra kolom van de tekst geschreven.
Ik ben er m.a.w. nog niet uit...
Mvg,
Davy
Ik zet de code in de loop in commentaar :
- Code: Alles selecteren
/* if (millis () - lastMoved >= MOVE_INTERVAL) {
updateDisplay (decodedMsg);
lastMoved = millis ();
}
delay(1);*/
en ik zet in de handle_button functie de lijn updateDisplay erbij :
- Code: Alles selecteren
void handle_button() {
if (reset == 0 ) {
msg = server.arg("tekst");
decodedMsg = decodeMessage(msg);
updateDisplay (decodedMsg);
}
server.send(200, "text/html", htmlMessage); // Send same page so they can send another msg
reset = 0;
}
Als ik dit uitvoer, dan krijg ik bij het drukken op een knop de meest rechtse pixel kolom van de LED matrix die oplicht.
Druk ik opnieuw op de knop, dan worden dat 2 kolommen, en ga zo maar door.
Dus alles wordt opgebouwd langs rechts, elke klik 1 kolom meer.
Daarna even volgende geprobeerd. Nog steeds met de loop in commentaar.
In de functie updateDisplay zet ik een for lus :
- Code: Alles selecteren
for (x = 0; x < chips * 8 ; x++) {
display.sendSmooth (char_array, messageOffset); //Display commands for the Matrix
if (messageOffset++ >= (int) (strlen (char_array) * 8))
messageOffset = - chips * 8;
}
Als ik dan bv op de knop "Drie" klik, krijg ik dit te zien :
Klik ik NOG een keer op de knop "Drie", dan zie ik dit
Mij lijkt dus de millis() functie toch erg belangrijk.
Ik dacht, laat me eens slim zijn. En copieer de code uit de loop in de updateDisplay
- Code: Alles selecteren
void updateDisplay (String m) {
String str = "This is my string";
int str_len = m.length() + 1;
char char_array[str_len];
m.toCharArray(char_array, str_len);
if (millis () - lastMoved >= MOVE_INTERVAL) {
display.sendSmooth (char_array, messageOffset); //Display commands for the Matrix
if (messageOffset++ >= (int) (strlen (char_array) * 8))
messageOffset = - chips * 8;
lastMoved = millis ();
}
delay(1);
}
Helaas krijg ik dan hetzelfde effect als in het eerste voorbeeld, dus bij elke klik op de knop, wordt er 1 extra kolom van de tekst geschreven.
Ik ben er m.a.w. nog niet uit...
Mvg,
Davy
Re: Via een website keuzes doorsturen naar LED scrol matrix
Na heel veel extra code er nog niet steeds uit.
Ik denk echter dat ik de code langzaamaan begin te begrijpen, zeker nu ik de "messageOffset" even uitgeprint heb.
Deze ziet er zo uit (in de originele code terug) :
Als ik dus een loop zou kunnen maken in de "updateDisplay" die dit simuleert, dan denk ik wel dat ik er langzaam zou moeten komen.
Dus weer effe verder zoeken.
Mvg,
Davy
Ik denk echter dat ik de code langzaamaan begin te begrijpen, zeker nu ik de "messageOffset" even uitgeprint heb.
Deze ziet er zo uit (in de originele code terug) :
- Code: Alles selecteren
-32
-31
-30
-29
-28
-27
-26
-25
-24
-23
-22
-21
-20
-19
-18
-17
-16
-15
-14
-13
-12
-11
-10
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
-32
-31
-30
-29
-28
-27
-26
-25
-24
-23
-22
-21
-20
-19
-18
-17
-16
-15
-14
-13
-12
-11
-10
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
Als ik dus een loop zou kunnen maken in de "updateDisplay" die dit simuleert, dan denk ik wel dat ik er langzaam zou moeten komen.
Dus weer effe verder zoeken.
Mvg,
Davy
Re: Via een website keuzes doorsturen naar LED scrol matrix
Sorry allemaal,
weer even wat te snel. Als ik de tekst "Dit is een test" neem, is de output van de messageOffset dit :
15 letters * 8 pixels = 120, dit komt ook terug in de output !
weer even wat te snel. Als ik de tekst "Dit is een test" neem, is de output van de messageOffset dit :
15 letters * 8 pixels = 120, dit komt ook terug in de output !
- Code: Alles selecteren
-32
-31
-30
-29
-28
-27
-26
-25
-24
-23
-22
-21
-20
-19
-18
-17
-16
-15
-14
-13
-12
-11
-10
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
-32
-31
-30
-29
-28
-27
-26
-25
-24
-23
-22
-21
-20
-19
-18
-17
-16
-15
-14
-13
-12
-11
-10
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
Re: Via een website keuzes doorsturen naar LED scrol matrix
OK, laatste actie die ik vandaag nog doe;
Nieuwe loop in de "updateDisplay" functie.
Dit LEEK te werken, één keer dan toch.
Daarna krijg ik de web pagina niet meer geopend.
Heb ik de Wemos vol laten lopen met data ? I don't know.
Op reset knopje, komt netjes de tekst in de Serial, maar de webpagina wil niet meer laden...
Nieuwe loop in de "updateDisplay" functie.
- Code: Alles selecteren
void updateDisplay (String m) {
String str = "This is my string";
int str_len = m.length() + 1;
char char_array[str_len];
m.toCharArray(char_array, str_len);
for (x = -32 ; x < (str_len * 8) ; x++) {
display.sendSmooth (char_array, x); //Display commands for the Matrix*/
Serial.println(x);
delay(10);
}
}
Dit LEEK te werken, één keer dan toch.
Daarna krijg ik de web pagina niet meer geopend.
Heb ik de Wemos vol laten lopen met data ? I don't know.
Op reset knopje, komt netjes de tekst in de Serial, maar de webpagina wil niet meer laden...
Re: Via een website keuzes doorsturen naar LED scrol matrix
Beste Davy,
Ik ben bang dat je na een pauze even weer terug moet naar je oorspronkelijke versie.
Wat je met de for loop maakt zit in je oorspronkelijke versie al in de standaard loop.
Je teller start eerst op nul. De teller stopt op tot het maximaal aantal pixels van het bericht.
Teller start vervolgens op-32 ( om de laatste verschuiving te doen en het schermpje dus leeg te maken,
Wat ik probeerde je te laten doen is zodra de messageOfffset één regel klaar heeft de teller te verhogen.
In mijn voorbeeld had messageOffset nog op 0 afgevraagd moeten worden. Teller werd in mijn voorbeeld bij -32 verhoogd.
En dus stoppen zodra die teller groter 3 is.
Zet in je oorspronkelijke versie de printlin. van messageOffset.
Probeer zodra dat werkt en messageOffste wordt op -32 gezet ook de teller te verhogen..
Zoek vervolgens de juiste manier om met die teller het aantal keer display te beperken.
Dus nogmaals ga terug naar je oorspronkelike versie en voeg daar stap voor stap de kennis toe die je nu hebt.
m.v.g. Nico
Ik ben bang dat je na een pauze even weer terug moet naar je oorspronkelijke versie.
Wat je met de for loop maakt zit in je oorspronkelijke versie al in de standaard loop.
Je teller start eerst op nul. De teller stopt op tot het maximaal aantal pixels van het bericht.
Teller start vervolgens op-32 ( om de laatste verschuiving te doen en het schermpje dus leeg te maken,
Wat ik probeerde je te laten doen is zodra de messageOfffset één regel klaar heeft de teller te verhogen.
In mijn voorbeeld had messageOffset nog op 0 afgevraagd moeten worden. Teller werd in mijn voorbeeld bij -32 verhoogd.
En dus stoppen zodra die teller groter 3 is.
Zet in je oorspronkelijke versie de printlin. van messageOffset.
Probeer zodra dat werkt en messageOffste wordt op -32 gezet ook de teller te verhogen..
Zoek vervolgens de juiste manier om met die teller het aantal keer display te beperken.
Dus nogmaals ga terug naar je oorspronkelike versie en voeg daar stap voor stap de kennis toe die je nu hebt.
m.v.g. Nico
Re: Via een website keuzes doorsturen naar LED scrol matrix
Nico,
teruggestapt naar het origineel.
Als ik in updateDisplay de "Serial.println(messageOffset)" doe, dan zie ik echter een probleem.
Namelijk, op het moment dat de website getoond wordt op mijn browser, dan al gaat de messageOffset veranderen. Dus zelfs ZONDER een tekst gekozen te hebben loopt deze constant van -32 naar 0
Mvg,
Davy
teruggestapt naar het origineel.
Als ik in updateDisplay de "Serial.println(messageOffset)" doe, dan zie ik echter een probleem.
Namelijk, op het moment dat de website getoond wordt op mijn browser, dan al gaat de messageOffset veranderen. Dus zelfs ZONDER een tekst gekozen te hebben loopt deze constant van -32 naar 0
Mvg,
Davy
Re: Via een website keuzes doorsturen naar LED scrol matrix
Davy, Dat is helemaal goed
Zodra je wat via je web pagina ingeeft wordt de string lengte groter en wordt het display gevuld.
Eigenlijk start hij bij nul maar wordt onmiddellijk -32,
Uitdaging 1 wordt dus om iets te maken waarbij hij niet start als er geen string is.
Of nog beter dat hij ook dit slecht 3x doet en dan wacht op info via de web pagina.
Dus zodra offset = 0 teller plus 1 en zodra teller = groter 3 stoppen met update display.
m.v.g
Nico
Zodra je wat via je web pagina ingeeft wordt de string lengte groter en wordt het display gevuld.
Eigenlijk start hij bij nul maar wordt onmiddellijk -32,
Uitdaging 1 wordt dus om iets te maken waarbij hij niet start als er geen string is.
Of nog beter dat hij ook dit slecht 3x doet en dan wacht op info via de web pagina.
Dus zodra offset = 0 teller plus 1 en zodra teller = groter 3 stoppen met update display.
m.v.g
Nico
Re: Via een website keuzes doorsturen naar LED scrol matrix
Hoi allemaal,
alles werkt nu zoals ik wil.
Ik heb de boodschap loop zo gekregen dat hij nu max 2 keer toont !
Ik wil graag iedereen danken die mee dacht met mij om het in orde te krijgen. Nico, jij hielp me een groot stuk verder ...
Volgende stap : Wachten op mijn Ali bestelling van 2 extra LED boards (zodat ik er een 8x 96 van kan maken). Dan nog 3D printen van een houder...
alles werkt nu zoals ik wil.
Ik heb de boodschap loop zo gekregen dat hij nu max 2 keer toont !
Ik wil graag iedereen danken die mee dacht met mij om het in orde te krijgen. Nico, jij hielp me een groot stuk verder ...
Volgende stap : Wachten op mijn Ali bestelling van 2 extra LED boards (zodat ik er een 8x 96 van kan maken). Dan nog 3D printen van een houder...
- Code: Alles selecteren
//==============================================================
// Includes
//==============================================================
#include <MAX7219_Dot_Matrix.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>
#define BESTAND "/data/msg.txt"
//==============================================================
// Inputs and program variabels
//==============================================================
const byte chips = 4; //No of MAX7219 Dpt Matrix Display
MAX7219_Dot_Matrix display (chips, 2); // Chips / LOAD
unsigned long lastMoved = 0;
unsigned long MOVE_INTERVAL = 50; // mS
int teller = 0;
int messageOffset;
String htmlLinks;
String htmlPage, htmlPageTop, htmlPageBottom, htmlMessage;
String myIP; // String variable to hold the AP's IP
String page; // String containing the presented webpage
String decodedMsg;
String msg;
int x;
int loops;
int reset = 0;
File f; // Generic file handle
//==============================================================
// Local Access Point and webserver
//==============================================================
const char *ssid = "DOCKCCM-FB"; // AP SSID
const char *password = "F33Db4ck"; // AP password
IPAddress apIP(28, 0, 0, 1); // Defining a static IP address
ESP8266WebServer server(80); // Start the webserver on port 80
//==============================================================
// Webpage creation
//==============================================================
String prepareHtmlPage()
{
String htmlPageTop = "<!DOCTYPE html>"
"<html>"
"<head>"
"<meta name='viewport' content='width=device-width, initial-scale=1'>"
"<style>"
".button {"
"display: block;"
"width: 98%;"
"background-color: #4d94ff;"
"border:none;"
"color: white;"
"padding: 10px;"
"margin: 5px;"
"font-size: 20px;"
"text-align: center;"
"cursor: pointer;"
"text-decoration: none;"
"}"
"</style>"
"</head>"
"<body>"
"<h1>Car Warning</h1>"
"<form action='/add' method='post'><p>Type your message <input type='text' name='tekst' size=20 autofocus> <input type='submit' value='Submit'></form>";
String htmlPageBottom = "<br><br><a href='/reset'>Reset bestand</a>"
"</body>"
"</html>";
htmlPage = htmlPageTop + htmlLinks + htmlPageBottom;
return htmlPage;
}
void handleNotFound() {
server.send(200, "text/plain", "404 - That page is not available on this server!");
}
void updateDisplay (String m) {
// String str = "This is my string";
int str_len = m.length() + 1;
char char_array[str_len];
m.toCharArray(char_array, str_len);
/*
void sendChar (const byte pos, const byte data);
void send64pixels (const byte pos, const byte data [8]);
void sendString (const char * s);
void sendSmooth (const char * s, const int pixel);
void setIntensity (const byte amount); // 0 to 15
void updateDisplay ()
{
display.sendString (& message [messageOffset]);
// next time show one character on
if (messageOffset++ >= strlen (message))
messageOffset = 0;
} // end of updateDisplay
*/
display.sendSmooth (char_array, messageOffset); //Display commands for the Matrix
if (messageOffset++ >= (int) (strlen (char_array) * 8)) {
messageOffset = - chips * 8;
loops++;
}
}
void readDataFile() {
Serial.println("Function readDatafile : ");
f = SPIFFS.open(BESTAND, "r");
if (!f) {
// File does not open - take default values
Serial.println("\tFunction ReadDatafile : Unable to open DATA file!");
File f = SPIFFS.open(BESTAND, "w");
} else {
while (f.available()) {
String line = f.readStringUntil('\n');
// links = links + "<a href='?tekst=" + line + "' class='button'>" + line + "</a>";
htmlLinks = htmlLinks + "<a href='/knop?tekst=" + line + "' class='button'>" + line + "</a>";
Serial.println("\tFunction ReadDatafile : Value " + line + " read");
}
f.close();
//htmlMessage = htmlMessageStart + links + htmlMessageEinde;
htmlMessage = prepareHtmlPage();
}
}
void fileupdate() {
// open file for writing
Serial.println("Function fileupdate");
File f = SPIFFS.open(BESTAND, "a");
if (!f) {
Serial.println("\tFunction fileUpdate : file open failed");
File f = SPIFFS.open(BESTAND, "w");
}
f.println(decodedMsg);
Serial.println("\tFunction fileUpdate : Appended text " + decodedMsg + " to file");
f.close();
}
void handle_add() {
if (reset == 0 ) {
msg = server.arg("tekst");
decodedMsg = decodeMessage(msg);
htmlLinks = htmlLinks + "<a href='/knop?tekst=" + decodedMsg + "' class='button'>" + decodedMsg + "</a>";
Serial.println("Function handle_button : Updating links with message " + decodedMsg);
htmlMessage = prepareHtmlPage();
}
server.send(200, "text/html", htmlMessage); // Send same page so they can send another msg
if (reset == 0 ) {
teller = 1;
fileupdate();
}
reset = 0;
}
void handle_button() {
if (reset == 0 ) {
msg = server.arg("tekst");
decodedMsg = decodeMessage(msg);
//messageOffset = -32;
loops = 0;
}
// updateDisplay (decodedMsg);
server.send(200, "text/html", htmlMessage); // Send same page so they can send another msg
reset = 0;
}
void reset_file() {
Serial.println("Function reset_file : Resetting file");
SPIFFS.format();
reset = 1;
htmlLinks = "";
decodedMsg = "";
htmlMessage = prepareHtmlPage();
handle_button();
}
String decodeMessage(String m) {
decodedMsg = m;
// Restore special characters that are misformed to %char by the client browser
decodedMsg.replace("+", " ");
decodedMsg.replace("%21", "!");
decodedMsg.replace("%22", "");
decodedMsg.replace("%23", "#");
decodedMsg.replace("%24", "$");
decodedMsg.replace("%25", "%");
decodedMsg.replace("%26", "&");
decodedMsg.replace("%27", "'");
decodedMsg.replace("%28", "(");
decodedMsg.replace("%29", ")");
decodedMsg.replace("%2A", "*");
decodedMsg.replace("%2B", "+");
decodedMsg.replace("%2C", ",");
decodedMsg.replace("%2F", "/");
decodedMsg.replace("%3A", ":");
decodedMsg.replace("%3B", ";");
decodedMsg.replace("%3C", "<");
decodedMsg.replace("%3D", "=");
decodedMsg.replace("%3E", ">");
decodedMsg.replace("%3F", "?");
decodedMsg.replace("%40", "@");
return decodedMsg;
}
void setup() {
teller = 0;
display.begin (); //Initialize the displays
Serial.begin(115200);
display.setIntensity(8); // Intensity of the Dot Matrix module can be 0-15
WiFi.mode(WIFI_AP_STA);
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); // subnet FF FF FF 00
WiFi.softAP(ssid, password);
myIP = WiFi.softAPIP().toString(); // Get the IP address we have configured
decodedMsg = "";
SPIFFS.begin();
readDataFile();
//Set the different website locations and start the webserver
server.on("/add", handle_add);
server.on("/knop", handle_button);
server.on("/reset", reset_file);
server.onNotFound ( handleNotFound );
server.begin(); //Start server
delay(5000);
}
void loop() {
server.handleClient();
if (loops < 2) {
if (millis () - lastMoved >= MOVE_INTERVAL) {
updateDisplay (decodedMsg);
lastMoved = millis ();
}
}
//delay(1);
}
29 berichten
• Pagina 3 van 3 • 1, 2, 3
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast