Via een website keuzes doorsturen naar LED scrol matrix

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

Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 09 Mrt 2019, 18:50

Hoi allemaal,

ik ben sinds kort bezig met wat testen van de Wemos D1 mini en heb al enkele leuke dingen gemaakt.
Mijn volgend project is een news scroller op een LEDmatrix. Ik zou graag boodschappen er naar toe willen sturen via een website met mogelijke opties.
Maar, ik zou ook via de website bv nieuwe boodschappen in een "database" (of lijst, of bestand?) willen kunnen wegschrijven.

Wat zou het moeten doen ?

1. Indien de stroom er op komt, alle bestaande waarden (uit DB, uit lijst of uit bestand, dat weet ik niet wat het best is) uitlezen en in een HTML pagina tonen in een tabel met bv een knopje voor elke keuze.
2. Als ik op een knop druk voor een bericht, wil ik dat de tekst in deze lijn 3x getoond wordt op de LED scroller.
3. Als ik een nieuwe boodschap wil toevoegen, moet dat kunnen via de website.

Wat heb ik al ? Ik heb enkele projectjes al klaar met volgende items :

1. Een werkende Wemos D1 Mini met 4 gekoppelde 8x8 LED matrixen. De Wemos toont nu continu 1 boodschap.
2. Een werkende webserver waarop ik kan aanloggen via de smartphone (Wifi)
3. De mogelijkheid om een bestand aan te spreken, te lezen en ook aan te passen ==> Alleen lukt het me niet om bv een lijn toe te voegen op het einde, ik doe nu het overschrijven van de data

Ik zit nu technisch een beetje vast. Hoe moet/kan ik nu verder gaan om hetgeen ik wil doen, te laten blijven werken?

Is het werken met een bestand de beste manier? Hoeveel data kan daar max in? 10 boodschappen is volgens mij het minimum die ik er in wil.
Hoe lees ik de waardes in een HTML bestand?
Hoe maak ik een nieuwe waarde aan in het bestand op het einde?
Hoe kan ik via een link of knop in de web pagina het bericht doorsturen naar de LED matrix ?

Het zou handiger zijn om te werken met een database, maar ik vind niet veel info over een lokale database op de Wemos!

Het enige spijtige aan het verhaal is dat ik niet meer op de gewone 4G zit als ik ben ingelogd via het wifi netwerk op de Wemos. Het zou fijner zijn als ik ook nog gewoon verbinding heb (ps de Wemos heeft geen Wifi netwerk ter beschikking waar ik hem wil plaatsen).

Iemand die me hiermee wat kan helpen aub?

Mvg,

Davy

Advertisement

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 15 Mrt 2019, 21:14

Even een kort "deel" antwoord. Hieronder een voorbeeld zoals ik zelf een HTML pagina met tussengevoegde info heb opgelost. Een oplossing waarbij ik geen database nodig had maar misschien helpt het je een stukje verder.

Het betreft een webpagina waarbij de status van een WEMOS D1 R2 wordt weergegeven.

Code: Alles selecteren
void handleStatus() {
  digitalWrite(LED_BUILTIN, LOW);
  message = "<!DOCTYPE html> <html> <head> <title>Status</title></head> <body>";
  message += "<table style='font-size:14px'><tr><td><b>Status</b></td></tr>";

  message += "<tr><td>";
  message += DateTimeStr(now());
  message += "</td><td>";
  message += (dst ? "Zomer tijd " : "Winter tijd ");
  message += "</td></tr>";

  message += "<tr><td>";
  message += "App versie:" ;
  message += "</td><td>";
  message += versieDatum;
  message += " ";
  message += String(versieTijd).substring(0, 5);
  message += "</td></tr>";

  message += "<tr><td>";
  message += "Actief: ";
  message += "</td><td>";
  message += dateDiffStr((now() - firstTimeUpdate));
  message += "</td></tr>";

  message += "<tr><td>";
  message += "Sinds: ";
  message += "</td><td>";
  message += DateTimeStr(firstTimeUpdate);
  message += "</td></tr>";

  message += "<tr><td>";
  message += "Laatste NTP tijd: ";
  message += "</td><td>";
  message += DateTimeStr(lastTimeUpdate);
  message += "</td></tr>";

  message += "<tr><td>";
  message += (WiFi.isConnected () ? "Verbonden " : "Niet verbonden ");
  message += " met: </td><td>";
  message += WiFi.SSID();
  message += "</td></tr>";

  if (WiFi.status() != 3) {
    message += "<tr><td>";
    message += "Status";
    message += "</td><td>";
    message += WiFi.status();
    if (WiFi.status() == 1) {
      message += " SSID onbekend";
    }
    if (WiFi.status() == 4) {
      message += " password fout";
    }
    message += "</td></tr>";
    /*
          0 : WL_IDLE_STATUS when Wi-Fi is in process of changing between statuses
          1 : WL_NO_SSID_AVAILin case configured SSID cannot be reached
          3 : WL_CONNECTED after successful connection is established
          4 : WL_CONNECT_FAILED if password is incorrect
          6 : WL_DISCONNECTED if module is not configured in station mode
    */

  }
  message += "<tr><td>IP address: </td><td>";
  hIP = WiFi.localIP();
  printIP = String(hIP[0]) + "." + hIP[1] + "." + hIP[2] + "." + hIP[3];
  message += printIP;
  message += "</td></tr>";


  message += "<tr><td>";
  message += (WAPconnected  ? "Verbonden " : "Niet verbonden ");
  message += " met: </td><td>";
  message += ssidWAP;
  message += "</td></tr>";

  message +=  "<tr><td>AP IP adress: </td><td>";
  hIP = WiFi.softAPIP();
  printIP = String(hIP[0]) + "." + hIP[1] + "." + hIP[2] + "." + hIP[3];
  message += printIP;
  message += "</td></tr></table></body></html>";
  server.send(200, "text/html", message);
  digitalWrite(LED_BUILTIN, HIGH);

}

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 15 Mrt 2019, 22:08

Hoi,

ik snap volledig je code, maar mis helaas het stukje waar je tekst gaat halen en wegschrijven?
Alsook een lijst van waardes die dan aanklikbaar zijn en getoond worden.

Niet slecht bedoeld, maar zoals ik al schreef, lukt het me perfect om data naar de LED's te schrijven, alleen niet op de manier van de website.

Mvg,

Davy

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 15 Mrt 2019, 22:48

Begrijp je wel hoe de communicatie tussen een cliënt en de server werkt?
Dus wat er gebeurt als in je browser op een knop klikt.
Dit dus in het algemeen niet specifiek met een Wemos module.
Maar ook hoe een HTML pagina werkt enz.
Je stuurt dan een regel naar de server eventueel met parameters.
In de Wemos software moet je die info dus kunnen verwerker.
Is dat je probleem? Nu even lastig te bergijpen waar je vast loopt.
sorry mvg Nico

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 16 Mrt 2019, 09:42

Aanvulling:
Staat er ergens is je programma :
Code: Alles selecteren
SPIFFS.open(path, mode)

waarbij als mode ingevuld staat "w" ?

Verander dan de "w" in een "a" en de info zal aan het eind van het file worden weggeschreven.

Als dit echter gaat over het wegschrijven van de later naar het display te schrijven tekst zou je er ook voor kunnen kiezen elk bericht in een apart file op te nemen. Bijvoorbeeld met de naam tekst01.txt , tekst02.txt enz. enz.

In mijn voorbeeld wordt een HTML pagina opgebouwd met daarin variabele uit het geheugen van de Wemos. Het voorbeeld is eenvoudig zo te veranderen dat de variabele uit een file komen. (SPIFFS open read close)
Zie ook documentie in: https://arduino-esp8266.readthedocs.io/ ... ystem.html

Aanklikbare info op een HTML pagina is mogelijk maar daarvoor moet je kennis hebben van HTML programmering.
Daarvoor zou je kunnen kijken in: https://www.w3schools.com/

Maar blijf gerust hier verder vragen maar wel graag met voorbeeld code hoe ver je nu bent.
m.v.g. Nico

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 16 Mrt 2019, 15:44

Nico,

ik ken best wel wat van HTML en web ontwikkeling.
Waarschijnlijk zat ik weer te ver te denken.

Hieronder de code die ik nu al heb. Mijn excuses dat ik nog geen code had getoond.

Code: Alles selecteren
//==============================================================
// Includes
//==============================================================
#include <MAX7219_Dot_Matrix.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>

//==============================================================
// 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  messageOffset;

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

File f;   // Generic file handle

//char message [90] = "Pressd is the best"; //String to be displayed

//==============================================================
// Local Access Point and webserver
//==============================================================
const char *ssid = "DDD";    // AP SSID
const char *password = "DDD";  // 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 form =
  "<p>"
  "<center>"
  "<h1>WiFi Marquee</h1>"
  "<form action='msg'><p>Type your message <input type='text' name='msg' size=100 autofocus> <input type='submit' value='Submit'></form>"
  "</center>";

//==============================================================
//          These routines server the actual webpages
//==============================================================
void handleRoot() {

  // Build the webpage
  String index_html =
    "<!DOCTYPE HTML>"
    "<html>"
    "<head>"
    "<meta http-equiv=\"refresh\" content=\"2\">"
    "<title>Car warning</title>"
    "<style>"
    "body { "
    "    background-color: darkblue;"
    "    text-align: left;"
    "    color: white;"
    "    font-family: Arial, Helvetica, Sans-Serif;"
    "</style>"
    "</head>"
    "<body>"
    "<h1>Car warning</h1>"


    "<table style=\"width:20%\">"
    "  <tr><th>Score</th><th>Amount</th></tr>"
    "</table>"
    "</body>"
    "</html>";

  // Send the response string
  server.send(200, "text/html", index_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);

  //for (int i = 0; i < 10; i++) {
    display.sendSmooth (char_array, messageOffset); //Display commands for the Matrix
    if (messageOffset++ >= (int) (strlen (char_array) * 8))
      messageOffset = - chips * 8;
  //}
  //decodedMsg = "";
}

void readDataFile() {
  Serial.println("ReadDatafile");
  f = SPIFFS.open("/msgf.txt", "r");
  if (!f) {
    // File does not open - take default values
    Serial.println("Unable to open DATA file!\n");
  } else {
    while (f.available()) {
      String line = f.readStringUntil('n');
      decodedMsg = line;
      Serial.println(decodedMsg);
      f.close();
    }
  }
}

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

void handle_msg() {

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

  decodedMsg = msg;
  // 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", "@");

  //decodedMsg.toUpperCase();   // Had to convert the string to upper case.  weird shit happened with lower case.  Why?
  fileupdate();
}

void setup() {

  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.onNotFound ( handleNotFound );
  server.begin();                                              //Start server
  delay(5000);
}

void loop() {
  server.handleClient();

  //Serial.println(decodedMsg);
  //for (int i = 0; i < 3; i++) { // Display the content
    if (millis () - lastMoved >= MOVE_INTERVAL) {
      updateDisplay (decodedMsg);
      lastMoved = millis ();
    }
    delay(1);
//  }
}


Op dit moment moet ik nog enkele zaken doen :

1. Idd proberen hetgeen ik wil toevoegen achteraan toevoegen. Dat zal ik proberen met de "a".
2. Tonen van alle ingegeven lijnen (nu toon ik enkel hetgeen ik ingeef)
3. Knoppen maken om de waarde door te sturen.

Er is iets wat ik op geen enkele manier in orde lijk te krijgen, en dat vind ik heel dom van mezelf... :-) Heb al verschillende for loops geprobeerd, maar het lukt niet.
Ik wil dat de tekst die ik ingeef maar een bepaald aantal keer getoond wordt. Later moet dit aantal een in te geven veld worden op de web pagina. Nu blijft de tekst continue lopen. Hebben jullie enig idee of dit op te lossen is met een for lus OF dat ik ergens de LED matrix gewoon moet clearen of stoppen?

PS Heb nog niet veel moeite gedaan om de code op te kuisen of zo.

Tofste zou zijn als ik uiteindelijk een Android app zou kunnen maken (of iOS ook) die dan gewoon knopjes toont die ik kan klikken. Nu moet ik natuurlijk eerst op de webserver gaan en de web pagina openen.

Mvg,

Davy

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 16 Mrt 2019, 16:44

Dave,

<> Eerst je laatste opmerking over een Android app.
Een snelle (tijdelijke) oplossing zou kunnen zijn de web pagina toevoegen aan je start pagina.
Dat gaat door op de drie puntjes rechts in de bovenhoek te klikken op het moment dat de Wemos pagina is geopend. Daarna met de keuze: "Toevoegen aan startscherm".
Je krijgt dan een icoon op je start pagina alsof het een aparte App is. (zelf ook al op deze wijze iets opgelost) Aanklikken geeft direct toegang naar de webpage op de Wemos.

<> Het maximaal drie keer naar het display schrijven kan je waarschijnlijk oplossen door elke keer als de tekst (in de loop) een keer op het display is weggeschreven een teller te verhogen.
Bij het bereiken van het maximum aantal stoppen met naar het display schrijven.
Teller op nul stellen in de setup EN elke keer als een nieuwe tekst op het display moet worden getoond.

<> Ik neem aan dat je dus weet hoe je in HTML. een knop maakt. Bij het aanklikken van een knop stuurt de pagina info naar de server.
Dat kan dus bijvoorbeeld zijn: 192.168.2.33/actie?knop=5
Je server zal in de huidige code hierop reageren met = "404 - That page is not available on this server!"
Je kan een aparte routine hiervoor aanroepen door in de setup toe te voegen
Code: Alles selecteren
server.on("/knop", handleKnop);

Na uitvoeren van de routine "handleKnop" zou je dan de standaard pagina weer terug kunnen sturen met handle_msg()

<> Toevoegen van alle ingegeven lijnen kan eenvoudig door elke regel (ook) in een apart txt file te bewaren en op het juiste moment aan de html pagina toe te voegen.


Hopelijk heb je wat aan deze suggesties.
m.v.g. Nico

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 19 Mrt 2019, 23:40

Hoi Nico,

allereerst bedankt voor je tijd en moeite !
Zelf heb ik niet elke avond tijd om er aan te werken, dus sorry als je soms moet wachten op een antwoord.

Ik ben op dit moment nog een stukje verder geraakt.

Op dit moment lukt het me de links aan te maken (nu nog simpele a href). Het lukt als ik op de link klik. Dus dat is al positief.

Zit echter nog met enkele probleempjes.

Zoals je kan zien in screen capture gaat er iets mis bij het wegschrijven van data.

Afbeelding

Ik heb in dit geval eerst een reset gedaan van het data bestand.
Dan heb ik de waarde "Een" ingegeven => Komt op de LED
Daarna heb ik de waarde "Twee" ingegeven => Komt op de LED
Daarna heb ik de waarde "Drie" ingegeven => Komt op de LED
Daarna heb ik de waarde "Vier" ingegeven => Komt op de LED

Om een gekke (onverklaarbare) reden, toont mijn ingelezen bestand dan de waardes als volgt :

Lege lijn
Lege lijn
Ee ====> Waar is die eind "n" naar toe ?
Lege lijn
Twee
Twee ====> Waarom een tweede "Twee" ?
Lege lijn
Drie
Vier
Lege lijn

Enig idee van waar de lege lijnen komen en de andere problemen?

Ik zit nog met een ander probleem waar ik nu niet meer naar wilde zoeken, maar de lijst van links wordt niet geupdatet als ik een link klik.

Morgen hopelijk verder.

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;

File f;   // Generic file handle

//==============================================================
// Local Access Point and webserver
//==============================================================
const char *ssid = "****";    // AP SSID
const char *password = "****";  // 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'><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(line);
    }
  f.close();
  form = formstart + links + formend;
  }
}

void fileupdate() {
  // open file for writing
  //File f = SPIFFS.open("/msgf.txt", "w");
  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);
  Serial.println(decodedMsg);
  fileupdate();
}

void reset_file() {
  SPIFFS.format();
  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);
}

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor zuid » 20 Mrt 2019, 11:03

Hi Davy,
Sorry is niet nodig hoor, ik zal ook niet altijd snel reageren. Hangt ook soms van het weer af :)

Ik denk dat de dubbele regels ontstaan doordat je op twee plaatsen de procedure fileupdate() aanroept. [zie: void handle_msg() en void handle_button() ]
In sommige gevallen zal het veld decodedMsg waarschijnlijk leeg zijn, waardoor geen tekst wordt geprint.
In de procedure readDataFile() staat:
Code: Alles selecteren
String line = f.readStringUntil('n');

Alleen in Een zit een 'n' zou dit niet de oorzaak kunnen zijn van de afdruk van Ee ipv Een .

Volgens mij is het niet nodig het BESTAND met "w" te openen na een fout met optie "a"
Optie append werkt als een open write als het file niet aanwezig is
Code: Alles selecteren
if (!f) {
      Serial.println("file open failed");
      File f = SPIFFS.open(BESTAND, "w");
  }



Verder zou je kunnen overwegen de optie methode="post" van het HTML formulier te gebruiken,
Het is dan niet nodig elke keer alle byzondere tekens terug te vertalen zoals bij de (default) method="get".
<form action="/knop" method="post">

Ik hoor graag of je hier mee verder bent gekomen.
m.v.g. Nico

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

Re: Via een website keuzes doorsturen naar LED scrol matrix

Berichtdoor DavyC » 20 Mrt 2019, 11:42

Hoi Nico,

bedankt voor je begrip (en nogmaals voor de tijd die je hier in steekt).

Even door je opmerkingen lopen :

1. Dubbele regels :

Je maakt de opmerking over de dubbele aanroep. Ik zal hem vanavond thuis even weghalen, maar in principe (door het gebruik van de "/knop" procedure) kom ik nu niet meer in de "handle_msg" functie.
Maar goed, het is het proberen waard.

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

Hmm, zeer goede opmerking over die 'n'. Ik had al het gevoel dat het ook gebeurde bij "negen" en "zeven"... :lol: :lol:
Dus dat moet ik nog eens goed bekijken. Die regel code had ik uit een ander voorbeeld gehaald. Misschien moest dit eigenlijk "\n" zijn, wat ik logischer zou vinden.
Te testen vanavond.

3. Volgens mij is het niet nodig het BESTAND met "w" te openen na een fout met optie "a"

Wel, ik heb een "reset" ingebouwd die blijkbaar het bestand weghaalt. Ik merkte dat ik de melding kreeg dat het bestand niet gevonden werd als ik de File f = SPIFFS.open(BESTAND, "a"); uitvoerde. Daarom dat ik als redding dan met de "w" het bestand terug aanmaak. Ben dus niet zeker of de "a" optie het bestand ook terug aanmaakt? Ik test het vanavond even opnieuw.

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

Zal ik ook even verder uittesten.

Mvg,

Davy

Volgende

Terug naar ESP Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten