Via een website keuzes doorsturen naar LED scrol matrix

Software vragen voor ESP chip familie
Berichten: 21
Geregistreerd: 09 Mrt 2019, 18:35

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 05 Apr 2019, 21:05

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

Advertisement

Berichten: 21
Geregistreerd: 09 Mrt 2019, 18:35

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 05 Apr 2019, 21:43

OK, even stap per stap.

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 :

Afbeelding

Klik ik NOG een keer op de knop "Drie", dan zie ik dit

Afbeelding

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

Berichten: 21
Geregistreerd: 09 Mrt 2019, 18:35

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 05 Apr 2019, 22:14

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) :

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

Berichten: 21
Geregistreerd: 09 Mrt 2019, 18:35

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 05 Apr 2019, 22:17

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 !

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

Berichten: 21
Geregistreerd: 09 Mrt 2019, 18:35

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 05 Apr 2019, 22:34

OK, laatste actie die ik vandaag nog doe;

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...

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 06 Apr 2019, 09:00

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

Berichten: 21
Geregistreerd: 09 Mrt 2019, 18:35

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 06 Apr 2019, 14:16

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

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 06 Apr 2019, 14:24

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

Berichten: 21
Geregistreerd: 09 Mrt 2019, 18:35

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 09 Apr 2019, 18:40

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... :-)

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);
}

Vorige

Terug naar ESP Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten