Salut à vous tous , ça fait plus de 15 jours que j'essaie de programmer mon Esp 8266 01S, j'ai commencé par découvrir l'environnement de l'esp 8266 via les commandes AT en branchant le module à un arduino à l'intermédiaire de deux boutons poussoirs (Reset et prog), j'ai utilisé les commandes dédiés à connecter l'arduino au wifi et obtenir son adresse IP puis j'ai téléverser un programme dédié à le flasher, jusqu'à maintenant tout a marché comme sur des roulettes et j'ai la certitude que le module fonctionne très bien.
Les soucis vont commencer le jour ou j'ai commencé à entrer dans le vif de ce qui me conserne à savoir : obtenir des infos météorologiques via des API avec mon module, j'ai un problème avec les librairies et en plus de ça je ne me repère plus avec le json,y'a des erreurs partout, premièrement il ne reconnaît pas des fonctions dans le programme qui sont pourtant incluses dans les librairies, et deuxièmement il me signale des erreurs présentes dans les fichier .h des librairies que j'utilise, et je ne sais point comment corriger ces erreurs, pour info je les ai prise de github, téléchargé en tant que .h dans un dossier que j'ai placé avec les librairies arduinos, je ne trouve pas des infos détaillé sur le Web concernant les points que j' ai évoqué mais au moins là je suis sur que je suis au bon endroit ![]()
A condition de poser des questions précises ... ![]()
Bonjour,
Merci de lire les bonnes pratiques du forum francophone
Il faut donner le maximum d'informations.
- Quelles libraries (le nom et si possible un lien vers le site d'où elle a été chargée)?
- Code du programme qui pose problème
- Copie des messages d'erreur (pas de recopie d'écran)
Le programme ci dessous que je vais envoyer est le premier programme que j'ai testé car il est le plus proche de ce que je souhaite faire,
#include <JsonArray.h>
#include <ArduinoJson.h>
#include <JsonHashTable.h>
#include <memory.h>
#include <ESP8266HTTPClient.h>
#include <JsonParcer.h>
#include <SoftwareSerial.h>
#include <SPI.h>
using namespace ArduinoJson::Parser;
#define SSID "<ssid>" // insert your SSID
#define PASS "<password>" // insert your password
#define LOCATIONID "id" // location id
#define DST_IP "clé API" //api.openweathermap.org
SoftwareSerial dbgSerial(2, 3); // RX, TX for debugging
JsonParser<32> parser;
void setup()
{
Serial.begin(115200);
Serial.setTimeout(5000);
dbgSerial.begin(9600); // for debuging
dbgSerial.println("Init");
Serial.println("AT+RST"); // restet and test if module is redy
delay(1000);
if(Serial.find("ready")) {
dbgSerial.println("WiFi – Module is ready");
}else{
dbgSerial.println("Module dosn’t respond.");
dbgSerial.println("Please reset.");
while(1);
}
delay(1000);
// try to connect to wifi
boolean connected=false;
for(int i=0;i<5;i++){
if(connectWiFi()){
connected = true;
dbgSerial.println("Connected to WiFi…");
break;
}
}
if (!connected){
dbgSerial.println("Coudn’t connect to WiFi.");
while(1);
}
delay(5000);
Serial.println("AT+CIPMUX=0"); // set to single connection mode
}
void loop()
{
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += DST_IP;
cmd += "\",80";
Serial.println(cmd);
dbgSerial.println(cmd);
if(Serial.find("Error")) return;
cmd = "GET /data/2.5/weather?id=";
cmd += LOCATIONID;
cmd += " HTTP/1.0\r\nHost: api.openweathermap.org\r\n\r\n";
Serial.print("AT+CIPSEND=");
Serial.println(cmd.length());
if(Serial.find(">")){
dbgSerial.print(">");
}else{
Serial.println("AT+CIPCLOSE");
dbgSerial.println("connection timeout");
delay(1000);
return;
}
Serial.print(cmd);
unsigned int i = 0; //timeout counter
int n = 1; // char counter
char json[100]="R";
while (!Serial.find("\"main\":{")){} // find the part we are interested in.
while (i<60000) {
if(Serial.available()) {
char c = Serial.read();
json[n]=c;
if(c=="R") break;
n++;
i=0;
}
i++;
}
dbgSerial.println(json);
JsonObject root = parser.parse(json);
double temp = root["temp"];
double pressure = root["pressure"];
double humidity = root["humidity"];
temp -= 273.15; // from kelvin to degree celsius
dbgSerial.print("Temp: ");
dbgSerial.print((int)temp);
dbgSerial.print(".");
dbgSerial.print((int)((temp-(int)temp)*10));
dbgSerial.println(" C");
dbgSerial.print("Press: ");
dbgSerial.print((int)pressure);
dbgSerial.print("Humidity: ");
dbgSerial.print((int)humidity);
dbgSerial.println("%");
dbgSerial.println(temp);
dbgSerial.println(pressure);
dbgSerial.println(humidity);
dbgSerial.println("====");
delay(600000);
}
boolean connectWiFi()
{
Serial.println("AT+CWMODE=1");
String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
dbgSerial.println(cmd);
Serial.println(cmd);
delay(2000);
if(Serial.find("OK")){
dbgSerial.println("OK, Connected to WiFi.");
return true;
}else{
dbgSerial.println("Can not connect to the WiFi.");
return false;
}
}
pour les message d'erreur Y'a vraiment une infinité de lignes
messages d erreur.txt (90,3 Ko)
et voici les bibliothèques
JsonParcer.h (1,5 Ko)
ArduinoJson.h (146,2 Ko)
JsonHashTable.h (158,1 Ko)
JsonArray.h (178,8 Ko)
ESP8266HTTPClient.h (10,1 Ko)
memory.h (4,1 Ko)
Bonjour @othman2007
sur mon smartphone je ne suis pas 'confortable' pour ouvrir et consulter les fichiers joints, je les laisse donc de
côté pour répondre au mieux....
N'y aurait-il l pas une confusion entre deux modes de fonctionnement distincts des ESP8266, ici sous forme de module ESP-01 semble t'il ?
-
L'ESP8266 fait tourner un firmware AT, reçoit sur un port série des commandes AT, les exécute et retourne par ce même port série les résultat des commandes AT
-
L'ESP8266 exécute un programme développé sous IDE Arduino et faisant appel aux librairies , il n'est plus question de firmware AT , le programme 'perso' prenant sa place , il comporte des appels de fonction remplaçant (avantageusement) les commandes AT. Le téléversement à parti de l'IDE Arduino écrase un éventuel firmware AT prééxistant.
C'est l'un ou l'autre : ESP8266 autonome ou ESP8266 en 'modem WiFi' pour un autre microcontrolleur
La méthode la plus simple et la plus efficace pour 'obtenir des infos météorologiques via des API' est la seconde : 'ESP8266 travaillant 'en solo' , sans carte Arduino complémentaire
Si par contre l'ESP-01 sert de 'module WiFi' à une carte Arduino il est sans doute plus simple de lui laisser son firmware AT d'origine, l'intégralité du code développé sous IDE Arduino se bornant à envoyer des commandes AT et traiter les réponses.... Dans ce cas l'exploitation des données en json est à la charge de la carte Arduino, pas de l'ESP8266
Tu n'as pas installé la librairie ArduinoJson, tu as fait une copie de la page html github du projet.
Tu peux installer la librairie ArduinoJson directement depuis le gestionnaire de librairie de l'IDE Arduino.
Il y a peut-être d'autres choses mais déjà en installant les librairies correctement cela fera sauter pas mal d'erreurs et on y verra plus clair.
Pense à faire un ctrl+t dans l'IDE pour corriger l'indentation. Ton code est illisible.
oui c'est vrai j'avais recopié la page html ,j'ai rectifié cela et je vous remets les librairies ainsi que le programme car on m'a demandé d'autres ,
JsonHashTable.h (722 Octets)
JsonArray.h (704 Octets)
JsonParcer.h (1,6 Ko)
JsonObjectBase.h (793 Octets)
utilityjsmn.h (1,9 Ko)
les messages d'erreurs
In file included from C:\Program Files\Arduino\libraries\JsonArray/JsonArray.h:10:0,
from C:\Users\M. ALILOU\Documents\Arduino\m_t_o\m_t_o.ino:7:
C:\Program Files\Arduino\libraries\JsonHashTable/JsonHashTable.h:27:2: error: reference to 'JsonArray' is ambiguous
JsonArray getArray(const char* key);
^~~~~~~~~
C:\Program Files\Arduino\libraries\JsonHashTable/JsonHashTable.h:12:7: note: candidates are: class JsonArray
class JsonArray;
^~~~~~~~~
In file included from C:\Users\M. ALILOU\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson.h:9:0,
from C:\Users\M. ALILOU\Documents\Arduino\m_t_o\m_t_o.ino:5:
C:\Users\M. ALILOU\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson.hpp:51:41: note: typedef class ArduinoJson6194_1::ArrayRef ArduinoJson::JsonArray
typedef ARDUINOJSON_NAMESPACE::ArrayRef JsonArray;
^~~~~~~~~
In file included from C:\Users\M. ALILOU\Documents\Arduino\m_t_o\m_t_o.ino:18:0:
C:\Program Files\Arduino\libraries\JsonParcer/JsonParcer.h:23:7: error: too many template-parameter-lists
class JsonParser
^~~~~~~~~~
m_t_o:23:30: error: 'Parser' is not a namespace-name
using namespace ArduinoJson::Parser;
^~~~~~
m_t_o:23:36: error: expected namespace-name before ';' token
using namespace ArduinoJson::Parser;
^
m_t_o:35:1: error: 'JsonParser' does not name a type
JsonParser<32> parser;
^~~~~~~~~~
C:\Users\M. ALILOU\Documents\Arduino\m_t_o\m_t_o.ino: In function 'void loop()':
m_t_o:110:21: error: 'parser' was not declared in this scope
JsonObject root = parser.parse(json);
^~~~~~
C:\Users\M. ALILOU\Documents\Arduino\m_t_o\m_t_o.ino:110:21: note: suggested alternative: 'perror'
JsonObject root = parser.parse(json);
^~~~~~
perror
exit status 1
'Parser' is not a namespace-name
- le code programme
#include <utilityjsmn.h>
#include <JsonObjectBase.h>
#include <ArduinoJson.h>
#include <JsonArray.h>
#include <JsonHashTable.h>
#include <memory.h>
#include <JsonParcer.h>
#include <SoftwareSerial.h>
#include <SPI.h>
using namespace ArduinoJson::Parser;
#define SSID "<ssid>" // insert your SSID
#define PASS "<password>" // insert your password
#define LOCATIONID "id" // location id
#define DST_IP "clé API" //api.openweathermap.org
SoftwareSerial dbgSerial(2, 3); // RX, TX for debugging
JsonParser<32> parser;
void setup()
{
Serial.begin(115200);
Serial.setTimeout(5000);
dbgSerial.begin(9600); // for debuging
dbgSerial.println("Init");
Serial.println("AT+RST"); // restet and test if module is redy
delay(1000);
if (Serial.find("ready")) {
dbgSerial.println("WiFi – Module is ready");
} else {
dbgSerial.println("Module dosn’t respond.");
dbgSerial.println("Please reset.");
while (1);
}
delay(1000);
// try to connect to wifi
boolean connected = false;
for (int i = 0; i < 5; i++) {
if (connectWiFi()) {
connected = true;
dbgSerial.println("Connected to WiFi…");
break;
}
}
if (!connected) {
dbgSerial.println("Coudn’t connect to WiFi.");
while (1);
}
delay(5000);
Serial.println("AT+CIPMUX=0"); // set to single connection mode
}
void loop()
{
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += DST_IP;
cmd += "\",80";
Serial.println(cmd);
dbgSerial.println(cmd);
if (Serial.find("Error")) return;
cmd = "GET /data/2.5/weather?id=";
cmd += LOCATIONID;
cmd += " HTTP/1.0\r\nHost: api.openweathermap.org\r\n\r\n";
Serial.print("AT+CIPSEND=");
Serial.println(cmd.length());
if (Serial.find(">")) {
dbgSerial.print(">");
} else {
Serial.println("AT+CIPCLOSE");
dbgSerial.println("connection timeout");
delay(1000);
return;
}
Serial.print(cmd);
unsigned int i = 0; //timeout counter
int n = 1; // char counter
char json[100] = "R";
while (!Serial.find("\"main\":{")) {} // find the part we are interested in.
while (i < 60000) {
if (Serial.available()) {
char c = Serial.read();
json[n] = c;
if (c == "R") break;
n++;
i = 0;
}
i++;
}
dbgSerial.println(json);
JsonObject root = parser.parse(json);
double temp = root["temp"];
double pressure = root["pressure"];
double humidity = root["humidity"];
temp -= 273.15; // from kelvin to degree celsius
dbgSerial.print("Temp: ");
dbgSerial.print((int)temp);
dbgSerial.print(".");
dbgSerial.print((int)((temp - (int)temp) * 10));
dbgSerial.println(" C");
dbgSerial.print("Press: ");
dbgSerial.print((int)pressure);
dbgSerial.print("Humidity: ");
dbgSerial.print((int)humidity);
dbgSerial.println("%");
dbgSerial.println(temp);
dbgSerial.println(pressure);
dbgSerial.println(humidity);
dbgSerial.println("====");
delay(600000);
}
boolean connectWiFi()
{
Serial.println("AT+CWMODE=1");
String cmd = "AT+CWJAP=\"";
cmd += SSID;
cmd += "\",\"";
cmd += PASS;
cmd += "\"";
dbgSerial.println(cmd);
Serial.println(cmd);
delay(2000);
if (Serial.find("OK")) {
dbgSerial.println("OK, Connected to WiFi.");
return true;
} else {
dbgSerial.println("Can not connect to the WiFi.");
return false;
}
}
je ne peux pas travailler avec l'esp en solo car j'ai absolument besoin de l'arduino mega pour traiter les API reçus car je rajouterais un autre module à l'arduino ,bref des choses que je ne pas faire avec un esp uniquement
e ne peux pas travailler avec l'esp en solo car j'ai absolument besoin de l'arduino mega pour traiter les API reçus car je rajouterais un autre module à l'arduino ,bref des choses que je ne pas faire avec un esp uniquement
Ok, c'est ton choix. (un ESP8266 peut faire beaucoup de choses s'il est sur une carte bien pourvue en GPIO et non une carte étriquée comme la carte ESP-01)
Dans ce cas le code que tu montres est destiné à tourner sur une carte Mega si je comprends bien
-Que vient alors faire la librairie ESP8266HTTPClient.h ? (sa présence suggréait une confusion entre les deux modes d'utilisation d'un ESP8266)
-Pourquoi un SofwareSerial sur une carte possédant plusieurs ports série matériels ?
je les ai supprimé mais en gros cela n'apportait rien de grave au programme , les soucis résident dans les messages d'erreurs qu'il affiche et que j'ai mentionné en haut ![]()
Pourquoi inclure JsonArray.h, JsonHashTable.h, JsonParser.h, JsonObjectBase.h.
En principe, il suffit d'inclure ArduinoJson.h pour avoir toute la librairie.
Pourquoi using namespace ArduinoJson::Parser;
Regarde comment sont construits les programmes de démonstration.
La requête vers openweathermap me semble bizarre.
Bingo, pour la compilation du programme ça a marché, déjà c'est un très grand pas, j'ai fait ce que vous m'avez dit puis j'ai changé le Json buffer en JsonDocument pour le promouvoir en arduino Json 6, cependant le moniteur en série ne m'affiche que la commande AT+RST puis s'arrête,saviez-vous à quoi celà est du ?
Et qu'est-ce qui s'affiche sur dbgSerial?
Est ce que le dbgSerial s'affiche sur un endroit autre que le moniteur en série ? Car en fait je n'ai pas encore bien compris son principe et son rapport avec le débeuguine surtout quand j'ai vu sur un exemple de programme qu'il est déclaré sur pin 2 et 3 alors qu'ils ne sont branché à rien
Tu ne peux pas utiliser le moniteur série. Les lignes Tx et Rx sont utilisées par ton ESP8266.
dbgSerial est une liaison série "software", utilisant la librairie SoftwareSerial). Pour l'utiliser, il faut raccorder les broches 2 et 3 à une interface série<-->USB.
Voilà j'ai raccordé les pins 3 et 2 à un port USB via les fils verts et blanc, mais comment puis je avoir accès à cet affichage ? de plus mon ordinateur reconnaît le périphérique comme étant inconnu, dois je utiliser un pilote ou un truc du genre ?
Bonjour,
Tu ne dois pas relier l'usb sur les pins de l'esp8266. Comme l'a écrit @fdufnews il faut une interface usb-série.
@fdufnews @kamill
Voici le bilan après une semaine, j'ai décidé de choisir un chemin plus simple selon moi que rajouter une interface USB série, j'ai branché le RX et TX de l'esp dans les pins 10 et 11 de l'arduino et je les ai déclaré dans le SoftwareSerial comme ça je peux lire Serial et le dbgSerial au même temps dans le moniteur en série et ça marche, sauf pour la commande Serial.find qui ne marche pas et que j'ai enlevé car de toute façon elle m'étais pas trop utile.
l'esp se connecte au wi-fi cependant et il s'arrête au moment crucial qui est : récupérer les données météorologiques, cela provient certainement des requêtes vers mon API, et précisément à la fin vers le GET, le moniteur en série affiche un SEND OK, ce qui prouve qu'il a bien reçu la commande contenant ma clé API mais avant d'afficher quoi que ce soit il y'a un CLOSED qui s'affiche systématiquement qlq seconde après le SEND OK et qui met fin à la connexion
Pas très clair tout ça. La modification que tu indiques implique des modifications assez lourdes dans tout le code puisque tu échanges les liens série.
Mets ton code modifié.
Oui effectivement il y'a de grandes modifications
#include <ArduinoJson.h>
#include <SoftwareSerial.h>
#define SSID "HUAWEI-PjGz" // insert your SSID
#define PASS "yF9kUPV2" // insert your password
#define DST_IP "api.openweathermap.org"
SoftwareSerial ESP8266(10,11);
StaticJsonDocument<32> doc;
void setup()
{
Serial.begin(9600);
ESP8266.begin(115200);
initESP8266();
}
void loop()
{
while(ESP8266.available())
{
Serial.println(ESP8266.readString());
}
}
void initESP8266()
{Serial.println("Init");
envoieAuESP8266("AT+RST");
recoitDuESP8266(2000);
envoieAuESP8266("AT+CIPMUX=0");
recoitDuESP8266(2000);// set to single connection mode
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += DST_IP;
cmd += "\",80";
envoieAuESP8266(cmd);
recoitDuESP8266(6000);
Serial.println(cmd);
envoieAuESP8266("AT+CIPSEND=71");
cmd ="GET /data/2.5/weather?q=Tangier&appid=50a7aa80fa492fa92e874d23ad061374";
Serial.println(cmd);
ESP8266.println(cmd);
recoitDuESP8266(30000);
double vent = doc["wind"];
Serial.print ("vit: ") ;
Serial.print ((int) vent) ;
delay(600000);
}
boolean connectWiFi()
{
envoieAuESP8266("AT+CWMODE=1");
recoitDuESP8266(5000);
String cmd = "AT+CWJAP=\"";
cmd += SSID;
cmd += "\",\"";
cmd += PASS;
cmd += "\"";
ESP8266.println(cmd);
Serial.println(cmd);
delay(2000);
if (Serial.find("OK")) {
Serial.println("OK, Connected to WiFi.");
return true;
} else {
Serial.println("Can not connect to the WiFi.");
return false;
}
}
void envoieAuESP8266(String commande)
{
ESP8266.println(commande);
}
void recoitDuESP8266(const int timeout)
{
String reponse = "";
long int time = millis();
while( (time+timeout) > millis())
{
while(ESP8266.available())
{
char c = ESP8266.read();
reponse+=c;
}
}
Serial.print(reponse);
}