Navigation

    M5Stack Community

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    1. Home
    2. CrazyHorse80
    3. Posts
    C
    • Continue chat with CrazyHorse80
    • Start new chat with CrazyHorse80
    • Flag Profile
    • Profile
    • Following
    • Followers
    • Blocks
    • Topics
    • Posts
    • Best
    • Groups

    Posts made by CrazyHorse80

    • RE: Cant compile M5ez.h

      @felmue said in Cant compile M5ez.h:

      Hello @EricR

      without downgrading the Arduino ESP32 framework (e.g. using v2.0.3) I was able to compile M5ez with the following three modifications.

      • In M5ez.h disable WPS by replacing#define M5EZ_WPS with #define M5EZ_WPSx.
      • In M5ez.cpp replace info.disconnected.reason with info.wifi_sta_disconnected.reason.
      • In M5ez.cpp replace SYSTEM_EVENT_STA_DISCONNECTED with ARDUINO_EVENT_WIFI_STA_DISCONNECTED.

      Thanks
      Felix

      Thanks a lot! I am starting again to program for M5Stack after a long time and I was having problems compiling M5ez and understanding where the problem was, but you solved this for me!

      posted in M5EZ
      C
      CrazyHorse80
    • RE: So much noise!

      I can confirm that : I use Arduino IDE and I also hear noise while communicating with WiFi. I also tried the dacwrite instruction without any success. I don't want to do a hardware mod but this is annoying...

      posted in FAQS
      C
      CrazyHorse80
    • RE: M5ez, a complete interface builder system for the M5Stack as an Arduino library. Extremely easy to use.

      @rop I thought MyTZ object was already declared in your library, my fault.
      Thank you for your explanation about objects. I misunderstood your previous directions and I thought I must use them to the widget to work. It seems it was a lot easier to do than that! The widgets I need to display are really simple, just a small text or icon reflecting the state of some variable's value, so I think a regular function will work. I'll try one more time. ;)

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: M5ez, a complete interface builder system for the M5Stack as an Arduino library. Extremely easy to use.

      @rop 在 M5ez, a complete interface builder system for the M5Stack as an Arduino library. Extremely easy to use. 中说:

      @crazyhorse80
      Do you also have problems if you lookup the timezone from code (like with MyTZ.setlocation("Europe/Amsterdam")?

      I tried to put this line MyTZ.setlocation("Europe/Rome") in my setup() function, but I get an error:

      error: 'MyTZ' was not declared in this scope
      

      I also tried to setup TZ in the clock menu at runtime but I can't find the / character on onscreen keyboard...

       
      I'm not sure I could do something that would be more informative than the clock code from M5ez.cpp. Let's walk through:

      [...]

      Hope this helps, otherwise you'll have to tell me what is not working for you, or (better yet) show code that you are trying to make work.

      I think I understood how the clock widget works, but I can't replicate it with my own widget code, here it is:
      this is on a tab of its own named Widgets:

      //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      //
      //   B B A N D
      //
      //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      
      class ezBBand {
        public:
          static void begin();
          static void restart();
          static void menu();
          static uint16_t loop();
          static void clear();
          static void draw(uint16_t x, uint16_t w);
        private:
          static void _writePrefs();
          static bool _on;
          static bool _starting;
      };
      
        bool ezBBand::_on;
        bool ezBBand::_starting = true;
      
        void ezBBand::begin() {
          Preferences prefs;
          prefs.begin("M5ez", true);  // read-only
          _on = prefs.getBool("BBand_on", true);
          prefs.end();
          ez.settings.menuObj.addItem("BBand settings", ezBBand.menu);
          ez.addEvent(ezBBand.loop);
          ezBBand.restart();
        }
        
        void ezBBand::restart() {
          ez.header.remove("BBand");
          uint8_t length;
          if (_on) {
            length = 2;
            ez.setFont(ez.theme->clock_font);
            uint8_t width = length * m5.lcd.textWidth("F") + ez.theme->header_hmargin * 2;
            ez.header.insert(ez.header.position("title") + 2, "BBand", width, ezBBand.draw);
          }
        }
        
        void ezBBand::menu() {
          bool on_orig = _on;
          while(true) {
            ezMenu bbandmenu("BBand settings");
            bbandmenu.txtSmall();
            bbandmenu.buttons("up#Back#select##down#");
            bbandmenu.addItem("on|Display BBand\t" + (String)(_on ? "on" : "off"));
            if (_on) {
            }
            switch (bbandmenu.runOnce()) {
              case 1:
                _on = !_on;
                ezBBand.restart();
                break;
              case 0:
                if (_on != on_orig) {
                  _writePrefs();
                }
                return;
            }
          }
        }
        
        uint16_t ezBBand::loop() {
          ezt::events();
          if (_starting && timeStatus() != timeNotSet) {
            _starting = false;
            ez.header.draw("BBand");
          } else {
            if (_on && ezt::minuteChanged()) ez.header.draw("BBand");
          }
          return 250;
        }
        
        void ezBBand::draw(uint16_t x, uint16_t w) {
          if (_starting) return;
          m5.lcd.fillRect(x, 0, w, ez.theme->header_height, ez.theme->header_bgcolor);
          ez.setFont(ez.theme->clock_font);
          m5.lcd.setTextColor(ez.theme->header_fgcolor);
          m5.lcd.setTextDatum(TL_DATUM);
          m5.lcd.drawString("Fx", x + ez.theme->header_hmargin, ez.theme->header_tmargin + 2);
        }
        
        void ezBBand::_writePrefs() {
          Preferences prefs;
          prefs.begin("M5ez");
          prefs.putBool("BBand_on", _on);
          prefs.end();
        }
      

      It should display the string Fx between WiFi and clock widgets (I'll modify that to display a string from a variable if I get it to work).
      In my main tab (M5remDisplay) I put this:
      ezBBand BBand; as a global variable declaration and BBand.begin(); in my setup() function.

      This is a list of errors I got:

      M5remDisplay:16:1: error: 'ezBBand' does not name a type
      
       ezBBand BBand;
      
       ^
      
      C:\Users\Utente\AppData\Local\Temp\arduino_modified_sketch_422641\M5remDisplay.ino: In function 'void setup()':
      
      M5remDisplay:58:3: error: 'BBand' was not declared in this scope
      
         BBand.begin();
      
         ^
      
      Z:\_PVControl\M5remDisplay\Widgets.ino: In static member function 'static void ezBBand::begin()':
      
      Widgets:30:58: error: expected primary-expression before '.' token
      
           ez.settings.menuObj.addItem("BBand settings", ezBBand.menu);
      
                                                                ^
      
      Widgets:31:24: error: expected primary-expression before '.' token
      
           ez.addEvent(ezBBand.loop);
      
                              ^
      
      Widgets:32:12: error: expected unqualified-id before '.' token
      
           ezBBand.restart();
      
                  ^
      
      Z:\_PVControl\M5remDisplay\Widgets.ino: In static member function 'static void ezBBand::restart()':
      
      Widgets:42:80: error: expected primary-expression before '.' token
      
             ez.header.insert(ez.header.position("title") + 2, "BBand", width, ezBBand.draw);
      
                                                                                      ^
      
      Z:\_PVControl\M5remDisplay\Widgets.ino: In static member function 'static void ezBBand::menu()':
      
      Widgets:58:18: error: expected unqualified-id before '.' token
      
                 ezBBand.restart();
      
                        ^
      

      Thank you for helping me and having so much patience...

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: M5ez, a complete interface builder system for the M5Stack as an Arduino library. Extremely easy to use.

      @Rop Hi! Could you consider some changes requests to M5ez?

      • I have some problem with Geo-IP timezone auto-select, it always timeouts and it's only executed once: could you, please, modify this function to retry if timeout occurs?

      • Could you make the actual header to be a "system" header (with title, WiFi and clock widgets) and add a "user" header so the user could put more widgets in it? I ask for this one 'cause I'm planning an app that will require to display few widgets and I have no pixels to show them all. (In case you're not planning to do that, I'll simply add my code to be displayed in the canvas space with a function of my own).

      • And now a more personal request: could you please make a dummy widget complete with all the code to associate a settings menu (with enable / disable widget setting) and the draw code. It'll be perfect if it will simply display a variable value and update every time the minute changes. I've tried to modify the clock widget but I didn't have success with that.

      Thank you in advance!

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      Thanks for your help, I'll try to follow your directions in the following days.

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      @rop Here's what my full code looks like at the moment:

      #include <M5Stack.h>
      #include <ezTime.h>
      #include <M5ez.h>
      
      #include <WiFi.h>
      #include <WiFiClient.h>
      #include <WebServer.h>
      #include <ESPmDNS.h>
      
      #include "images.h"
      
      #define MAIN_DECLARED
      
      WebServer rDserver(1980);
      
      byte   remYear = 0;           // Current PVControl server Year
      byte   remMonth = 0;          // Current PVControl server Month
      byte   remDay = 0;            // Current PVControl server Day
      byte   remHour = 0;           // Current PVControl server Hour
      byte   remMinute = 0;         // Current PVControl server Minute
      float  GenE = 0;              // Last Generated Energy
      float  UseE = 0;              // Last Consumed Energy
      float  TtGE = 0;              // Last to the Grid Energy
      float  FtGE = 0;              // Last from the Grid Energy
      int    GenP = 0;              // Last Generated Power
      int    UseP = 0;              // Last Consumed Power
      int    NetP = 0;              // Last Net Power
      
      void setup() {
        #include <themes/default.h>
        #include <themes/dark.h>
        ezt::setDebug(NONE);
        ez.begin();
        if (ez.wifi.indexForSSID("xxx") == -1) {
          ez.wifi.add("xxx", "xxx");
          ez.wifi.writeFlash();
        }
      
        MDNS.begin("remdisplay1");
      
        rDserver.on("/", handleRoot);
        rDserver.onNotFound(handleNotFound);
        rDserver.begin();
        
        dacWrite(25,0); // Speaker mute
      
        ez.addEvent(serveClients, 3000);
      
        ezMenu mainmenu("remDisplay");
        //  mainmenu.txtSmall();
        mainmenu.addItem("PVControl", remDisplay);
        mainmenu.addItem("Settings", mainmenu_image);
        //  mainmenu.addItem("Updates via https", mainmenu_ota);
        mainmenu.upOnFirst("last|up");
        mainmenu.downOnLast("first|down");
        mainmenu.run();
      }
      
      void loop() {
        
      }
      
      uint16_t serveClients() {
        rDserver.handleClient();
        return 50;
      }
      
      void handleRoot() {
        for (uint8_t i = 0; i < rDserver.headers(); i++) { //debug only
          Serial.print(" ");
          Serial.print(rDserver.headerName(i));
          Serial.print(": ");
          Serial.println(rDserver.header(i));
        }
        for (uint8_t i = 0; i < rDserver.args(); i++) { //debug only
          Serial.print(" ");
          Serial.print(rDserver.argName(i));
          Serial.print(": ");
          Serial.println(rDserver.arg(i));
        }
      
        if(rDserver.args() == 7) {
            if((rDserver.argName(0) != "r") || (rDserver.argName(1) != "da")
              || (rDserver.argName(2) != "ti") || (rDserver.argName(3) != "v1")
                || (rDserver.argName(4) != "v2") || (rDserver.argName(5) != "v3")
                  || (rDserver.argName(6) != "v4")) {
              rDserver.send(400, "text/plain", " Bad Request");
              return;
            }
            else {
              rDserver.send(200, "text/plain", " OK");
      
              remYear = atoi(rDserver.arg(1).substring(0,3).c_str());
              remMonth = atoi(rDserver.arg(1).substring(4,5).c_str());
              remDay = atoi(rDserver.arg(1).substring(6,7).c_str());
              remHour = atoi(rDserver.arg(2).substring(0,1).c_str());
              remMinute = atoi(rDserver.arg(2).substring(2,3).c_str());
              GenE = atoi(rDserver.arg(3).c_str());
              GenP = atoi(rDserver.arg(4).c_str());
              UseE = atoi(rDserver.arg(5).c_str());
              UseP = atoi(rDserver.arg(6).c_str());
              NetP = GenP - UseP;    // Last Net Power
              remDisplay();
            }
        }
        else {
          rDserver.send(400, "text/plain", " Bad Request");
          return;
        }
      }
      
      void handleNotFound() {
        String message = "File Not Found\n\n";
        message += "URI: ";
        message += rDserver.uri();
        message += "\nMethod: ";
        message += (rDserver.method() == HTTP_GET) ? "GET" : "POST";
        message += "\nArguments: ";
        message += rDserver.args();
        message += "\n";
        for (uint8_t i = 0; i < rDserver.args(); i++) {
          message += " " + rDserver.argName(i) + ": " + rDserver.arg(i) + "\n";
        }
        rDserver.send(404, "text/plain", message);
      }
      
      void mainmenu_image() {
        ezMenu images;
        images.imgBackground(TFT_BLACK);
        images.imgFromTop(40);
        images.imgCaptionColor(TFT_WHITE);
        images.addItem(sysinfo_jpg, "System Information", sysInfo);
        images.addItem(wifi_jpg, "Built-in wifi & other settings", ez.settings.menu);
        images.addItem(wifi_jpg, "WiFi Settings", ez.wifi.menu);
        images.addItem(about_jpg, "About remDisplay", about);
        images.addItem(sleep_jpg, "Power Off", powerOff);
        images.addItem(return_jpg, "Back");
        images.run();
      }
      
      void powerOff() {
        m5.powerOFF();
      }
      
      void about() {
        ez.msgBox("About remDisplay", "");
      }
      
      String exit_buttonrD = "Exit";
      
      void remDisplay() {
        remDisplayPage1();
        while (true) {
          String btn = ez.buttons.poll();
          if (btn == "up") remDisplayPage1();
          if (btn == "down") remDisplayPage2();
          if (btn == "Exit") break;
        }
      }
      
      void remDisplayPage1() {
        const byte tab = 120;
        ez.screen.clear();
        ez.header.show("PVControl  (1/2)");
        ez.buttons.show("#" + exit_buttonrD + "#down");
        ez.canvas.font(&FreeSans9pt7b);
        ez.canvas.lmargin(10);
        ez.canvas.println("");
        ez.canvas.print("Produzione:");
        ez.canvas.x(tab);ez.canvas.print(GenP); ez.canvas.println(" W");
        ez.canvas.x(tab); ez.canvas.print(GenE / 1000); ez.canvas.println(" kWh");
        ez.canvas.print("Consumo:");
        ez.canvas.x(tab); ez.canvas.print(UseP); ez.canvas.println(" W");
        ez.canvas.x(tab); ez.canvas.print(UseE / 1000); ez.canvas.println(" kWh");
        ez.canvas.print("Immissione:");
        ez.canvas.x(tab);
        if(NetP > 0)
          ez.canvas.print(NetP);
        else
          ez.canvas.print("0");
        ez.canvas.println(" W");
        ez.canvas.x(tab); ez.canvas.println(" kWh");
        ez.canvas.print("Prelievo:");
        ez.canvas.x(tab);
        if(NetP < 0)
          ez.canvas.print(abs(NetP));
        else
          ez.canvas.print("0");
        ez.canvas.println(" W");
        ez.canvas.x(tab); ez.canvas.println(" kWh");
      }
      
      void remDisplayPage2() {
        const byte tab = 140;
        ez.screen.clear();
        ez.header.show("PVControl  (2/2)");
        ez.buttons.show("up#" + exit_buttonrD + "#");
        ez.canvas.font(&FreeSans9pt7b);
        ez.canvas.lmargin(10);
        ez.canvas.println("");
        ez.canvas.print("Free RAM:");  ez.canvas.x(tab);  ez.canvas.println(String((long)ESP.getFreeHeap()) + " bytes");
        ez.canvas.print("Min. free seen:");  ez.canvas.x(tab); ez.canvas.println(String((long)esp_get_minimum_free_heap_size()) + " bytes");
      }
      

      It's only a part of what I want to achieve and here I'll try to explain what my project should do when it'll be complete:
      every minute my M5Stack will receive from another Arduino board an HTTP GET request with data and it stores them in global variables and eventually does some operation with them;
      it should have a multi-page view to show data received and stored in variables (one displays data in numeric form, another will display them in graphs, another one will only change screen background color and make some noise based on data received, and maybe some more);
      it also should have access to the menus to change wi-fi and screen preferences and some more options related to my program (sound volume, default page to display on startup and so on).
      I'd also like to have some more widgets:
      one will have to show me if data received is older than one minute (it means I've lost connection with the Arduino board);
      another one will have to show the current energy billing band based on what time and day of week it is.
      The problem with M5ez, and ESP32 in general, is that I've no clue of where to put my code: do I have to do all in loop() function? Or should I register various functions with ez.addEvent()? Or should I do it some other way? I'm a bit confused... Can you show me a proof of concept application using M5ez (even if not related to my needs, so I could understand how it works)?

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      I need the clock... :( I have that same error every 5 / 7 minutes, it restarts and works for a few minutes again and so on...
      Maybe I can do some test without the clock to see if it is the cause of the problem...

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: Backticks... (Request to admins)

      Thank you!

      posted in Lessons and Guides
      C
      CrazyHorse80
    • RE: Backticks... (Request to admins)

      It should be good to explain how to use other tags, too (if any).
      Thank you in advance!

      posted in Lessons and Guides
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      Could you please help me with this backtrace I got few moments ago?

      PC: 0x400853e3: esp_log_write at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/log/log.c line 214
      EXCVADDR: 0x00000000
      
      Decoding stack results
      0x400853e3: esp_log_write at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/log/log.c line 214
      0x400f54d2: __assert_func at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/bootloader_support/src/bootloader_init.c line 537
      0x4008de99: vTaskEnterCritical at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/portmux_impl.inc.h line 106
      0x4008fd4b: multi_heap_internal_lock at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/heap/multi_heap.c line 372
      0x400903d3: multi_heap_malloc at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/heap/multi_heap_poisoning.c line 190
      0x400856b5: heap_caps_malloc at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/heap/heap_caps.c line 110
      0x400857b9: heap_caps_realloc at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/heap/heap_caps.c line 275
      0x4008586e: heap_caps_realloc_default at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/heap/heap_caps.c line 162
      0x40087799: _realloc_r at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/newlib/syscalls.c line 47
      0x400ead7a: String::changeBuffer(unsigned int) at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\cores\esp32\WString.cpp line 170
      0x400eadc8: String::reserve(unsigned int) at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\cores\esp32\WString.cpp line 158
      0x400eade9: String::copy(char const*, unsigned int) at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\cores\esp32\WString.cpp line 195
      0x400eae23: String::String(char const*) at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\cores\esp32\WString.cpp line 39
      0x400d8dfa: Timezone::dateTime(long, ezLocalOrUTC_t, String) at C:\Arduino-1.8.7\portable\sketchbook\libraries\ezTime\src\ezTime.cpp line 1164
      0x400d9622: Timezone::dateTime(long, String) at C:\Arduino-1.8.7\portable\sketchbook\libraries\ezTime\src\ezTime.cpp line 1154
      0x400d9801: Timezone::dateTime(String) at C:\Arduino-1.8.7\portable\sketchbook\libraries\ezTime\src\ezTime.cpp line 1150
      0x400e1eb3: ezClock::draw(unsigned short, unsigned short) at C:\Arduino-1.8.7\portable\sketchbook\libraries\M5ez\src\M5ez.cpp line 973
      0x400de59d: ezHeader::show(String) at C:\Arduino-1.8.7\portable\sketchbook\libraries\M5ez\src\M5ez.cpp line 184
      0x400d2307: remDisplayPage1() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 164
      0x400d26ba: remDisplay() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 152
      0x400d2c13: handleRoot() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 103
      0x4017b6c1: std::_Function_handler ::_M_invoke(std::_Any_data const&) at c:\arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\tools\xtensa-esp32-elf\xtensa-esp32-elf\include\c++\5.2.0/functional line 1871
      0x400d5ee2: std::function ::operator()() const at c:\arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\tools\xtensa-esp32-elf\xtensa-esp32-elf\include\c++\5.2.0/functional line 2271
      0x400e9bdd: FunctionRequestHandler::handle(WebServer&, HTTPMethod, String) at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\libraries\WebServer\src\detail/RequestHandlersImpl.h line 42
      0x400e9c2a: WebServer::_handleRequest() at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 617
      0x400e9d86: WebServer::handleClient() at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 320
      0x400d3a44: serveClients() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 64
      0x400dbb68: M5ez::yield() at C:\Arduino-1.8.7\portable\sketchbook\libraries\M5ez\src\M5ez.cpp line 1736
      0x400dbbb4: ezButtons::poll() at C:\Arduino-1.8.7\portable\sketchbook\libraries\M5ez\src\M5ez.cpp line 612
      0x400d26c2: remDisplay() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 154
      0x400d2c13: handleRoot() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 103
      0x4017b6c1: std::_Function_handler ::_M_invoke(std::_Any_data const&) at c:\arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\tools\xtensa-esp32-elf\xtensa-esp32-elf\include\c++\5.2.0/functional line 1871
      0x400d5ee2: std::function ::operator()() const at c:\arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\tools\xtensa-esp32-elf\xtensa-esp32-elf\include\c++\5.2.0/functional line 2271
      0x400e9bdd: FunctionRequestHandler::handle(WebServer&, HTTPMethod, String) at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\libraries\WebServer\src\detail/RequestHandlersImpl.h line 42
      0x400e9c2a: WebServer::_handleRequest() at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 617
      0x400e9d86: WebServer::handleClient() at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 320
      0x400d3a44: serveClients() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 64
      0x400dbb68: M5ez::yield() at C:\Arduino-1.8.7\portable\sketchbook\libraries\M5ez\src\M5ez.cpp line 1736
      0x400dbbb4: ezButtons::poll() at C:\Arduino-1.8.7\portable\sketchbook\libraries\M5ez\src\M5ez.cpp line 612
      0x400d26c2: remDisplay() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 154
      0x400d2c13: handleRoot() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 103
      0x4017b6c1: std::_Function_handler ::_M_invoke(std::_Any_data const&) at c:\arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\tools\xtensa-esp32-elf\xtensa-esp32-elf\include\c++\5.2.0/functional line 1871
      0x400d5ee2: std::function ::operator()() const at c:\arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\tools\xtensa-esp32-elf\xtensa-esp32-elf\include\c++\5.2.0/functional line 2271
      0x400e9bdd: FunctionRequestHandler::handle(WebServer&, HTTPMethod, String) at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\libraries\WebServer\src\detail/RequestHandlersImpl.h line 42
      0x400e9c2a: WebServer::_handleRequest() at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 617
      0x400e9d86: WebServer::handleClient() at C:\Arduino-1.8.7\portable\sketchbook\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 320
      0x400d3a44: serveClients() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 64
      0x400dbb68: M5ez::yield() at C:\Arduino-1.8.7\portable\sketchbook\libraries\M5ez\src\M5ez.cpp line 1736
      0x400dbbb4: ezButtons::poll() at C:\Arduino-1.8.7\portable\sketchbook\libraries\M5ez\src\M5ez.cpp line 612
      0x400d26c2: remDisplay() at Z:\_PVControl\M5remDisplay/M5remDisplay.ino line 154
      
      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      @rop I found where the error was! I was streaming my GET request string to the client with multiple prints and while it is OK for connecting to a web site I send data to and to my MySQL database, it was not OK for the M5Stack.
      I set up a buffer string, printed all my data in it and then use it to send data to my client object and now it work flawless! I got my stream of data sent every minute!

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      @rop I've just tried what you said but with no luck at all (it seems to be worst than before)... It must be something related to M5Stack, 'cause if I set another Arduino with the IP of M5Stack it gets a request every minute and it works as intended to. I'l try to setup a program without M5ez and see if it works that way, maybe there's something wrong with interactions between it and the webserver part...
      Thank you for all your help!

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      This is the code (it's my first try, be kind! :D):

      #include <M5Stack.h>
      #include <ezTime.h>
      #include <M5ez.h>
      
      #include <WiFi.h>
      #include <WiFiClient.h>
      #include <WebServer.h>
      #include <ESPmDNS.h>
      
      #include "images.h"
      
      #define MAIN_DECLARED
      
      WebServer rDserver(1980);
      
      byte   remYear = 0;           // Current PVControl server Year
      byte   remMonth = 0;          // Current PVControl server Month
      byte   remDay = 0;            // Current PVControl server Day
      byte   remHour = 0;           // Current PVControl server Hour
      byte   remMinute = 0;         // Current PVControl server Minute
      float  GenE = 0;              // Last Generated Energy
      float  UseE = 0;              // Last Consumed Energy
      float  TtGE = 0;              // Last to the Grid Energy
      float  FtGE = 0;              // Last from the Grid Energy
      int    GenP = 0;              // Last Generated Power
      int    UseP = 0;              // Last Consumed Power
      int    NetP = 0;              // Last Net Power
      
      void setup() {
        #include <themes/default.h>
        #include <themes/dark.h>
        ezt::setDebug(INFO);
        ez.begin();
        if (ez.wifi.indexForSSID("xxx") == -1) {
          ez.wifi.add("xxx", "xxx");
          ez.wifi.writeFlash();
        }
      
        MDNS.begin("remdisplay1");
      
        rDserver.on("/", handleRoot);
        rDserver.onNotFound(handleNotFound);
        rDserver.begin();
        
        dacWrite(25,0); // Speaker mute
      
        ez.addEvent(serveClients, 3000);
      
        ezMenu mainmenu("remDisplay");
        //  mainmenu.txtSmall();
        mainmenu.addItem("PVControl", remDisplay);
        mainmenu.addItem("Settings", mainmenu_image);
        //  mainmenu.addItem("Updates via https", mainmenu_ota);
        mainmenu.upOnFirst("last|up");
        mainmenu.downOnLast("first|down");
        mainmenu.run();
      }
      
      void loop() {
        
      }
      
      uint16_t serveClients() {
        rDserver.handleClient();
        return 500;
      }
      
      void handleRoot() {
        rDserver.send(200, "text/plain", " OK");
      
        for (uint8_t i = 0; i < rDserver.headers(); i++) {
          Serial.print(" ");
          Serial.print(rDserver.headerName(i));
          Serial.print(": ");
          Serial.println(rDserver.header(i));
        }
        for (uint8_t i = 0; i < rDserver.args(); i++) {
          Serial.print(" ");
          Serial.print(rDserver.argName(i));
          Serial.print(": ");
          Serial.println(rDserver.arg(i));
        }
      
        if(rDserver.args() == 7) {
            if((rDserver.argName(0) != "r") || (rDserver.argName(1) != "da")
              || (rDserver.argName(2) != "ti") || (rDserver.argName(3) != "v1")
                || (rDserver.argName(4) != "v2") || (rDserver.argName(5) != "v3")
                  || (rDserver.argName(6) != "v4")) {
              return;
            }
            else {
              remYear = atoi(rDserver.arg(1).substring(0,3).c_str());
              remMonth = atoi(rDserver.arg(1).substring(4,5).c_str());
              remDay = atoi(rDserver.arg(1).substring(6,7).c_str());
              remHour = atoi(rDserver.arg(2).substring(0,1).c_str());
              remMinute = atoi(rDserver.arg(2).substring(2,3).c_str());
              GenE = atoi(rDserver.arg(3).c_str());
              GenP = atoi(rDserver.arg(4).c_str());
              UseE = atoi(rDserver.arg(5).c_str());
              UseP = atoi(rDserver.arg(6).c_str());
              NetP = GenP - UseP;    // Last Net Power
              remDisplay();
            }
        }
      }
      
      void handleNotFound() {
        String message = "File Not Found\n\n";
        message += "URI: ";
        message += rDserver.uri();
        message += "\nMethod: ";
        message += (rDserver.method() == HTTP_GET) ? "GET" : "POST";
        message += "\nArguments: ";
        message += rDserver.args();
        message += "\n";
        for (uint8_t i = 0; i < rDserver.args(); i++) {
          message += " " + rDserver.argName(i) + ": " + rDserver.arg(i) + "\n";
        }
        rDserver.send(404, "text/plain", message);
      }
      
      void mainmenu_image() {
        ezMenu images;
        images.imgBackground(TFT_BLACK);
        images.imgFromTop(40);
        images.imgCaptionColor(TFT_WHITE);
        images.addItem(sysinfo_jpg, "System Information", sysInfo);
        images.addItem(wifi_jpg, "Built-in wifi & other settings", ez.settings.menu);
        images.addItem(wifi_jpg, "WiFi Settings", ez.wifi.menu);
        images.addItem(about_jpg, "About remDisplay", about);
        images.addItem(sleep_jpg, "Power Off", powerOff);
        images.addItem(return_jpg, "Back");
        images.run();
      }
      
      void powerOff() {
        m5.powerOFF();
      }
      
      void about() {
      }
      
      String exit_buttonrD = "Exit";
      
      void remDisplay() {
        remDisplayPage1();
        while (true) {
          String btn = ez.buttons.poll();
          if (btn == "up") remDisplayPage1();
          if (btn == "down") remDisplayPage2();
          if (btn == "Exit") break;
        }
      }
      
      void remDisplayPage1() {
        const byte tab = 120;
        ez.screen.clear();
        ez.header.show("PVControl  (1/2)");
        ez.buttons.show("#" + exit_buttonrD + "#down");
        ez.canvas.font(&FreeSans9pt7b);
        ez.canvas.lmargin(10);
        ez.canvas.println("");
        ez.canvas.print("Produzione:");
        ez.canvas.x(tab);ez.canvas.print(GenP); ez.canvas.println(" W");
        ez.canvas.x(tab); ez.canvas.print(GenE / 1000); ez.canvas.println(" kWh");
        ez.canvas.print("Consumo:");
        ez.canvas.x(tab); ez.canvas.print(UseP); ez.canvas.println(" W");
        ez.canvas.x(tab); ez.canvas.print(UseE / 1000); ez.canvas.println(" kWh");
        ez.canvas.print("Immissione:");
        ez.canvas.x(tab);
        if(NetP > 0)
          ez.canvas.print(NetP);
        else
          ez.canvas.print("0");
        ez.canvas.println(" W");
        ez.canvas.x(tab); ez.canvas.println(" kWh");
        ez.canvas.print("Prelievo:");
        ez.canvas.x(tab);
        if(NetP < 0)
          ez.canvas.print(abs(NetP));
        else
          ez.canvas.print("0");
        ez.canvas.println(" W");
        ez.canvas.x(tab); ez.canvas.println(" kWh");
      }
      
      void remDisplayPage2() {
        const byte tab = 140;
        ez.screen.clear();
        ez.header.show("PVControl  (2/2)");
        ez.buttons.show("up#" + exit_buttonrD + "#");
        ez.canvas.font(&FreeSans9pt7b);
        ez.canvas.lmargin(10);
        ez.canvas.println("");
        ez.canvas.print("Free RAM:");  ez.canvas.x(tab);  ez.canvas.println(String((long)ESP.getFreeHeap()) + " bytes");
        ez.canvas.print("Min. free seen:");  ez.canvas.x(tab); ez.canvas.println(String((long)esp_get_minimum_free_heap_size()) + " bytes");
      }
      
      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      The only thing I did related to a timer, is using the ez.addevent to call the handleclient function as you suggested in the other thread (actually I enclosed it in a function that returns the interval as you said to do). My program does not a lot other than running m5ez and the simple web server to collect data from the Arduino to display on m5stack... I don't know if I can post the entire code but I can try to...

      The timeout errors happen after few minutes from startup, but the connection seems to be good 'cause I can see the widget with 2 or 3 bars all the time.
      As for what the Arduino does, it sends a request to M5Stack every minute and it tries to send for 5 times if it didn't receive 200 OK response from server. It does that and the error I get on Arduino's side is "no connection", instead on M5Stack I can see nothing arriving (from serial monitor). Every now and then I receive some data but it's not a constant flow.
      Tomorrow I'll do some more tries without core debug...

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      Here it is (totally nonsense for me, remember I'm a noob with ESP):

      Decoding stack results
      0x400907fc: invoke_abort at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/panic.c line 155
      0x400909d1: abort at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/panic.c line 170
      0x40081df9: lock_acquire_generic at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/newlib/locks.c line 141
      0x40081f25: _lock_acquire_recursive at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/newlib/locks.c line 169
      0x40118972: _vfprintf_r at ../../../.././newlib/libc/stdio/vfprintf.c line 860
      0x4011bbc5: vprintf at ../../../.././newlib/libc/stdio/vprintf.c line 39
      0x400855ca: esp_log_write at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/log/log.c line 215
      0x400f6872: __assert_func at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/bootloader_support/src/bootloader_init.c line 537
      0x4008def9: vTaskEnterCritical at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/portmux_impl.inc.h line 105
      0x4008d355: xQueueGiveFromISR at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/queue.c line 1323
      0x40083bc8: timer_alarm_handler at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/esp_timer.c line 318
      0x40083e15: timer_alarm_isr at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/esp_timer_esp32.c line 274
      0x40107757: esp_vApplicationIdleHook at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/esp32/freertos_hooks.c line 64
      

      I think I'm not understanding how ESP32 works and so it's a lot of pain to write some code for me... I can work with Arduinos which use procedural code, but I'm guessing ESP32 is a totally different thing. Could it be that it has a small operating system that runs in parallel of my own code and I have to write only event driven functions? I need an ESP for dummy book for sure, do you know something easy to start from?

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      @rop Thank you again... I was asking myself how to do that as I've seen it in other threads...

      In addition to the above, I've seen one more error when I let the program run for a while: the ntp query fails and sometimes the M5Stack reset itself.

      Querying pool.ntp.org ... [E][WiFiUdp.cpp:52] begin(): could not create socket: 23
      11:45:53.755 -> [E][WiFiUdp.cpp:151] beginPacket(): could not create socket: 23
      11:45:53.755 -> [E][WiFiUdp.cpp:183] endPacket(): could not send data: 9
      11:45:53.755 -> [E][WiFiUdp.cpp:219] parsePacket(): could not receive data: 9
      11:45:53.755 -> [E][WiFiUdp.cpp:219] parsePacket(): could not receive data: 9
      [...]
      11:45:55.205 -> ERROR: Timeout
      
      abort() was called at PC 0x40081df9 on core 0
      11:23:10.935 -> 
      11:23:10.935 -> Backtrace: 0x400907fc:0x3ffbdcd0 0x400909d1:0x3ffbdcf0 0x40081df9:0x3ffbdd10 0x40081f25:0x3ffbdd40 0x40118972:0x3ffbdd60 0x4011bbc5:0x3ffbe070 0x400855ca:0x3ffbe0a0 0x400f6872:0x3ffbe0f0 0x4008def9:0x3ffbe120 0x4008d355:0x3ffbe150 0x40083bc8:0x3ffbe170 0x40083e15:0x3ffbe1a0 0x400822e9:0x3ffbe1c0 0x40107757:0x00000000
      11:23:10.935 -> 
      11:23:10.935 -> Rebooting...
      ets Jun  8 2016 00:22:57
      11:23:10.969 -> 
      11:23:10.969 -> rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
      11:23:10.969 -> configsip: 0, SPIWP:0xee
      11:23:10.969 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
      11:23:10.969 -> mode:DIO, clock div:1
      11:23:10.969 -> load:0x3fff0018,len:4
      11:23:10.969 -> load:0x3fff001c,len:1496
      11:23:10.969 -> load:0x40078000,len:8596
      11:23:10.969 -> load:0x40080400,len:6980
      11:23:10.969 -> entry 0x400806f4
      M5Stack initializing...[W][sd_diskio.cpp:149] sdCommand(): token error [59] 0x5
      11:23:11.715 -> [W][sd_diskio.cpp:149] sdCommand(): token error [8] 0x5
      11:23:11.715 -> OK
      [D][WiFiGeneric.cpp:342] _eventCallback(): Event: 2 - STA_START
      11:23:11.850 -> [D][WiFiGeneric.cpp:342] _eventCallback(): Event: 0 - WIFI_READY
      11:23:11.850 -> [E][Preferences.cpp:437] getString(): nvs_get_str len fail: SSID2 NOT_FOUND
      11:23:11.850 -> [E][Preferences.cpp:437] getString(): nvs_get_str len fail: key2 NOT_FOUND
      11:23:11.850 -> [E][Preferences.cpp:306] getUChar(): nvs_get_u8 fail: faces_on NOT_FOUND
      Querying pool.ntp.org ... ERROR: No network
      [D][WiFiGeneric.cpp:342] _eventCallback(): Event: 1 - SCAN_DONE
      Querying pool.ntp.org ... ERROR: No network
      [D][WiFiGeneric.cpp:342] _eventCallback(): Event: 4 - STA_CONNECTED
      [D][WiFiGeneric.cpp:342] _eventCallback(): Event: 7 - STA_GOT_IP
      11:23:16.675 -> [D][WiFiGeneric.cpp:386] _eventCallback(): STA IP: 192.168.1.221, MASK: 255.255.255.0, GW: 192.168.1.1
      Querying pool.ntp.org ... success (round trip 197 ms)
      11:23:21.500 -> Received time: Saturday, 03-Nov-18 10:23:21.771 UTC
      Timezone lookup for: Europe/Rome ... ERROR: Timeout
      [E][WiFiClient.cpp:427] flush(): 11
      11:27:06.709 -> [E][WiFiClient.cpp:236] setSocketOption(): 1006 : 9
      11:27:06.709 ->  Authorization: 
      11:27:06.709 ->  r: 1
      11:27:06.709 ->  da: 20181103
      11:27:06.709 ->  ti: 1127
      11:27:06.709 ->  v1: 2535.00
      11:27:06.709 ->  v2: 867.00
      11:27:06.709 ->  v3: 5565.00
      11:27:06.709 ->  v4: 3302.00
      
      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      Thank you for your reply, but I don't need to just turn off error displaying... I think there's actually some error, 'cause I cannot show an update every minute as I would like to... I cannot tell where the error is but I know there's something wrong...

      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      I let it run for a while and I found it works, sometimes... But I can see some error on serial monitor and I'm not sure what they refer to. I can also see that I'm not getting a request every minute as it is supposed to be, but I get one at a random time. Here's what I can see on serial monitor:

      
      20:50:16.156 -> 
      20:50:16.156 -> rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
      20:50:16.156 -> configsip: 0, SPIWP:0xee
      20:50:16.156 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
      20:50:16.156 -> mode:DIO, clock div:1
      20:50:16.156 -> load:0x3fff0018,len:4
      20:50:16.156 -> load:0x3fff001c,len:1496
      20:50:16.156 -> load:0x40078000,len:8596
      20:50:16.156 -> load:0x40080400,len:6980
      20:50:16.156 -> entry 0x400806f4
      M5Stack initializing...OK
      [E][Preferences.cpp:437] getString(): nvs_get_str len fail: SSID2 NOT_FOUND
      20:50:17.033 -> [E][Preferences.cpp:437] getString(): nvs_get_str len fail: key2 NOT_FOUND
      20:50:17.033 -> [E][Preferences.cpp:306] getUChar(): nvs_get_u8 fail: faces_on NOT_FOUND
      Querying pool.ntp.org ... ERROR: No network
      Querying pool.ntp.org ... ERROR: No network
      Querying pool.ntp.org ... success (round trip 171 ms)
      20:50:26.641 -> Received time: Friday, 02-Nov-18 19:50:27.169 UTC
      Timezone lookup for: Europe/Rome ... ERROR: Timeout
      234092
      [E][WiFiClient.cpp:427] flush(): 11
      20:51:03.615 -> [E][WiFiClient.cpp:236] setSocketOption(): 1006 : 9
      20:51:03.615 -> /
      20:51:03.615 ->  r: 1
      20:51:03.615 ->  da: 20181102
      20:51:03.615 ->  ti: 2051
      20:51:03.615 ->  v1: 0.00
      20:51:03.615 ->  v2: 0.00
      20:51:03.615 ->  v3: 1635.00
      20:51:03.615 ->  v4: 1545.00
      231800
      [E][WiFiClient.cpp:427] flush(): 11
      20:56:03.746 -> [E][WiFiClient.cpp:236] setSocketOption(): 1006 : 9
      20:56:03.746 -> /
      20:56:03.746 ->  r: 1
      20:56:03.746 ->  da: 20181102
      20:56:03.746 ->  ti: 2056
      20:56:03.746 ->  v1: 0.00
      20:56:03.746 ->  v2: 0.00
      20:56:03.746 ->  v3: 1761.00
      20:56:03.746 ->  v4: 1525.00
      231496
      [E][WiFiClient.cpp:427] flush(): 11
      20:58:03.383 -> [E][WiFiClient.cpp:236] setSocketOption(): 1006 : 9
      20:58:03.383 -> /
      20:58:03.383 ->  r: 1
      20:58:03.383 ->  da: 20181102
      20:58:03.383 ->  ti: 2058
      20:58:03.383 ->  v1: 0.00
      20:58:03.383 ->  v2: 0.00
      20:58:03.383 ->  v3: 1812.00
      20:58:03.383 ->  v4: 1525.00
      Querying pool.ntp.org ... [E][WiFiUdp.cpp:170] beginPacket(): could not get host from dns: 11
      21:00:32.992 -> ERROR: Timeout
      Querying pool.ntp.org ... success (round trip 175 ms)
      21:00:37.695 -> Received time: Friday, 02-Nov-18 20:00:38.172 UTC (internal clock was 5 ms slow)
      
      posted in PROJECTS
      C
      CrazyHorse80
    • RE: I need help with a webserver project...

      @rop
      I tried to use that one but I'm not successful with it... If I send my request manually through my web browser I got my data, but if I try to read from my Arduino board I can see nothing at all.
      The strange thing is that I set up two Arduino (one send requests and the other one display data from request) boards and they work.
      The code for the sender Arduino that I'm using is this:

      [...]
              // Try to send for 5 times
              for(byte r = 1; r <= 5; r++)
                {
                remDisplayRetry = r;
                int res = remDisplay.connect(Display_IP, DISPLAY_PORT);
                if(res == 1) // connection successfull
                  {
                  remDisplay << F("GET /");
                  #if defined(USE_DEBUG)
                    Serial << F("GET /");
                  #endif
                  sprintf(webData, "?r=1&da=%04d%02d%02d", year(),month(),day());
                  remDisplay << webData;
                  #if defined(USE_DEBUG)
                    Serial << webData;
                  #endif
                  sprintf(webData, "&ti=%02d%02d", hour(),minute());
                  remDisplay << webData;
                  #if defined(USE_DEBUG)
                    Serial << webData;
                  #endif
                  for(byte i = 0; i < 4; i++)
                    {
                    if(b[i])  // only send data if present
                      {
                      remDisplay << "&v" << i+1 << "=" << v[i];
                      #if defined(USE_DEBUG)
                        Serial << "&v" << i+1 << "=" << v[i];
                      #endif
                      }
                    }
                  remDisplay << F(" HTTP/1.1") << endl;                      //TEST
                  remDisplay << F("Host: PVControl") << endl << endl;        //TEST
                  remDisplay << endl << endl;                                  //TEST
                  #if defined(USE_DEBUG)
                    Serial << endl << endl;                                  //TEST
                  #endif
                  // give remDisplay some time to process the request
                  delay(500);
      
                  // skip the first part of the reply, which is "HTTP/1.1 "
                  remDisplay.readBytes(webData, 9);
                  // read the response code. 200 means ok. 0 means that there is no response yet
                  byte lastResponse = remDisplay.parseInt();
                  if(lastResponse == 0)
                  {
                    sprintf(remDisplayResponse,"Response timeout\0");
                    remDisplayResponseTime = now();
                  }
                  else if(lastResponse != 200)
                  { 
                    sprintf(remDisplayResponse, "%03d",lastResponse);
                    size_t numchars = remDisplay.readBytes(remDisplayResponse + 3, 75); 
                    remDisplayResponse[numchars + 3] = '\0'; // terminate the string
                    remDisplayResponseTime = now();
                  }
                  else if(lastResponse == 200)
                  { 
                    remDisplay.stop();
                    break; // No need to retry remDisplay connection
                  }
      
                  }
                else // cannot connect
                  {
                  sprintf(remDisplayResponse,"No connection");
                  remDisplayResponseTime = now();
                  remDisplayRetry_Err = remDisplayRetry;
                  }
                }
              }
      [...]
      

      Do you see something wrong here?

      The code I use on my M5Stack is this:

      [...]
      WebServer rDserver(1980);
      void setup() {
        rDserver.on("/", handleRoot);
        rDserver.onNotFound(handleNotFound);
        rDserver.begin();
      }
      
      void handleRoot() {
        rDserver.send(200, "text/plain", " OK");
      
        Serial.println(rDserver.uri());
        for (uint8_t i = 0; i < rDserver.args(); i++) {
          Serial.print(" ");
          Serial.print(rDserver.argName(i));
          Serial.print(": ");
          Serial.println(rDserver.arg(i));
        }
      
        if(rDserver.args() == 7) {
            if((rDserver.argName(0) != "r") || (rDserver.argName(1) != "da")
              || (rDserver.argName(2) != "ti") || (rDserver.argName(3) != "v1")
                || (rDserver.argName(4) != "v2") || (rDserver.argName(5) != "v3")
                  || (rDserver.argName(6) != "v4")) {
              return;
            }
            else {
              remYear = atoi(rDserver.arg(1).substring(0,3).c_str());
              remMonth = atoi(rDserver.arg(1).substring(4,5).c_str());
              remDay = atoi(rDserver.arg(1).substring(6,7).c_str());
              remHour = atoi(rDserver.arg(2).substring(0,1).c_str());
              remMinute = atoi(rDserver.arg(2).substring(2,3).c_str());
              GenE = atoi(rDserver.arg(3).c_str()) / 1000;
              GenP = atoi(rDserver.arg(4).c_str());
              UseE = atoi(rDserver.arg(5).c_str()) / 1000;
              UseP = atoi(rDserver.arg(6).c_str());
              NetP = GenP - UseP;    // Last Net Power
            }
        }
      }
      [...]
      
      posted in PROJECTS
      C
      CrazyHorse80