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 » 25 Mrt 2019, 22:06

Hoi Nico en eventuele anderen die mee lezen... :-)

Eindelijk nog eens wat tijd gehad om verder te werken.


1. Dubbele regels :

Ik heb de hele functie handle_msg er uit gehaald. Ook al werd deze duidelijk niet meer aangeroepen, maar deze aanpassing (en misschien ook nog wat andere dingetjes die ik opgeruimd heb) heeft er wel voor gezorgd dat de dubbele waardes niet meer voorkomen.

2. String line = f.readStringUntil('n');

Ik heb deze vervangen door '\n' en dat heeft het probleem opgelost.

3. Verder zou je kunnen overwegen de optie methode="post" van het HTML formulier te gebruiken,

Dit heb ik gedaan en lijkt geen probleem te zijn.
Ik merk nu wel soms NA het drukken van de knop Submit, dat het scherm daarna wit wordt. Als ik hem gewoon aantik verschijnt hij wel. Is op Google Chrome op iOS.


Ik merkte dat ik een foutje had waardoor er in de reset functie de handle_button wordt aangeroepen maar waarbij er dan ook een writeFile gebeurde met een lege regel. Ik heb dit nu opgelost met een "reset" integer toe te voegen. Dat lijkt te werken. Ik merk precies wel dat als ik nu de functie reset_file aanroep, hij deze meer dan 1 keer toont op de Serial. En het laden van de pagina lijkt dan ook even langer te duren. Nu goed, de reset is in principe enkel in het slechtste geval nodig.

Op dit moment werkt het als volgt :

Reboot knop op de ESP :

Code: Alles selecteren
20:37:45.020 ->ReadDatafile
20:37:45.121 -> Waarde Een ingelezen
20:37:45.121 -> Waarde Twee ingelezen
20:37:45.155 -> Waarde Drie ingelezen
20:37:45.155 -> Waarde Vier ingelezen


Terwijl ik de waardes daarvoor netjes één na één heb kunnen ingeven.

Code: Alles selecteren
20:37:16.682 -> Handle_button Een
20:37:16.682 -> WriteDatafile
20:37:16.682 -> ====== Writing to SPIFFS file =========
20:37:16.682 -> Een
20:37:22.066 -> Handle_button Twee
20:37:22.066 -> WriteDatafile
20:37:22.066 -> ====== Writing to SPIFFS file =========
20:37:22.100 -> Twee
20:37:27.523 -> Handle_button Drie
20:37:27.523 -> WriteDatafile
20:37:27.523 -> ====== Writing to SPIFFS file =========
20:37:27.523 -> Drie
20:37:31.342 -> Handle_button Vier
20:37:31.342 -> WriteDatafile
20:37:31.342 -> ====== Writing to SPIFFS file =========
20:37:31.342 -> Vier




Ik zit eigenlijk nog met enkele vragen :

1. Als ik een waarde ingeef en submit, dan blijft de pagina zoals hij is en worden de links niet automatisch geupdate. Hoe kan ik in de handle_button een refresh oproepen van de pagina? In principe moet volgens mij de "readDataFile" terug aangeroepen worden. Klopt dat? Is dat de beste manier? Of moet ik de "links" opnieuw opbouwen en op één of andere manier de pagina terug aanmaken?

2. Ik zou nu graag van de links op de webpagina grote knoppen maken. Bv 2 kolommen. Ik kan dit in principe door wat CSS mee te geven en via Bootstrap de pagina als een mobile app aanmaken. Maar hoe krijg ik de bootstrap op de ESP of in de code? Of wat is daar een betere manier voor?

3. Ik krijg op geen enkele manier de code zo dat de tekst maar 3 keer voor bij scrollt... Ik heb al op de meest gekke plaatsen een for lus gezet maar het lukt me niet. Als je daar wat meer hulp voor zou hebben, dan graag !

Hieronder de volledige code alsook een screen capture ! :-)

Mvg,

Davy

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 links;
String form;

String myIP;      // String variable to hold the AP's IP
String page;      // String containing the presented webpage
String decodedMsg;
String msg;

int x;
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

//==============================================================
// Input form
//==============================================================
String formstart =
     "<p>"
    "<center>"
    "<h1>Car Warning</h1>"
    "<form action='/knop' method='post'><p>Type your message <input
type='text' name='tekst' size=20 autofocus> <input type='submit'
value='Submit'></form>"
    "</center>";

String formend = "<br><br><a href='/reset'>Reset bestand</a>";

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

display.sendSmooth (char_array, messageOffset); //Display commands for the
Matrix
  if (messageOffset++ >= (int) (strlen (char_array) * 8))
  messageOffset = - chips * 8;
}

void readDataFile() {
  Serial.println("ReadDatafile");
  f = SPIFFS.open(BESTAND, "r");
  if (!f) {
    // File does not open - take default values
    Serial.println("Unable to open DATA file!\n");
    File f = SPIFFS.open(BESTAND, "w");   
  } else {
    while (f.available()) {
      String line = f.readStringUntil('\n');
      links = links + "<a href='?tekst=" + line + "''>" + line + "</a><br>";
      Serial.println("Waarde " + line + " ingelezen");
  }
  f.close();
  form = formstart + links + formend;
  }
}

void fileupdate() {
  // open file for writing
  Serial.println("WriteDatafile");
  File f = SPIFFS.open(BESTAND, "a");
  if (!f) {
      Serial.println("file open failed");
      File f = SPIFFS.open(BESTAND, "w");
  }
  Serial.println("====== Writing to SPIFFS file =========");
  f.println(decodedMsg);
  Serial.println(decodedMsg);
  f.close();
}

void handle_button() {
  server.send(200, "text/html", form);    // Send same page so they can
send another msg
  msg=server.arg("tekst");
  decodedMsg = decodeMessage(msg);

  if (reset == 0 ) {
    Serial.println("Handle_button " + decodedMsg);
    fileupdate();
  }
  reset = 0;
}

void reset_file() {
  Serial.println("Resetting file");
  SPIFFS.format();
  reset = 1;
  handle_button();
}

/*
void handle_msg() {
  server.send(200, "text/html", form);    // Send same page so they can
send another msg
  msg = server.arg("msg");

  teller = 0;

// fileupdate();
}
*/

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

  SPIFFS.begin();

  readDataFile();
 
  //Set the different website locations and start the webserver
  //server.on("/msg", handle_msg);                       // Routine used
when requesting the root location
  server.on("/knop", handle_button);
  server.on("/reset", reset_file);
  server.onNotFound ( handleNotFound );
  server.begin();                                              //Start
server
  delay(5000);
}

void loop() {
  server.handleClient();

  if (millis () - lastMoved >= MOVE_INTERVAL) {
    updateDisplay (decodedMsg);
    lastMoved = millis ();
  }
  delay(1);
}



Afbeelding

Advertisement

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 27 Mrt 2019, 19:18

Davy,
Even een poging om een antwoord op je vragen te geven.
<1> Na submit geen update van de pagina. De computer doet wat gevraagd wordt. Net als bij elke ander website zal na het aanklikken van een link of het indrukken van een knop op de CLIENT computer de server moeten reageren. Zoals het nu is, worden op de server wel de files bijgewerkt maar geeft de server geen reactie naar de client. Je zal dus de pagina volledig opnieuw moeten opbouwen en naar de client sturen. Een andere optie zou kunnen zijn om e.e.a. aan de client kant op te lossen door daar met javascript te gaan werken. Ik denk echter dat het hierdoor onnodig ingewikkeld wordt.
<2> Met CSS knoppen maken. Dit kan ook opgelost worden door de css code op te nemen op de HTML pagina (internal CSS zie https://www.w3schools.com/html/html_css.asp Je moet dan wel alles zelf bedenken in CSS en kan je niet zomaar de varianten van Bootstrap gebruiken. Voorbeelden zijn ook via de w#schools link te vinden. Er zijn wel mogelijk heden om de files van Bootstrap op de ESP te krijgen maar of dat gaat passen heb ik mij twijfels over. Daarnaast zal ook je reset functie zoals je hem nu hebt opgelost alles er direct weer afgooien.
<3> Max 3x scrollen. Heb je mijn suggestie zoals ik die eerder gaaf ook geprobeerd? Dus een teller steeds met 1 verhogen in de void loop. als de teller hoger dan 3 wordt display NIET meer bijwerken. De betreffende teller in de void setup op nul stellen. De teller ook op nul stellen elke keer als je nieuwe info naar het dislay moet sturen. (waarschijnlijk in de knop handle)
Succes Nico

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 28 Mrt 2019, 09:56

Nico,

opnieuw bedankt voor je antwoorden.

Ondertussen ben ik alweer een klein stukje gevorderd. O.a. het stukje met de CSS heb ik gisteren avond ontwikkeld en werkt ook (bijna) zoals verwacht.
De update van de webpagina, daar zit ik nog een beetje mee in de knoop. Ik vond (nog) niet de manier om bv via een code de website opnieuw te versturen (na het toevoegen van de links). Daar moet ik nog even mee aan de slag.

De loop heb ik al op verschillende plaatsen getest en het lijkt me echt niet te lukken. Ik zal vanavond nog eens opnieuw je suggestie uitproberen.

Ik zat nog met een aantal "kleine" vervelende dingen, maar die probeer ik vanavond te beschrijven. Eén van de zaken heeft trouwens te maken met de oproep van een andere pagina. In de RESET bijvoorbeeld zou ik eigenlijk willen verwijzen naar een "andere" pagina. Ik doe dat nu door de "handle_knop" op te roepen, maar daarin staat ook weer een fileupdate die eigenlijk dan niet mag plaatsvinden.
Dus ik heb nog wat werk :-)

P.S. Hier de geupdate code... Moest je nog verbeteringen zien, dan hoor ik ze graag.

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 links;
String form;
String 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 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

//==============================================================
// Input form
//==============================================================

String htmlMessageStart = "<!DOCTYPE html>"
                     "<html>"
                      "<head>"
                        "<meta name='viewport' content='width=device-width, initial-scale=1'>"
                        "<style>"
                          ".button {"
                           "display: block;"
                           "width: 100%;"
                           "background-color: #4CAF50;"
                           "border:none;"
                           "color: white;"
                           "padding: 14px;"
                           "margin-bottom: 15px;"
                           "font-size: 30px;"
                           "text-align: center;"
                           "cursor: pointer;"
                           "}"
                        "</style>"
                      "</head>"
                     "<body>"
                     "<h1>Car Warning</h1>"
                     "<form action='/knop' method='post'><p>Type your message <input type='text' name='tekst' size=20 autofocus> <input type='submit' value='Submit'></form>";

String htmlMessageEinde = "<br><br><a href='/reset'>Reset bestand</a>"
                      "</body>"
                      "</html>";

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

  display.sendSmooth (char_array, messageOffset); //Display commands for the Matrix
  if (messageOffset++ >= (int) (strlen (char_array) * 8))
    messageOffset = - chips * 8;
}

void readDataFile() {
  Serial.println("ReadDatafile");
  f = SPIFFS.open(BESTAND, "r");
  if (!f) {
    // File does not open - take default values
    Serial.println("Unable to open DATA file!\n");
    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>";
                     
      Serial.println("Waarde " + line + " ingelezen");
    }
    f.close();
    htmlMessage = htmlMessageStart + links + htmlMessageEinde;
  }
}

void fileupdate() {
  // open file for writing
  Serial.println("WriteDatafile");
  File f = SPIFFS.open(BESTAND, "a");
  if (!f) {
    Serial.println("file open failed");
    File f = SPIFFS.open(BESTAND, "w");
  }
  Serial.println("====== Writing to SPIFFS file =========");
  f.println(decodedMsg);
  Serial.println(decodedMsg);
  f.close();
}

void handle_button() {

  if (reset == 0 ) {
    msg = server.arg("tekst");

    Serial.println("HandleButton : msg = " + msg);

    decodedMsg = decodeMessage(msg);
    links = links + "<a href='?tekst=" + decodedMsg + "' class='button'>" + decodedMsg + "</a>";

    Serial.println (links);
  }

  server.send(200, "text/html", htmlMessage);    // Send same page so they can send another msg

  if (reset == 0 ) {
    Serial.println("Handle_button " + decodedMsg);
    fileupdate();
  }
  reset = 0;
}

void reset_file() {
  Serial.println("Resetting file");
  SPIFFS.format();
  reset = 1;
  links = "";
 
  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

  SPIFFS.begin();

  readDataFile();

  //Set the different website locations and start the webserver
  server.on("/msg", []() {
    server.send(200, "text/html", htmlMessage);                       // Routine used when requesting the root location
  });

  server.on("/knop", handle_button);
  server.on("/reset", reset_file);
  server.onNotFound ( handleNotFound );
  server.begin();                                              //Start server
  delay(5000);
}

void loop() {
  server.handleClient();

  if (millis () - lastMoved >= MOVE_INTERVAL) {
    updateDisplay (decodedMsg);
    lastMoved = millis ();
  }
  delay(1);
}


Mvg,

Davy

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 28 Mrt 2019, 22:23

Nico en alle anderen,

ik heb vanavond de code wat opgekuist.
En ik merk dat ik er zo goed als voor 98% ben (denk ik) ...

Hieronder de code.

Het enige probleem waar ik nu nog mee zit, is als ik op één van de waardes klik, hij automatisch de fileupdate doet en da's niet de bedoeling. :-)

Ook nog even verder zoeken naar het max 3 keer tonen.

Mvg,

Davy

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

//==============================================================
// Input form
//==============================================================
/*
  String formstart =
  "<p>"
  "<center>"
  "<h1>Car Warning</h1>"
  "<form action='/knop' method='post'><p>Type your message <input type='text' name='tekst' size=20 autofocus> <input type='submit' value='Submit'></form>"
  "</center>";

  String formend = "<br><br><a href='/reset'>Reset bestand</a>";

  String htmlMessageStart = "<!DOCTYPE html>"
                     "<html>"
                      "<head>"
                        "<meta name='viewport' content='width=device-width, initial-scale=1'>"
                        "<style>"
                          ".button {"
                           "display: block;"
                           "width: 100%;"
                           "background-color: #4CAF50;"
                           "border:none;"
                           "color: white;"
                           "padding: 14px;"
                           "margin-bottom: 15px;"
                           "font-size: 30px;"
                           "text-align: center;"
                           "cursor: pointer;"
                           "}"
                        "</style>"
                      "</head>"
                     "<body>"
                     "<h1>Car Warning</h1>"
                     "<form action='/knop' method='post'><p>Type your message <input type='text' name='tekst' size=20 autofocus> <input type='submit' value='Submit'></form>";

  String htmlMessageEinde = "<br><br><a href='/reset'>Reset bestand</a>"
                      "</body>"
                      "</html>";
*/
//==============================================================
// 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: 100%;"
                       "background-color: #4CAF50;"
                       "border:none;"
                       "color: white;"
                       "padding: 14px;"
                       "margin-bottom: 15px;"
                       "font-size: 30px;"
                       "text-align: center;"
                       "cursor: pointer;"
                       "}"
                       "</style>"
                       "</head>"
                       "<body>"
                       "<h1>Car Warning</h1>"
                       "<form action='/knop' 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);

  display.sendSmooth (char_array, messageOffset); //Display commands for the Matrix
  if (messageOffset++ >= (int) (strlen (char_array) * 8))
    messageOffset = - chips * 8;
}

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='?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_button() {

  if (reset == 0 ) {
    msg = server.arg("tekst");
    decodedMsg = decodeMessage(msg);
    //    links = links + "<a href='?tekst=" + decodedMsg + "' class='button'>" + decodedMsg + "</a>";
    htmlLinks = htmlLinks + "<a href='?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 ) {
    //Serial.println("Handle_button " + decodedMsg);
    fileupdate();
  }
  reset = 0;
}

void reset_file() {
  Serial.println("Function reset_file : Resetting file");
  SPIFFS.format();
  reset = 1;
  htmlLinks = "";

  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

  SPIFFS.begin();

  readDataFile();

  //Set the different website locations and start the webserver
  /*
    server.on("/msg", []() {
    server.send(200, "text/html", htmlMessage);                       // Routine used when requesting the root location
    });
  */

  server.on("/knop", handle_button);
  server.on("/reset", reset_file);
  server.onNotFound ( handleNotFound );
  server.begin();                                              //Start server
  delay(5000);
}

void loop() {
  server.handleClient();

  if (millis () - lastMoved >= MOVE_INTERVAL) {
    updateDisplay (decodedMsg);
    lastMoved = millis ();
  }
  delay(1);
}

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 28 Mrt 2019, 22:45

Zo ziet het er nu uit.
Zoals je kan zien is er nu een fout ingeslopen dat als je op een knop drukt, hij er dus een nieuwe fileupdate van maakt.

https://youtu.be/jGpaoDb5JUk

De serial toont dit ook :

Afbeelding

https://youtu.be/sH9HBdCHTug

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 28 Mrt 2019, 23:12

Sorry dat ik vanavond zo veel plaats maar blijf de ESP maar terug aankoppelen en testen, testen, testen.
En ik heb eigenlijk ook de oplossing gevonden.

Nieuwe functie "handle_add" en nu werkt alles zoals verwacht... :-) Jippie.

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

//==============================================================
// Input form
//==============================================================
/*
  String formstart =
  "<p>"
  "<center>"
  "<h1>Car Warning</h1>"
  "<form action='/knop' method='post'><p>Type your message <input type='text' name='tekst' size=20 autofocus> <input type='submit' value='Submit'></form>"
  "</center>";

  String formend = "<br><br><a href='/reset'>Reset bestand</a>";

  String htmlMessageStart = "<!DOCTYPE html>"
                     "<html>"
                      "<head>"
                        "<meta name='viewport' content='width=device-width, initial-scale=1'>"
                        "<style>"
                          ".button {"
                           "display: block;"
                           "width: 100%;"
                           "background-color: #4CAF50;"
                           "border:none;"
                           "color: white;"
                           "padding: 14px;"
                           "margin-bottom: 15px;"
                           "font-size: 30px;"
                           "text-align: center;"
                           "cursor: pointer;"
                           "}"
                        "</style>"
                      "</head>"
                     "<body>"
                     "<h1>Car Warning</h1>"
                     "<form action='/knop' method='post'><p>Type your message <input type='text' name='tekst' size=20 autofocus> <input type='submit' value='Submit'></form>";

  String htmlMessageEinde = "<br><br><a href='/reset'>Reset bestand</a>"
                      "</body>"
                      "</html>";
*/
//==============================================================
// 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: 100%;"
                       "background-color: #4CAF50;"
                       "border:none;"
                       "color: white;"
                       "padding: 14px;"
                       "margin-bottom: 15px;"
                       "font-size: 30px;"
                       "text-align: center;"
                       "cursor: pointer;"
                       "}"
                       "</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);

  display.sendSmooth (char_array, messageOffset); //Display commands for the Matrix
  if (messageOffset++ >= (int) (strlen (char_array) * 8))
    messageOffset = - chips * 8;
}

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);
    //    links = links + "<a href='?tekst=" + decodedMsg + "' class='button'>" + decodedMsg + "</a>";
    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 ) {
    fileupdate();
  }
  reset = 0;
}

void handle_button() {

  if (reset == 0 ) {
    msg = server.arg("tekst");
    decodedMsg = decodeMessage(msg);
  }

  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 = "";

  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

  SPIFFS.begin();

  readDataFile();

  //Set the different website locations and start the webserver
  /*
    server.on("/msg", []() {
    server.send(200, "text/html", htmlMessage);                       // Routine used when requesting the root location
    });
  */
  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 (millis () - lastMoved >= MOVE_INTERVAL) {
    updateDisplay (decodedMsg);
    lastMoved = millis ();
  }
  delay(1);
}

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 02 Apr 2019, 20:30

Hi Davy,
Ik heb geen hardware (MAX7219) beschikbaar en heb ook nog niet eerder met een dergelijk display gewerkt.
Ik wil toch proberen je probleem en de gebruikte library te begrijpen.
Ik heb daarom een vraag over de laatste hieboven getoonde code.
Wordt in dit geval de tekst steeds opnieuw naar het display gezonden of slechts 1x ?
Dus 1 tekst intoetsen en dan verder niets meer intoetsen.
m.v.g. Nico

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 02 Apr 2019, 20:31

Hoi Nico,

het is één keer ingeven (de knop drukken) en vanaf dan blijft hij lopen (dus blijft in de loop).

Mvg,

Davy

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 02 Apr 2019, 21:06

Wat ik tot nu niet snap hoe het komt dat hij steeds opnieuw begint.
Het lijkt er op dat de code
Code: Alles selecteren
display.sendSmooth (char_array, messageOffset); //Display commands for the Matrix
  if (messageOffset++ >= (int) (strlen (char_array) * 8))
    messageOffset = - chips * 8;

dit regelt.
Je zou moeten proberen uit te vinden wat er in de variabele messageOffset staat nadat een volledig bericht op het display staat.
Als je dat weet kan je ook via mijn eerder genoemde teller bijhouden hoeveel keer de tekst is getoond.
Het zou dus best kunnen zijn dat je alleen de teller maar hoeft te verhogen binnen bovengenoemde if .
Ook voor je probleem van het afmaken van het bericht is dan een oplossing te maken.
Succes
mvg Nico

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 05 Apr 2019, 15:05

Davy, Ik reagreer hier maar even.

Code: Alles selecteren
void updateDisplay (String m) {
if (teller < 4){
  String str = "This is my string";
  int str_len = m.length() + 1;
  char char_array[str_len];
  m.toCharArray(char_array, str_len);

  display.sendSmooth (char_array, messageOffset); //Display commands for the Matrix
  if (messageOffset++ >= (int) (strlen (char_array) * 8))
      {
         messageOffset = - chips * 8;
         teller++
      }
   }
}


Heb je het zo al een s geprobeerd? Let wel op de accolades.
M.v.g. Nico


PS ik denk dat er een schoonheidsfoutje optreedt en dat aan het einde het display niet leeg is :)

VorigeVolgende

Terug naar ESP Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten