[ESP8266] Problème compilation

Bonjour c’est encore moi.

J’essaye de faire communiquer mon esp8266 avec constellation afin d’envoyer la température et l’humidité. (D’ailleurs sebastien tu utilises gadgeteer pour ça ?)

J’ai donc installé les fichiers de Constellation dans mon dossier librairie mais quand j’utilise ce code :

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <Constellation.h>

WiFiClient wifiClient;
Constellation constellation(wifiClient, "x.x.x.x", 123, "MyVirtualSentinel", "MyVirtualPackage", "MyAccessKey");

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

  // Connect to Wifi  
  WiFi.begin("MY-SSID", "MY-WIFI_KEY");  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected. IP: ");
  Serial.println(WiFi.localIP());

  constellation.writeInfo("ESP8266 on Constellation !!"); 
}

J’ai le droit à ce message d’erreur :

C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp: In member function 'boolean Constellation::checkIncomingMessage(int, int)':
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:99:53: error: no matching function for call to 'ArduinoJson::StaticJsonBuffer<2048u>::parseArray(String&)'
    JsonArray& array = jsonBuffer.parseArray(response);
                                                     ^
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:99:53: note: candidate is:
In file included from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/DynamicJsonBuffer.hpp:9:0,
                 from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/ArduinoJson.h:7,
                 from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/ArduinoJson.h:11,
                 from C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.h:34,
                 from C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:24:
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/JsonBuffer.hpp:56:14: note: ArduinoJson::JsonArray& ArduinoJson::JsonBuffer::parseArray(char*, uint8_t)
   JsonArray &parseArray(char *json, uint8_t nestingLimit = DEFAULT_LIMIT);
              ^
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/JsonBuffer.hpp:56:14: note:   no known conversion for argument 1 from 'String' to 'char*'
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp: In member function 'boolean Constellation::checkStateObjectUpdate(int, int)':
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:128:53: error: no matching function for call to 'ArduinoJson::StaticJsonBuffer<2048u>::parseArray(String&)'
    JsonArray& array = jsonBuffer.parseArray(response);
                                                     ^
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:128:53: note: candidate is:
In file included from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/DynamicJsonBuffer.hpp:9:0,
                 from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/ArduinoJson.h:7,
                 from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/ArduinoJson.h:11,
                 from C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.h:34,
                 from C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:24:
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/JsonBuffer.hpp:56:14: note: ArduinoJson::JsonArray& ArduinoJson::JsonBuffer::parseArray(char*, uint8_t)
   JsonArray &parseArray(char *json, uint8_t nestingLimit = DEFAULT_LIMIT);
              ^
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/JsonBuffer.hpp:56:14: note:   no known conversion for argument 1 from 'String' to 'char*'
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp: In member function 'ArduinoJson::JsonArray& Constellation::requestStateObjects(const char*, const char*, const char*, const char*)':
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:201:50: error: no matching function for call to 'ArduinoJson::StaticJsonBuffer<2048u>::parseArray(String&)'
   JsonArray& obj = jsonBuffer.parseArray(response);
                                                  ^
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:201:50: note: candidate is:
In file included from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/DynamicJsonBuffer.hpp:9:0,
                 from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/ArduinoJson.h:7,
                 from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/ArduinoJson.h:11,
                 from C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.h:34,
                 from C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:24:
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/JsonBuffer.hpp:56:14: note: ArduinoJson::JsonArray& ArduinoJson::JsonBuffer::parseArray(char*, uint8_t)
   JsonArray &parseArray(char *json, uint8_t nestingLimit = DEFAULT_LIMIT);
              ^
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/JsonBuffer.hpp:56:14: note:   no known conversion for argument 1 from 'String' to 'char*'
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp: In member function 'ArduinoJson::JsonObject& Constellation::getSettings()':
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:216:52: error: no matching function for call to 'ArduinoJson::StaticJsonBuffer<2048u>::parseObject(String&)'
   JsonObject& obj = jsonBuffer.parseObject(response);
                                                    ^
C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:216:52: note: candidate is:
In file included from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/DynamicJsonBuffer.hpp:9:0,
                 from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/ArduinoJson.h:7,
                 from C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/ArduinoJson.h:11,
                 from C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.h:34,
                 from C:\Users\e.laville\Documents\Arduino\libraries\Constellation\Constellation.cpp:24:
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/JsonBuffer.hpp:68:15: note: ArduinoJson::JsonObject& ArduinoJson::JsonBuffer::parseObject(char*, uint8_t)
   JsonObject &parseObject(char *json, uint8_t nestingLimit = DEFAULT_LIMIT);
               ^
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson/include/../include/ArduinoJson/JsonBuffer.hpp:68:15: note:   no known conversion for argument 1 from 'String' to 'char*'
Error compiling.

J’ai essayé de modifier comme j’ai pu trouvé sur internet mais soit j’ai ce message soit il me dit que WiFiClient n’est pas défini.

Une petite idée ?

Merci :slight_smile:

Hum étonnant, chez moi ca compile sur plusieurs postes avec l’IDE 1.6.4, 1.6.5 et 1.6.7 !

Tu peux me dire les versions que tu utilises pour :

  • L’IDE Arduino ?
  • La board ESP8266 (dans le Board Manager)
  • La version de la lib ArduinoJson!

Pour moi c’est testé avec les IDE 1.6.x, la board ESP8266 1.6.5 et 2.0-rc1 et la lib ArduinoJson 5.0.2 et +

Vu l’erreur, je dirais que ta lib ArduinoJson est obsolete !

A+

Alors j’ai arduino version 1.6.5, esp8266 2.0.0 rc1 et Arduinojson 5.0.7 (je viens de la retélécharger).

J’ai une nouvelle erreur qui apparaît dès que j’ajoute Arduinojson :


C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson\src\DynamicJsonBuffer.cpp:12:3: error: 'DynamicJsonBufferBlock' does not name a type
   DynamicJsonBufferBlock* next;
   ^
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson\src\DynamicJsonBuffer.cpp:27:1: error: specializing member 'ArduinoJson::Internals::BlockJsonBuffer<ArduinoJson::Internals::DefaultAllocator>::DynamicJsonBuffer' requires 'template<>' syntax
 DynamicJsonBuffer::DynamicJsonBuffer() {
 ^
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson\src\DynamicJsonBuffer.cpp:31:1: error: specializing member 'ArduinoJson::Internals::BlockJsonBuffer<ArduinoJson::Internals::DefaultAllocator>::~ ArduinoJson::Internals::DynamicJsonBuffer<ArduinoJson::Internals::DefaultAllocator>' requires 'template<>' syntax
 DynamicJsonBuffer::~DynamicJsonBuffer() {
 ^
Error compiling.

Tu as bien sélectionné “Generic ESP8266 Module” dans les types de carte pour définir la plateforme cible ?

Essayes de compiler un sketch vide juste avec l’include de’ ArduinoJson :

#include <ArduinoJson.h>
void setup() {
  // put your setup code here, to run once:
}
void loop() {
  // put your main code here, to run repeatedly:
}

Si toujours erreur, c’est qu’il y a un loup sur la compilation de cette lib ! Je tenterai de tout nettoyer et recommencer car la je ne vois pas bien pourquoi ca compile pas !

Oui j’ai bien sélectionné “Generic ESP8266 Module”.

Avec juste ton bout de code dans un nouveau sketch j’ai :


C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson\src\DynamicJsonBuffer.cpp:12:3: error: 'DynamicJsonBufferBlock' does not name a type
   DynamicJsonBufferBlock* next;
   ^
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson\src\DynamicJsonBuffer.cpp:27:1: error: specializing member 'ArduinoJson::Internals::BlockJsonBuffer<ArduinoJson::Internals::DefaultAllocator>::DynamicJsonBuffer' requires 'template<>' syntax
 DynamicJsonBuffer::DynamicJsonBuffer() {
 ^
C:\Users\e.laville\Documents\Arduino\libraries\ArduinoJson\src\DynamicJsonBuffer.cpp:31:1: error: specializing member 'ArduinoJson::Internals::BlockJsonBuffer<ArduinoJson::Internals::DefaultAllocator>::~ ArduinoJson::Internals::DynamicJsonBuffer<ArduinoJson::Internals::DefaultAllocator>' requires 'template<>' syntax
 DynamicJsonBuffer::~DynamicJsonBuffer() {
 ^
Error compiling.

Oui donc visiblement il n’arrive pas à compiler la lib ArduinoJson!

Je serai toi, je supprimerai tout le dossier “C:\Users\e.laville\Documents\Arduino” et désinstallerai l’IDE arduino + reboot (pour être sur de vider les reps temporaires) avant de tout re-installer :

1- setup.exe de l’IDE Arduino 1.6.7
2- ajouter la référence de l’ESP dans les prefs + installation d’Arduino-esp8266 dans le Board Manager
3- installer la lib ArduinoJson 5.0.7 dans le Library Manager
4- refaire le test d’un sketch vide en incluant seulement l’include ArduinoJson.h en compilation pour un Generic ESP8266

En espérant que ca marche !

Bon j’ai tous réinstallé et ça fonctionne. Peut-être un problème de compatibilité entre les dernières versions des librairies et la version 1.6.5.

Par contre j’ai une erreur quand je veux passer une variable à constellation.

Si je mets constellation.writeError(“test”); ça fonctionne bien, par contre avec :

void loop(void) {
    
  delay(5000);
  
  float t = dht.readTemperature();
  
  constellation.writeError(t); 
  Serial.print(t);
}

J’ai cette erreur :

C:\Users\e.laville\Documents\Arduino\sketch_jan06b\sketch_jan06b.ino: In function 'void loop()':

sketch_jan06b:37: error: no matching function for call to 'Constellation::writeError(float&)'

   constellation.writeError(t); 

                             ^

C:\Users\e.laville\Documents\Arduino\sketch_jan06b\sketch_jan06b.ino:37:29: note: candidate is:

In file included from C:\Users\e.laville\Documents\Arduino\sketch_jan06b\sketch_jan06b.ino:3:0:

C:\Users\e.laville\Documents\Arduino\libraries\Constellation/Constellation.h:120:13: note: boolean Constellation::writeError(const char*, ...)

     boolean writeError(const char* text, ...);

             ^

C:\Users\e.laville\Documents\Arduino\libraries\Constellation/Constellation.h:120:13: note:   no known conversion for argument 1 from 'float' to 'const char*'

exit status 1
no matching function for call to 'Constellation::writeError(float&)'

J’ai essayé de remplacer float par int, char ou string ou même convertir le float en string mais toujours le même problème.

La magie du C/C++ :slight_smile:

Les méthodes writeInfo/Warn/Error n’acceptent qu’un “const char *” mais j’ai ajouté de quoi faire des “format” à la manière des xxxprintf!

Donc deux possibilités :

  • Tu converties des variables en “const char *” toi même
  • Tu utilises le formatage des writeXXXX

Par exemple :
constellation.writeError("%d", maVariable);

Ou avec un texte :

constellation.writeError("Ma variable = %d", maVariable);

L’avantage c’est qu’on peut mettre plusieurs variables :

constellation.writeError("Ma variable = %d, la 2 = %d et la 3 = %d", maVariable1, maVariable2, maVariable3);

La lib Constellation contient aussi une méthode “stringFormat”, utile par exemple pour faire un push d’un SO sans devoir construire d’un objet JSON, par exemple :

constellation.pushStateObject("Lux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir);

C’est pareil pour le contenu d’un message que tu envoie (SendMessage).

A noter que les méthodes writeInfo/Warn/Error font un Serial.println de ton log avant de l’envoyer à Constellation, donc ta dernière ligne n’est pas nécessaire.

Pour la référence : http://www.cplusplus.com/reference/cstdio/printf/
Nottament : %d pour les chiffres, %s string, %h pour l’hexa

En principe toi tu devrais faire un %f ! Par contre je lis çà : http://stackoverflow.com/questions/27651012/arduino-sprintf-float-not-formatting !

Je n’ai pas testé dis nous si le %f fonctionne ou si tu dois faire un “dtostrf” avant !

Bien à toi

Alors effectivement %f ne fonctionne pas. Merci pour toutes ces explications c’est top !

Du coup voila mon code final :

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <Constellation.h>
#include <DHT.h>
#define DHTTYPE DHT22
#define DHTPIN  2

WiFiClient wifiClient;
Constellation constellation(wifiClient, "ip_constellation", port_constellation, "MyVirtualSentinel", "MyVirtualPackage", "erwannlaville");

DHT dht(DHTPIN, DHTTYPE);

void setup(void) {
  Serial.begin(9600);
    dht.begin();  
    
  // Connect to Wifi  
  WiFi.begin("ssid", "password");  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected. IP: ");
  Serial.println(WiFi.localIP());

  constellation.writeInfo("ESP8266 on Constellation !!"); 
  
}

void loop(void) {
    
  delay(10000);
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  char str_temp[6];
  char str_humi[6];
  dtostrf(t, 4, 2, str_temp);
  dtostrf(h, 4, 2, str_humi);
  constellation.writeInfo("Data received from ESP8266");
  constellation.pushStateObject("Temperature", str_temp);
  constellation.pushStateObject("Humidity", str_humi);
  
}

Encore plusieurs trucs à améliorer mais c’est déjà super pour faire joujou avec constellation.

Edit : Petite question, comment on supprime des State Object pour des packages qui n’existent plus ?