ESP32 serveur problème de retour avec "$.ajax"

Bonjour,

Comme indiqué dans ma présentation, je suis en train de réaliser un WALL-E:
je travail sous VS CODE:

à chaque fois que j’agis sur ma page web le serveur rebout :

Connexion etablie!
Adresse IP: 192.168.1.91
Serveur actif!
G0
CORRUPT HEAP: Bad head at 0x3ffd0028. Expected 0xabba1234 got 0xa5a5a5a5

assert failed: multi_heap_free multi_heap_poisoning.c:253 (head != NULL)        


Backtrace:0x40083661:0x3ffd26300x4008b8d1:0x3ffd2650 0x40090ce1:0x3ffd2670 0x40090927:0x3ffd27a0 0x40083ac5:0x3ffd27c0 0x40090d11:0x3ffd27e0 0x400db622:0x3ffd2800 0x400db631:0x3ffd2820 0x400d7aee:0x3ffd2840 0x400d9b4d:0x3ffd2860 0x400d54b3:0x3ffd2880 0x400d54c1:0x3ffd28a0 0x40143412:0x3ffd28c0 0x4014370a:0x3ffd28f0 0x40143720:0x3ffd2910 0x401438b1:0x3ffd2930 




ELF file SHA256: 0000000000000000

Le "G0" sous "Serveur actif" est le retour attendu de ma page.

voici mon code:
main.ccp

#include <Arduino.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
#include "DallasTemperature.h"
#include "OneWire.h"
#include "DHT.h"
#include "Adafruit_Sensor.h"

const int cap_DHT11 = 5;

LiquidCrystal_I2C LCD(0x27,16,2);
// -------------------determination de capteur DHT11 sur la borne 5
DHT dht(cap_DHT11,DHT11);

// -------------------determination capteur DS18b20   sur la borne 23
OneWire oneWire(23);
DallasTemperature ds(&oneWire);



const char* ssid = "ma_box";
const char* password = "mon_passe_word";
const char* PARAM_INPUT_1 = "output";
const char* PARAM_INPUT_2 = "state";
const int led = 2;
const int capteurLuminosite = 34;

AsyncWebServer server(80);



void setup() 
{
  //----------------------------------------Serial
  Serial.begin(115200);
  // while (!Serial){}
  Serial.print("\n");
  
  //----------------------------------------GPIO
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  pinMode(capteurLuminosite, INPUT);
  

  //----------------------------------------SPIFFS
  if(!SPIFFS.begin())
  {
    Serial.println("Erreur SPIFFS...");
    return;
  }

  File root = SPIFFS.open("/");
  File file = root.openNextFile();

  while (file)
  {
    Serial.print("File: ");
    Serial.println(file.name());
    file.close();
    file = root.openNextFile();

  }
  

  //----------------------------------------WIFI
  Serial.begin(115200);
	delay(1000);
	Serial.println("\n");
	
	WiFi.begin(ssid, password);
	Serial.print("Tentative de connexion...");
	
	while(WiFi.status() != WL_CONNECTED)
	{
		Serial.print(".");
		delay(100);
	}
	
	Serial.println("\n");
	Serial.println("Connexion etablie!");
	Serial.print("Adresse IP: ");
	Serial.println(WiFi.localIP());
  //----------------------------------------SERVER
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    request->send(SPIFFS, "/index.html", "text/html");
  });

  server.on("/w3.css", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    request->send(SPIFFS, "/w3.css", "text/css");
  });

  server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    request->send(SPIFFS, "/script.js", "text/javascript");
  });

  server.on("/jquery-3.6.1.min.js", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    request->send(SPIFFS, "/jquery-3.6.1.min.js", "text/javascript");
  });


  server.on("/servoControl", HTTP_POST, [](AsyncWebServerRequest *request)
  {
    String data[1];
    if (request->hasParam("servo", true))
    {
      data[0] = request-> getParam("servo",true)-> value();
      data[1] = request-> getParam("value",true)-> value();
      Serial.print (data[0]);
      Serial.println (data[1]);
    }
    request->send(204);
  });



  server.begin();
  Serial.println("Serveur actif!");



  //--------------------------init LCD
  
}

//---------------------------- Fonction 






void loop()
{




}

scrip.js

function servoControl(item, servo, value) {
	$.ajax({
		url: "/servoControl",
		type: "POST",
		data: {"servo": servo, "value": value},
		dataType: "json",
	});
}

index.html

<!DOCTYPE html>
<html lang="fr">
    
<head>
    <title>Pilotage du WALL-E</title>
    <meta name="viewport" content="width=device-width, initial-scale=1"charset="UTF-8" />
    <link rel="stylesheet" type="text/css" href="w3.css">
    <script type="text/javascript" src="jquery-3.6.1.min.js"></script>
    <script type="text/javascript" src="script.js"></script>
</head>

<body class="w3-animate-opacity">

    <div class="w3-card w3-blue w3-padding-small w3-center">
        <h1>Wall-E</h1>
    </div>

    <div class="w3-margin w3-center w3-card w3-padding-24">
        <div class="w3-padding">Eye Left</div>
        <div class="w3-padding">
            <input id="head-rotation" class="set-slide custom-range" type="range" min="0" max="100" step="1" value="50" onfocus="this.oldvalue = this.value;" onchange="servoControl(this,'G',value)"/>        </div>
    </div>

    <div class="w3-padding w3-center">
        <i>@Rasta 2022</a></i>
    </div>

</body>

</html>

je ne comprends pas encore tout le code, mais avant d'aller plus loin je souhaite comprendre le problème.
Merci par avance :wink:
Rasta

Bonjour,

Je viens de trouver mon erreur!

 String data[1];

mon tableau est trop petit !

a bientôt pour la suite.

oui !

et en pratique vous n'avez pas vraiment besoin d'un tableau si c'est juste pour imprimer


  server.on("/servoControl", HTTP_POST, [](AsyncWebServerRequest * request)
  {
    if (request->hasParam("servo", true)) Serial.print(request-> getParam("servo", true)-> value()); else Serial.print("x");
    Serial.write('\t'));
    if (request->hasParam("value", true)) Serial.println(request-> getParam("value", true)-> value());else Serial.println("x");
    request->send(204);
  });

et si ce sont des valeurs numériques, autant les extraire sous forme de nombre plutôt que de dupliquer en mémoire la chaîne de caractère

Non en partie, chaque action sur le Wall-E est émise par une liaison série, sous forme d'une lettre, un nombre puis en retour chariot.

pour la forme du code: je me suis servi d'un exemple que j'ai adapté.

Rasta

OK mais là vous ne faites qu'imprimer, je suppose que dans le code "réel" vous traitez la commande ?

en HTLM j’appel servoControl

<input id="head-rotation" type="range" min="0" max="100" step="1" value="50"  onchange="servoControl('G',value)"/>

en script:

function servoControl(item, servo, value) {
	$.ajax({
		url: "/servoControl",
		type: "POST",
		data: {"servo": servo, "value": value},
		dataType: "json",
	});
}

en sur la carte ESP 32:
je revois les infos reçu

server.on("/servoControl", HTTP_POST, [](AsyncWebServerRequest *request)
  {
    String data[1];
    if (request->hasParam("servo", true))
    {
      data[0] = request-> getParam("servo",true)-> value();
      data[1] = request-> getParam("value",true)-> value();
      Serial.print (data[0]);
      Serial.println (data[1]);
    }
    request->send(204);

Mais que fait tu avec avec data[0] et data[1]?

Je l'ai envoie part le port série à la carte du robot :wink:

donc pourquoi passer par le tableau de String ??

if (request->hasParam("servo", true)) {
   Serial.print(request-> getParam("servo", true)-> value());
   Serial.println(request-> getParam("value", true)-> value())
}

Oui effectivement Merci

on y revient :joy:

déjà merci de vos réponses et conseils.
les codes donnent le même résulta!
Mais surtout j'ai compris la différence entre les deux.
156bytes
donc merci, je comprends mieux la philosophie de ce type d'imbrication.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.