Ma première étape est de faire affiché une page web "hello world" sur mon téléphone depuis mon arduino connecté à un esp8266
J'utilise le code ci dessous
J'ai bien une communication que je vois sur mon "moniteur serie".Tout semble OK
Mais j'ai un timeout sur l'adresse indiqué (192.168.4.1)
#include <SoftwareSerial.h>
#define DEBUG true
SoftwareSerial esp8266(11,10);
void setup()
{
Serial.begin(115200);
esp8266.begin(115200); // your esp's baud rate might be different
sendData("AT+RST\r\n",2000,DEBUG); // reset module
sendData("AT+CWMODE=2\r\n",1000,DEBUG); // configure as access point
sendData("AT+CIFSR\r\n",1000,DEBUG); // get ip address
sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // configure for multiple connections
sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // turn on server on port 80
}
void loop()
{
if(esp8266.available()) // check if the esp is sending a message
{
while(esp8266.available())
{
// The esp has data so display its output to the serial window
char c = esp8266.read(); // read the next character.
Serial.write(c);
}
if(esp8266.find("+IPD,"))
{
delay(1000);
int connectionId = esp8266.read()-48; // subtract 48 because the read() function returns
// the ASCII decimal value and 0 (the first decimal number) starts at 48
String webpage = "<h1>Hello</h1><h2>World!</h2><button>LED1</button>";
String cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend +=webpage.length();
cipSend +="\r\n";
sendData(cipSend,1000,DEBUG);
sendData(webpage,1000,DEBUG);
webpage="<button>LED2</button>";
cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend +=webpage.length();
cipSend +="\r\n";
sendData(cipSend,1000,DEBUG);
sendData(webpage,1000,DEBUG);
String closeCommand = "AT+CIPCLOSE=";
closeCommand+=connectionId; // append connection id
closeCommand+="\r\n";
sendData(closeCommand,3000,DEBUG);
}
}
}
String sendData(String command, const int timeout, boolean debug)
{
String response = "";
esp8266.print(command); // send the read character to the esp8266
long int time = millis();
while( (time+timeout) > millis())
{
while(esp8266.available())
{
// The esp has data so display its output to the serial window
char c = esp8266.read(); // read the next character.
response+=c;
}
}
if(DEBUG)
{
Serial.print(response);
}
return response;
}
Je me pose une question avant de continuer mon projet
J’ai 8 boîtes de saisies html à faire dont les valeurs seront envoyées à l’appui sur un bouton envoyées. La méthode Get est elle vraiment judicieuse ?
EricRecifal33480:
Je me pose une question avant de continuer mon projet
J’ai 8 boîtes de saisies html à faire dont les valeurs seront envoyées à l’appui sur un bouton envoyées. La méthode Get est elle vraiment judicieuse ?
c'est plus une question HTML que Arduino... avez vous un seul bouton de soumission d'un formulaire? souhaitez vous un bouton par champs texte? etc...
Je me sais bien que la c’est plutôt un quizz html mais c’est le soft Arduino qui va devoir récupérer ces informations et les traiter
L’idée global c’est d’avoir 2 boutons on/off pour allumer manuellement des leds de puissance ( pas directement)
Et avoir 8 boites de saisie pour programmer des heures allumages et d'extinctions en assignant les saisies dans des variables ( ce qui veux dire décodage h min et conversion en une même unité). Un appui sur un bouton enregistrer envoi toutes ces valeurs par méthode get ou post je sais pas je bloque sur ce point et bien d’autres
d'un point de vue code, si tout est dans un seul formulaire il faudra décoder les valeurs dans l'URL.. ce n'est pas sorcier vu que vous savez à quoi vous attendre - à peine plus compliquer que de décoder un seul paramètre
jetez un oeil au bout de code de mon exemple de serveur interactif (pour le shield ethernet) vous verrez l'usage de strtok() pour faire l'analyse de plusieurs paramètres dans l'URL
Petite question JML m’autorise tu à poster mon code quand j’aurais finit de faire fonctionner mon appli?sachant que le plus gros du code sera le tiens.
Bon je rencontre déjà des soucis, j’ai deux fonctions html. Une renvoi bien une requête avec des paramètres l’autres non. Alors que quand je l’envoie direct dans le navigateur sa fonctionne.
Le principe de la page web dans le .h est top
Je bute sur un truc que je ne m'explique pas et je suis sur que c'est un truc bête.
Je suis en train d'essayer de décoder mon url du mode manuel
Je suis pas loin du truc mais je ne comprend pas
j'ai déclaré deux tableaux Param et Value. Dans la void Decodage_URL je réussit à faire un Serial.println du contenu des tableaux mais dans la loop c'est vide >:( .
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
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
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 itemwhile( item != NULL ) dans le while, vous devriez tester les 2
Je verrais donc plus un truc du genre
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() {}
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=
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() ?