ESP32 spadne při poslání HTTP požadavku

ESP32 spadne při poslání HTTP požadavku
« kdy: 08. 07. 2024, 19:56:50 »
Zabavam sa s ESP32. Programujem to cez Arduino IDE a narazil som na problem.
Rad by som poslal zaznam ze na danom pine sa zmenil signal cez HTTP request.
Kód: [Vybrat]
#include <WiFi.h>
#include <WebServer.h>
#include <FastLED.h>
#include <EEPROM.h>
#include <HTTPClient.h>

// Definície k LED pásu
#define NUM_LEDS 42
#define LED_PIN 2
#define LED_TYPE WS2813
#define COLOR_ORDER GRB
#define BRIGHTNESS 100
CRGB leds[NUM_LEDS];

// Nastavenia pre webserver
char ssid[32] = "xxx";
char password[32] = "sss";
WebServer server(80);

// EEPROM address definitions
#define EEPROM_SIZE 512
#define IP_ADDR_START 0
#define SEGMENT_COLORS_START 16
#define SEGMENT_RANGES_START 64
#define SEGMENT_POLARITY 128
#define WIFI_CREDENTIALS_START 256
#define MONITOR_PIN14_ADDR 320

String HOST_NAME = "http://192.168.0.7";
String PHP_FILE_NAME = "/insert_data.php";
String tempQuery = "?temperature=31.0";


IPAddress staticIP(192, 168, 0, 50);  // Default static IP address
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

IPAddress apIP(192, 168, 0, 50);  // IP address for AP mode
IPAddress apGateway(192, 168, 0, 1);
IPAddress apSubnet(255, 255, 255, 0);


const int segmentPins[] = { 14, 27, 26, 25, 33, 32 };
CRGB segmentColors[] = { CRGB::Orange, CRGB::Blue, CRGB::Green, CRGB::Red, CRGB::Purple, CRGB::Yellow };
int segmentRanges[][2] = { { 1, 7 }, { 8, 14 }, { 15, 21 }, { 22, 28 }, { 29, 35 }, { 36, 42 } };
bool polarity[] = { false, false, false, false, false, false };
bool monitorPin14 = false;
int lastPin14State = LOW;
------
void loop() {
  server.handleClient();

  for (int i = 0; i < 6; i++) {
    controlSegmentPower(segmentPins[i], segmentColors[i], segmentRanges[i][0], segmentRanges[i][1], polarity[i]);
  }
}
void controlSegmentPower(int segmentPin, CRGB segmentColor, int startIndex, int endIndex, bool polarity) {
 if (monitorPin14 and segmentPin == 14) {
    // Monitor Pin 14 logic
    int currentPin14State = digitalRead(14);
    Serial.println(currentPin14State);
    if (currentPin14State != lastPin14State) {
      if (currentPin14State == LOW) {
        sendHTTPRequest(); // Call function to send HTTP request
      }
      lastPin14State = currentPin14State;
    }
  }

  if (polarity == false) {
    if (digitalRead(segmentPin) == HIGH) {
      delay(100);
      for (int i = startIndex; i <= endIndex; i++) {
        leds[i] = segmentColor;
      }
    } else {
      for (int i = startIndex; i <= endIndex; i++) {
        leds[i] = CRGB::Black;
      }
    }
  } else {
    if (digitalRead(segmentPin) == LOW) {
      delay(100);
      for (int i = startIndex; i <= endIndex; i++) {
        leds[i] = segmentColor;
      }
    } else {
      for (int i = startIndex; i <= endIndex; i++) {
        leds[i] = CRGB::Black;
      }
    }
  }
  FastLED.show();
  delay(100);
}

void sendHTTPRequest() {
  try {
    if (WiFi.status() == WL_CONNECTED) {
      HTTPClient http;
      String url = HOST_NAME + PHP_FILE_NAME + tempQuery;
      Serial.println("URL: " + url);

      http.begin(url.c_str());
      int httpCode = http.GET();
      if (httpCode > 0) {
        String payload = http.getString();
        Serial.println("Response payload: " + payload);
      } else {
        Serial.println("Error on HTTP request");
      }
      http.end();
    } else {
      Serial.println("WiFi not connected");
    }
  } catch (const std::exception &e) {
    Serial.println("Exception occurred: " + String(e.what()));
  } catch (...) {
    Serial.println("Unknown exception occurred");
  }
}

Problem je ze vzdy ked by mal poslat request ze sa nieco zmenilo tak to cele spadne.
Kód: [Vybrat]
19:28:00.237 -> EXCVADDR: 0x00000014  LBEG    : 0x40084c19  LEND    : 0x40084c21  LCOUNT  : 0x00000027 
19:28:00.333 ->
19:28:00.333 ->
19:28:00.333 -> Backtrace: 0x400e0552:0x3ffb2170 0x400e061d:0x3ffb2190 0x400e0657:0x3ffb21e0 0x400e0680:0x3ffb2200 0x400d4cf8:0x3ffb2220 0x400d55d7:0x3ffb2250 0x400e2ef8:0x3ffb2270 0x400906a6:0x3ffb2290
19:28:00.526 ->
19:28:00.526 ->
19:28:00.526 ->

Ani google mi nepomohol ani chatGPT. Kde je zrada? Ma niekto skusenost?


Re:ESP32 spadne při poslání HTTP požadavku
« Odpověď #1 kdy: 08. 07. 2024, 20:52:58 »
Nechce se mi to zkoumat celé, ale jste si jistý tím try x catch ?
Myslím, že na různých fórech jsem četl, že Arduino C++ to nepodporuje i když se tváří, že to zkompiluje

Jinak já když podobně tápu, tak si najdu funkční příklad toho, co mi nejde, vyzkouším a obalím vlastním kódem.
Zkoušel bych natvrdo posílat nějaký pevný řetězec a postupně to nahrazovat tím co chcete aby to dělalo.

Re:ESP32 spadne při poslání HTTP požadavku
« Odpověď #2 kdy: 08. 07. 2024, 21:48:24 »
Trosku som hladal dalej ale nie je to v tom.
Kód: [Vybrat]
if (monitorPin14 && segmentPin == 14) {
    // Monitor Pin 14 logic
    int currentPin14State = digitalRead(14);
    Serial.print("Current Pin 14 State: ");
    Serial.println(currentPin14State);
    Serial.println(lastPin14State);

    if (currentPin14State != lastPin14State) {
      Serial.println("State change detected on Pin 14");
      if (currentPin14State == 0) {
        Serial.println("Pin 14 is now LOW");
      } else {
        Serial.println("Pin 14 is now HIGH");
      }
      lastPin14State = currentPin14State;
    }
 
  }

Kód: [Vybrat]
Connecting to WiFi...
Connected to WiFi
IP address: 192.168.0.50
HTTP server started
Current Pin 14 State: 0
0
Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.

Core  1 register dump:
PC      : 0x400deb89  PS      : 0x00060b30  A0      : 0x800deba4  A1      : 0x3ffb21e0 
A2      : 0x3ffc39ec  A3      : 0x3f400ec4  A4      : 0x00000038  A5      : 0x3ffc3f04 
A6      : 0x3ffc46e0  A7      : 0x000000f9  A8      : 0x000000ac  A9      : 0x3ffb21d0 
A10     : 0x00000016  A11     : 0x3f400eda  A12     : 0x00000016  A13     : 0x0000ff00 
A14     : 0x00ff0000  A15     : 0xff000000  SAR     : 0x0000000e  EXCCAUSE: 0x0000001c 
EXCVADDR: 0x000000b8  LBEG    : 0x4008a1a9  LEND    : 0x4008a1b9  LCOUNT  : 0xfffffffa 


Backtrace: 0x400deb86:0x3ffb21e0 0x400deba1:0x3ffb2200 0x400d4bfc:0x3ffb2220 0x400d553b:0x3ffb2250 0x400e1c20:0x3ffb2270 0x4008ee52:0x3ffb2290

Takze chyba je v tom ked porovnava status ale nechapem preco.

Karmelos

  • *****
  • 1 048
    • Zobrazit profil
    • E-mail
Re:ESP32 spadne při poslání HTTP požadavku
« Odpověď #3 kdy: 09. 07. 2024, 05:45:32 »
Neporovnáváš tam pointer s integerem? Mám dojem že by se to nemělo...
Gréta je nejlepší.

Jen Kings

  • ***
  • 108
  • Hryprodva.cz
    • Zobrazit profil
    • Hry Pro Dva
    • E-mail
Re:ESP32 spadne při poslání HTTP požadavku
« Odpověď #4 kdy: 09. 07. 2024, 07:24:34 »
A nebijou se ti trochu datové typy ?
Nahoře definuješ toto:

bool polarity[] = { false, false, false, false, false, false };

ale pak máš funkci:

void controlSegmentPower(int segmentPin, CRGB segmentColor, int startIndex, int endIndex, bool polarity) {


RDa

  • *****
  • 2 700
    • Zobrazit profil
    • E-mail
Re:ESP32 spadne při poslání HTTP požadavku
« Odpověď #5 kdy: 09. 07. 2024, 09:53:35 »
Si ten kod zkus wrapnout necim at to muzes pustit na PC, a pak gdb je tvuj kamarad kdyz to padne :)

Bugsa

  • ***
  • 127
    • Zobrazit profil
    • E-mail
Re:ESP32 spadne při poslání HTTP požadavku
« Odpověď #6 kdy: 09. 07. 2024, 10:37:29 »
A nebijou se ti trochu datové typy ?
Nahoře definuješ toto:

bool polarity[] = { false, false, false, false, false, false };

ale pak máš funkci:

void controlSegmentPower(int segmentPin, CRGB segmentColor, int startIndex, int endIndex, bool polarity) {

Však tu funkci volá v loopu dobře:
Kód: [Vybrat]
controlSegmentPower(segmentPins[i], segmentColors[i], segmentRanges[i][0], segmentRanges[i][1], polarity[i])
Citace: Karmelos
Neporovnáváš tam pointer s integerem? Mám dojem že by se to nemělo...
Obojí je int, to se do toho kódu ani nepodíváš před odpovědí?


Wangarad:

Chybí ti tam funkce setup(). Z toho kódu, co je tu postnutý, je podle mě problém v tom, že jsi pinům nenastavil žádný mód pomocí
Kód: [Vybrat]
pinMode https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/

V minimálním příkladu v emulátoru to pak po nastavení INPUT i OUTPUT funguje: https://wokwi.com/projects/402921204218575873

A těm delayům v kódu se taky doporučuji vyhnout. Lepší je zaznamenat si čas do proměnné millis() a v loopu porovnávat zda už čas "delaye" uběhl.



« Poslední změna: 09. 07. 2024, 10:41:04 od Bugsa »

Jen Kings

  • ***
  • 108
  • Hryprodva.cz
    • Zobrazit profil
    • Hry Pro Dva
    • E-mail
Re:ESP32 spadne při poslání HTTP požadavku
« Odpověď #7 kdy: 09. 07. 2024, 10:49:20 »
A nebijou se ti trochu datové typy ?
Nahoře definuješ toto:

bool polarity[] = { false, false, false, false, false, false };

ale pak máš funkci:

void controlSegmentPower(int segmentPin, CRGB segmentColor, int startIndex, int endIndex, bool polarity) {

Však tu funkci volá v loopu dobře:
Kód: [Vybrat]
controlSegmentPower(segmentPins[i], segmentColors[i], segmentRanges[i][0], segmentRanges[i][1], polarity[i])


To ano, ale vnitřek funkce používá proměnnou polarity definovanou jako bool,  zatímco globálně má definovanou ještě proměnnou polarity jako pole boolů.

Ten jejich překladač se občas v podobných situacích chová velice nevyzpytatelně. Oficiálně to ani není Cčko, ale jazyk Wiring.

Re:ESP32 spadne při poslání HTTP požadavku
« Odpověď #8 kdy: 09. 07. 2024, 17:21:15 »
A nebijou se ti trochu datové typy ?
Nahoře definuješ toto:

bool polarity[] = { false, false, false, false, false, false };

ale pak máš funkci:

void controlSegmentPower(int segmentPin, CRGB segmentColor, int startIndex, int endIndex, bool polarity) {

Však tu funkci volá v loopu dobře:
Kód: [Vybrat]
controlSegmentPower(segmentPins[i], segmentColors[i], segmentRanges[i][0], segmentRanges[i][1], polarity[i])


To ano, ale vnitřek funkce používá proměnnou polarity definovanou jako bool,  zatímco globálně má definovanou ještě proměnnou polarity jako pole boolů.

Ten jejich překladač se občas v podobných situacích chová velice nevyzpytatelně. Oficiálně to ani není Cčko, ale jazyk Wiring.

Nesmysl, to je naprosto v poradku.