Go Down

Topic: ESP8266 et arduino (Read 5484 times) previous topic - next topic

J-M-L

#15
Sep 08, 2018, 04:31 pm Last Edit: Sep 08, 2018, 04:31 pm by J-M-L
il y a plusieurs soucis:

- ce test if (strcmp(detect, item)) veut dire si item est différent de detect. Comme item est null vous rentrez bien dans le if, mais il ne sert donc pas à grand chose

- quand vous écrivez i = +1; vous n'incrémentez pas i... vous affectez juste la valeur 1.. je suppose qe vous vouliez faire i += 1;

- ensuite attention aux index dans les tableaux, ils commencent à 0
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

kamill

#16
Sep 08, 2018, 04:44 pm Last Edit: Sep 08, 2018, 04:44 pm by kamill
Bonjour,

Tu as mis
Code: [Select]
for ( i = 1; i = 4; ++i)
ce devrait être
Code: [Select]
for ( i = 1; i <= 4; ++i)

D'autre part les indices dans le tableau vont de 0 à 3 et non de 1 à 4
il faut donc corriger
Code: [Select]
for ( i = 0; i < 4; i++)
Corriger aussi dans Decodage_URL()

EricRecifal33480

#17
Sep 08, 2018, 07:10 pm Last Edit: Sep 08, 2018, 07:43 pm by EricRecifal33480
Je continu de galérer avec mon tableau, sur le PARAM[0] suivant l'endroit ou je me trouve dans le code j'ai pas la même valeur.
Une idée du pourquoi ?
Je suis pas loin de ce que je cherche mais là.... mystère et boule de gomme

Code: [Select]

char *item;
char *item1;
char *Param[4];
char *Value[4];
char *detect="/?EtatV1";
int i;
const char s[2] = "=";
String sxr;
char urlCommand;
void setup() { 
  Serial.begin(9600);
  //
}

void loop()

Decodage_URL_Manuel();

delay(10000);
}

void Decodage_URL_Manuel()
{
  char str[80] = "/?EtatV1=OFF&PManuV1=10&EtatV2=ON&PManuV2=50";   
  i=0;
  item = strtok(str, s);
  item1=strtok (NULL, "&");
  Param[0]=item;
  Value[0]=item1;
  Serial.println(Param[0]); // ---> RESULTAT : /?EtatV1
  while( item != NULL )
      {
        i+=1;
        printf( " %s\n", item );
        item = strtok(NULL, s);
        item1=strtok (NULL, "&");
        Param[i]=item;
        Value[i]=item1;
      }

//Action
Serial.println(Param[0]); // ---> RESULTAT : VIDE :(
Serial.println(Value[0]);
if (strcmp(Param[0],"/?EtatV1")==0)
  {
    Serial.print("Pareil");
    if (strcmp(Param[0],"ON"))
    {
    Serial.print("Pareil ON");
    }
    else
    {Serial.print("Pareil OFF");
    }
  }
else {Serial.print("Pas Pareil");}
}

J-M-L

#18
Sep 08, 2018, 07:46 pm Last Edit: Sep 08, 2018, 08:02 pm by J-M-L
votre chaîne de caractère est en variable locale dans Decodage_URL_Manuel() donc la mémoire est libérée dès que vous sortez de la fonction, elle peut être ensuite utilisée pour tout autre chose...

comme vous faites 2 strtok() dans le code, idéalement au lieu de ne tester que item
Code: [Select]
while( item != NULL ) dans le while, vous devriez tester les 2

Je verrais donc plus un truc du genre
Code: [Select]
char monURL[] = "/?EtatV1=OFF&PManuV1=10&EtatV2=ON&PManuV2=50";

const byte maxParam = 10;
char *Param[maxParam];
char *Value[maxParam];
byte nbParam;

const char detect[] = "/?Etat";
const byte longeurDetect = sizeof(detect) - 1;
const char * egal = "=";
const char * esperluette = "&";


byte decode()
{
  byte paramEnCours = 0;
  char *debutAnalyse;
  char *ptr;

  if (!strncmp(monURL, detect, longeurDetect)) { // commmence-t-on bien par detect ?

    debutAnalyse = monURL + longeurDetect; // si oui on va commencer à analyser après detect

    ptr = strtok(debutAnalyse, egal);
    if (ptr) {
      while (ptr && (paramEnCours < maxParam)) {
        Param[paramEnCours] = ptr;
        ptr = strtok(NULL, esperluette);
        if (ptr) Value[paramEnCours++] = ptr;
        else break;
        ptr = strtok(NULL, egal);
      }
    } else Serial.println(F("pas de signe ="));
  } else Serial.println(F("MAUVAIS DEBUT D'URL"));

  return paramEnCours;

}


void setup() {
  Serial.begin(115200);

  Serial.print(F("Je decode: "));
  Serial.println(monURL);

  byte n = decode();

  for (byte i = 0; i < n; i++) {
    Serial.print(F("["));
    Serial.print(Param[i]);
    Serial.print(F("] --> ["));
    Serial.print(Value[i]);
    Serial.println(F("]"));
  }
}

void loop() {}


la console série affichera alors:

Je decode: /?EtatV1=OFF&PManuV1=10&EtatV2=ON&PManuV2=50
[V1] --> [OFF]
[PManuV1] --> [10]
[EtatV2] --> [ON]
[PManuV2] --> [50]



Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EricRecifal33480

#19
Sep 09, 2018, 07:43 pm Last Edit: Sep 11, 2018, 06:05 pm by EricRecifal33480
Bonsoir,

Mon projet avance tranquillement,

J'ai vraiment galéré avec le SoftwareSerial cette après-midi, j'ai dû pour des raisons d'utilisi des broches digitales de les déplacer en 13 et 12 et jamais l'appli n'a voulu fonctionner avec ces broches ! Je n'ai toujours pas trouvé pourquoi, auriez vous une idée ?

je bute mais je comprend pas mon nouveau problème

le souci :(

Je n'arrive pas à avoir tout mes paramètres dans la requête GET je m'arrête à H2V2=

"0,CONNECT+IPD,0,726:GET /?H1V1=00%3A00&P1V1=100&H1V2=00%3A00&P1V2=100&H2V1=00%3A00&P2V1=100&H2V2="

Ce qui fait que je ne rafraichit pas le weebroot et je perd une partie de mes paramètres

J'ai modifié toutes les variables que j'ai trouvé qui me semblait agir sur la longueur de l'url mais je sêche

Y a t'il une limitation dans la longueur de l'url?

De plus je me suis rendu compte que pour récupérer les h et mn il y avait "%3A" comme séparateur sachant que le but sera d'avoir une variable ou tous sera en min.j'imagine que je doit faire un decodage de ce séparateur

Y a t'il une autres solutions que l'utilisation du strok() ?

Bonne fin de week end à tous

EricRecifal33480

#20
Sep 10, 2018, 06:49 pm Last Edit: Sep 10, 2018, 06:56 pm by EricRecifal33480
Bonjour,

Je continu de chercher la ou les variables qui bloque ma longueur d'url.
Je trouve pas on dirait que je ne peux pas dépasser une longueur de chaine de 88 caractères. Mais je ne comprend vraiment pas pourquoi 

J-M-L

#21
Sep 11, 2018, 01:35 pm Last Edit: Sep 11, 2018, 01:35 pm by J-M-L
(je vous ai envoyé un MP)

Wow ça va prendre bcp de mémoire....

Code: [Select]
const byte maxMessageSize = 600;
char ESP_MessageLine[maxMessageSize + 1]; // +1 as we want to be able to store the trailing '\0'



Code: [Select]
const byte maxURLLength = 600;
//const byte maxURLLength = 20;
char urlBuffer[maxURLLength];


--> à mon avis vous avez un débordement quelque part qui vient polluer votre code. Quel type d'arduino utilisez vous?

Sinon à quoi servent vos {H} et {P} dans la page HTML ? les accolades rajoutent les % dans l'URL qui allongent votre URL

pour aider à débugger rajoutez un Serial.write() du caractère reçu dans "gotLine()" pour voir ce que vous recevez vraiment.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EricRecifal33480

Bonjour
Alors mon application est sur un Arduino Uno mais j'attend un Mega car la page web « rame » à 19200 bauds chose que j'espere améliorer avec un Mega et une vrai liaison série. Malheureusement j'ai reçu une carte Mega mais elle ne fonctionne pas cela va me mettre en pause un petit peu.

Les variables je pense que je me suis enflammé et je n'ai pas pensé à la mémoire du Arduino sachant qu'entre le get et la fin de requête il ne devrait pas excéder 352 caractères ce qui n'est déjà pas mal

Les {h} et {p} ne servent à rien comme vous le faites remarquer

Concernant la fonction gotline(), en effet je n'ai pas regardé là. J'ai juste regardé le ishttprequest et c'est là que je m'arrête à 88 caractères.

J-M-L

#23
Sep 11, 2018, 06:11 pm Last Edit: Sep 11, 2018, 07:11 pm by J-M-L
gotline() est la partie qui écoute, ce serait bien de voir si vous recevez tout mais oui sur un Uno vous l'étranglez avec les gros buffers :)


votre Mega améliorera grandement la stabilité de la liaison série mais vous ne verrez sans doute pas une "méga"  :smiley-roll:  amélioration des perf... si vous voulez aller plus vite il faudra passer à une interface plus évoluée que les commandes AT (le temps est surtout perdu dans des ack réseau)

cf mon (début de) tuto Techniques "avancées" de serveur web sur ESP8266
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EricRecifal33480

J'ai flingué mon esp8266 mauvaise journée

Quand tu dis que j'étrangle le Uno, cela veut il dire que je ne peux pas récupérer mon url sur un Uno? Est il imaginable que sur le Mega le problème soit différent ? Je n'avais besoin que de 4 voies maxi

Je bosse donc avec l'hypothèse que je vais réussir à récupérer mon url complète

Je me pose la question suivante vu que les valeurs HxVx doivent être convertis en min.
Dois-je stocker les valeurs tel qu'elle arrive de l'url Et les découper une à une après
Ou
Décoder les %3A et convertir les deux valeurs en min directement afin de limiter les paramètres ?

J-M-L

#25
Sep 11, 2018, 07:37 pm Last Edit: Sep 11, 2018, 07:39 pm by J-M-L
Quand tu dis que j'étrangle le Uno, cela veut il dire que je ne peux pas récupérer mon url sur un Uno? Est il imaginable que sur le Mega le problème soit différent ? Je n'avais besoin que de 4 voies maxi
Non juste utilisez des buffer plus petits, vous n'avez pas besoin de toute cette place.

Je bosse donc avec l'hypothèse que je vais réussir à récupérer mon url complète
Je me pose la question suivante vu que les valeurs HxVx doivent être convertis en min.
Dois-je stocker les valeurs tel qu'elle arrive de l'url Et les découper une à une après
Ou
Décoder les %3A et convertir les deux valeurs en min directement afin de limiter les paramètres ?
perso je ferai de l'AJAX / POST et pas du GET sous cette forme avec des URLs. ça serait plus efficace. Mais pour ce type d'interface, éventuellement séparer le formulaire en blocs différents (ça réduit l'URL) et  oui décoder la valeurs à la volée (si c'est votre question)

J'ai flingué mon esp8266 mauvaise journée
Damned... cela dit, si votre mega ne marche pas et que votre ESP12 est dead, jetez un oeil sur les MKR1010, les Lolin ESP32 ou Wemos/Lolin D1.... quitte à changer, prenez un truc qui intègre le wifi en standard
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EricRecifal33480

J'avoue que je pense déjà à faire la même avec un esp32 mais j'aimerais finir cette histoire avec les Arduino et esp8266 en commande AT

J-M-L

J'avoue que je pense déjà à faire la même avec un esp32 mais j'aimerais finir cette histoire avec les Arduino et esp8266 en commande AT
OK - oui c'est toujours formateur d'explorer
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EricRecifal33480

L'esp 32 est il le meilleur choix pour ce type d'application

Les besoins
1 horloge
4 sorties à la fin
Le wifi

Y a t'il des fonctions que je pourrais utiliser de cette appli dans un esp32?

De ce que j'ai cru comprendre il ce programme comme l'arduino avrc l'ide, le langage ne diffère pas trop

Artouste

L'esp 32 est il le meilleur choix pour ce type d'application

Les besoins
1 horloge
4 sorties à la fin
Le wifi

Y a t'il des fonctions que je pourrais utiliser de cette appli dans un esp32?

De ce que j'ai cru comprendre il ce programme comme l'arduino avrc l'ide, le langage ne diffère pas trop
Bonsoir
Pragmatiquement ,c'est un très bon candidat actuellement

Go Up