utilisation ArduinoOTA.setHostname

Bonjour
j’ai écrit un .ino pour télécharger mes esp8266
j’ai une table avec les adresses mac et une table Lieux
String T_Mac_Addr[NBRE_ESP] = {“84:f3:EB:4B:f1:79”,“18:FE:34:9A:45:3A”,“18:FE:34:9A:4F:ED”,“84:F3:EB:4B:F2:17”};
String T_Lieux[NBRE_ESP] = {“Test”,“Cuisine”,“Cave”,“Exterieur”};
je voudrais paramétrer ArduinoOTA.setHostname avec le résultat de le recherche
int i;
for (i = 0; i < NBRE_ESP; i = i + 1) {

Serial.print ( "Valeur de i: " );
Serial.println ( i );
Serial.print ( "T_Mac_Addr*: " );*
Serial.println ( T_Mac_Addr );
if (T_Mac_Addr = WiFi.macAddress()) {
* Serial.println ( “Trouvé” );*
ID_Temp = T_ID_Temp*;
ID_Hum = T_ID_Hum;
Lieu = T_Lieux;
_ break;
}
}*

et mettre ArduinoOTA.setHostname(Lieu)
comment faire
cordialement
pierre_

corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l’IDE avant de copier le code pour qu’il soit indenté correctement)

——

L’égalité se teste avec ==. Un simple = sert pour affecter une valeur

T_Mac_Addr est un tableau.
Pour manipuler un élément de ce tableau, il fait préciser lequel !
Ca s'écrit :

T_Mac_Addr [ i ]

avec i=0 pour le 1er élément,
i = 1 pour le second... etc

Il a mis l’indice du tableau c’est pour ça que son texte est passé en italique.... c’est le souci, quand on n’utilise pas les balises de code

Bonjour
je m’excuse de ne pas avoir utiliser les code tags

j’ai écrit un .ino pour télécharger mes esp8266
j’ai une table avec les adresses mac et une table Lieux

String T_Mac_Addr[NBRE_ESP] = {"84:f3:EB:4B:f1:79","18:FE:34:9A:45:3A","18:FE:34:9A:4F:ED","84:F3:EB:4B:F2:17"}; 
String T_Lieux[NBRE_ESP] = {"Test","Cuisine","Cave","Exterieur"};

je voudrais paramétrer ArduinoOTA.setHostname avec le résultat de le recherche

  int i;
  for (i = 0; i < NBRE_ESP; i = i + 1) {

    Serial.print ( "Valeur de i: " );
    Serial.println ( i );
    Serial.print ( "T_Mac_Addr[i]: " );
    Serial.println ( T_Mac_Addr[i] );

    if (T_Mac_Addr[i] == WiFi.macAddress()) {
      Serial.println ( "Trouvé" );
      ID_Temp = T_ID_Temp[i];
      ID_Hum = T_ID_Hum[i];
      Lieu = T_Lieux[i];
      break;
    }
  }

  Serial.print ( "ID_Temp: " );
  Serial.println ( ID_Temp );
  Serial.print ( "ID_Hum: " );
  Serial.println ( ID_Hum );
  Serial.print ( "Lieu: " );
  Serial.println ( Lieu );

et donc ? (que voyez vous maintenant avec le ==) ?

Bonjour,
merci de votre aide
cela fonctionne correctement
j'ai bien récupéré les bonnes valeurs Id_Temp, Id_Hum et Lieu
la question est comment écrire

ArduinoOTA.setHostname("myesp8266");

en remplaçant "myesp8266" par le contenu de Lieu
Pierre

comme ce sont des Strings et que la fonction attend une cString il faudrait faire

 ArduinoOTA.setHostname(Lieu.c_str());

mais c’est vraiment du gâchis mémoire de ne pas utiliser directement les cStrings dans vos tableaux en faisant

// Les tableaux
const char* T_Mac_Addr[NBRE_ESP] = {"84:f3:EB:4B:f1:79","18:FE:34:9A:45:3A","18:FE:34:9A:4F:ED","84:F3:EB:4B:F2:17"}; 
const char* T_Lieux[NBRE_ESP] = {"Test","Cuisine","Cave","Exterieur"};
// les variables
char* ID_Temp = NULL;
char* ID_Hum = NULL;
char* Lieu = NULL;

et votre boucle reste quasi identique, on utilise strcmp() au lieu de ==

  for (byte i = 0; i < NBRE_ESP; i++) {
    if (!strcmp(T_Mac_Addr[i], WiFi.macAddress())) {
      ID_Temp = T_ID_Temp[i];
      ID_Hum = T_ID_Hum[i];
      Lieu = T_Lieux[i];
      break;
    }
  }

  // c'est bien de vérifier qu'on a trouvé
  if (Lieu != NULL) {
    Serial.print ( "ID_Temp: " );  Serial.println ( ID_Temp );
    Serial.print ( "ID_Hum: " );  Serial.println ( ID_Hum );
    Serial.print ( "Lieu: " );  Serial.println ( Lieu );
  } else {
    Serial.println ( "Pas Trouvé MAC @" );
  }

Notez qu’en pratique vous pourriez simplement mémoriser le i qui est le bon index, pas la peine d’avoir des variables pour chaque élément)

  byte indexCarte = 255; // 255 veut dire pas trouvé

  for (byte i = 0; i < NBRE_ESP; i++) {
    if (!strcmp(T_Mac_Addr[i], WiFi.macAddress())) {
      indexCarte = i;
      break;
    }
  }

  // c'est bien de vérifier qu'on a trouvé
  if (indexCarte != 255) {
    Serial.print ( "ID_Temp: " );  Serial.println (T_ID_Temp[indexCarte]);
    Serial.print ( "ID_Hum: " );  Serial.println ( T_ID_Hum[indexCarte] );
    Serial.print ( "Lieu: " );  Serial.println ( T_Lieux[indexCarte] );
  } else {
    Serial.println ( "Pas Trouvé MAC @" );
  }

Bonsoir
merci pour vos conseils
l’instruction strcmp compare 2 chaines de caractères
apparemment WiFi.macAddress() serait un string d’où l’erreur à la compilation

Test_Mac:130:49: error: cannot convert ‘String’ to ‘const char*’ for argument ‘2’ to ‘int strcmp(const char*, const char*)’

if (!strcmp(T_Mac_Addr*, WiFi.macAddress())) {*

  • ^*
    j’ai également l’erreur suivante
    Test_Mac:152:46: error: request for member ‘c_str’ in ‘T_Lieux[((int)indexCarte)]’, which is of non-class type ‘const char*’
  • ArduinoOTA.setHostname(T_Lieux[indexCarte].c_str());*
  • ^*
    Avez vous une idée pour solutionner ces 2 problèmes
    Pierre

Utilisez .c_str() seulement sur la classe String, ça permet d’accéder au buffer des caractères (donc un char*)

Quand c’est déjà une variable en char* (ou tableau de char) ce n’est pas utile.

Bonsoir
merci de vos conseils

j’ai effectué les modifs suivantes

byte mac[6];
char mac_addr[17];

  WiFi.macAddress(mac);
  sprintf(mac_addr, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5])

  for (byte i = 0; i < NBRE_ESP; i++) {
    if (strcmp(T_Mac_Addr[i], mac_addr)) {
      indexCarte = i;
      break;
    }
  }

  ArduinoOTA.setHostname(T_Lieux[indexCarte]);

[color=blue][/color]

tout fonctionne correctement
un grand merci

je viens de faire un update d’arduino 1.8.9 vers arduino 1.8.13
les Serial.println et Serial.print ne s’affiche plus dans le moniteur série
ce problème n’existait pas dans arduino 1.8.9
quid ???
Pierre

Tu as vérifié le baud-rate (9600 ... 115000 ) ?
Il doit être le même dans ton Serial.begin() et dans le menu du moniteur.

Bonsoir
j'ai bien la valeur 115200 dans mon Serial.begin() et dans le menu du moniteur.
Pierre

Bonjour
j'ai téléchargé à nouveau arduino 1.8.13
les serial.print et serial.println fonctionne correctement
je ne sais pas si il faut ouvrir un autre sujet pour ce qui suit
à l'aide d'un FDTI connecté sur un port USB je télécharge mon projet, pas de problème
je retrouve bien dans Outils/Ports mon ESP avec son adresse IP
si veut à nouveau télécharger sur le port réseau, après compilation il me donne ce message d'erreur
No Answer
Avez vous une idée
Pierre

sultan87:
je retrouve bien dans Outils/Ports mon ESP avec son adresse IP
si veut à nouveau télécharger sur le port réseau, après compilation il me donne ce message d’erreur
No Answer
Avez vous une idée

codeinfo.png
ma boule de cristal ne me permet pas de voir votre code (avec les balises). Sans doute un bug ligne 42 ou alors le fil rouge est mal branché… qui sait…

Bonsoir
voici mon code

[code]#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoOTA.h>
#include "DHT.h"

//**********************//
// interaction Jeedom
#define JEEDOM true                   // Activation interaction avec Jeedom ( veuillez renseigner tous les champs , avant de l'activer : true)
String ApiKey   = "xyz"; // cle API Jeedom xyz
String IPJeedom = "aaa.bbb.ccc.ddd";
String PortJeedom = "80";

HTTPClient http;

//base URL jeedom Virtuel
String BaseUrlJeedom ="http://"+IPJeedom+":"+PortJeedom+"/core/api/jeeApi.php?apikey=" + ApiKey + "&type=virtual&id=";

#define DHTTYPE DHT22   // DHT 22

const int DHTPin = 2;
DHT dht(DHTPin, DHTTYPE);

// Temporary variables
char celsiusTemp[6];
char humidityTemp[6];

boolean temp_ok;

// WiFi
char ssid[] = "ABCDE"; // SSID NAME
char pass[] = "xxxxxxxxxxxxxxx"; // SSID PASSWORD

//byte mac[6];
//char mac_addr[17];
//IPAddress ip;
//char ip_addr[20];

String Addr;

// Nos ESP8266-01

#define NBRE_ESP 4

const char* T_Mac_Addr[NBRE_ESP] = {"84:f3:EB:4B:f1:79","18:FE:34:9A:45:3A","18:FE:34:9A:4F:ED","84:f3:eb:4b:f2:17"}; 
const char* T_Lieux[NBRE_ESP] = {"Test","Cuisine","Cave","Exterieur"};
const char* T_ID_Temp[NBRE_ESP] = {"1675","1554","378","386",};
const char* T_ID_Hum[NBRE_ESP] = {"1676","1555","1556","1557"};
String E_T_Mac_Addr;

char* ID_Temp = NULL;
char* ID_Hum = NULL;
char* Lieu = NULL;

byte indexCarte = 255; // 255 veut dire pas trouvé

WiFiClient client;

void setup() {

  Serial.begin(115200);
  while (!Serial);

  delay(5000);

  Serial.println ( "Début" );

  dht.begin();
    
  delay(10000);

  WiFi.begin(ssid, pass);

  while ( WiFi.status() != WL_CONNECTED )  {
    delay ( 500 );
    Serial.print ( "." );
  }
  Serial.println ( "" );
  Serial.print ( "Connected to " );
  Serial.println ( ssid );
  Serial.print ( "IP address: " );
  Serial.println ( WiFi.localIP() );
  Serial.print ( "MAC address: " );
  Serial.println ( WiFi.macAddress() );
  Serial.println ( "" );
  
//  WiFi.macAddress(mac);
//  sprintf(mac_addr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);

//  Serial.print ( "mac_addr : " );
//  Serial.println ( mac_addr );
//  Serial.println ( "" );
  
//  IPAddress ip = WiFi.localIP();
//  WiFi.localIP(ip);
//  ip = WiFi.localIP();
//  sprintf(ip_addr, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);

// Détermination ID_Temp et ID_Hum et Lieu en fonction de la Mac_Addr

  Serial.print ( "NBRE_ESP : " );
  Serial.println ( NBRE_ESP );

  for (byte i = 0; i < NBRE_ESP; i++) {
    E_T_Mac_Addr = T_Mac_Addr[i];
    E_T_Mac_Addr.toUpperCase();
//    Serial.println (E_T_Mac_Addr);
//    if (strcmp(T_Mac_Addr[i], mac_addr)==0) {
    if (E_T_Mac_Addr ==  WiFi.macAddress()) {
      indexCarte = i;
      break;
    }
  }

  // c'est bien de vérifier qu'on a trouvé
  if (indexCarte != 255) {
    Serial.print ( "ID_Temp: " );  Serial.println (T_ID_Temp[indexCarte]);
    Serial.print ( "ID_Hum: " );  Serial.println ( T_ID_Hum[indexCarte] );
    Serial.print ( "Lieu: " );  Serial.println ( T_Lieux[indexCarte] );
  } else {
    Serial.println ( "Pas Trouvé MAC @" );
  }

//******* OTA ***************

  // Port defaults to 8266
  // ArduinoOTA.setPort(8266);

  // Hostname defaults to esp8266-[ChipID]
  // ArduinoOTA.setHostname("Extérieur");
  ArduinoOTA.setHostname(T_Lieux[indexCarte]);
  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_FS
      type = "filesystem";

    }

    // NOTE: if updating FS this would be the place to unmount FS using FS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {

  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) {
      Serial.println("Auth Failed");
    } else if (error == OTA_BEGIN_ERROR) {
      Serial.println("Begin Failed");
    } else if (error == OTA_CONNECT_ERROR) {
      Serial.println("Connect Failed");
    } else if (error == OTA_RECEIVE_ERROR) {
      Serial.println("Receive Failed");
    } else if (error == OTA_END_ERROR) {
      Serial.println("End Failed");
    }
  });
  ArduinoOTA.begin();

//********* Fin OTA ***************

}

void saveTempData() {

    temp_ok = true;

    delay(2000);

    // Read Humidity
    float h = dht.readHumidity();
    if (isnan(h)) {
      h = 11.11;  
      temp_ok = false;    
    }
    dtostrf(h, 5, 2, humidityTemp);   
     
    // Read temperature as Celsius (the default)
    float t = dht.readTemperature();
    if (isnan(t)) {
      t = 22.22;   
      temp_ok = false;   
    }
    dtostrf(t, 5, 2, celsiusTemp);  

//    if (isnan(h) || isnan(t)) {

    if (celsiusTemp == "-127.00") {
      temp_ok = false;
    }
}

// Fonction envoie requete vers Jeedom
void sendToJeedom(String url , String id , String valeur){

//    Serial.println ( "Dans sendToJeedom" );
//    Serial.print ( "ID: " );
//    Serial.println ( id );
//    Serial.print ( "Valeur: " );
//    Serial.println ( valeur );
    
  if (JEEDOM) {
        url +=id;
        url +="&value="+valeur;
        Serial.print ( "URL: " );
        Serial.println ( url );
        http.begin(url);
        int httpCode = http.GET();
        http.end();
  }
}

void loop() {

  ArduinoOTA.handle();

  if (WiFi.status() != WL_CONNECTED) {  
     Serial.println("...WIFI LOST...");  
     delay(1000);  
     //-- On reboot  
     ESP.reset();  
  } 

  saveTempData();

//  sendToJeedom(BaseUrlJeedom , ID_Temp , celsiusTemp);
//  sendToJeedom(BaseUrlJeedom , ID_Hum , humidityTemp);

  sendToJeedom(BaseUrlJeedom , T_ID_Temp[indexCarte] , celsiusTemp);
  sendToJeedom(BaseUrlJeedom , T_ID_Hum[indexCarte] , humidityTemp);

  delay(300000);      // 60000 = 1mn 300000 = 5mn
      
}

Pierre[/code]

Comme vous avez cette partie du code

  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) {
      Serial.println("Auth Failed");
    } else if (error == OTA_BEGIN_ERROR) {
      Serial.println("Begin Failed");
    } else if (error == OTA_CONNECT_ERROR) {
      Serial.println("Connect Failed");
    } else if (error == OTA_RECEIVE_ERROR) {
      Serial.println("Receive Failed");
    } else if (error == OTA_END_ERROR) {
      Serial.println("End Failed");
    }
  });

si vous connectez un câble série sur votre ESP et ouvrez un terminal série genre puTTY (pas la console arduino, ça refusera) à 115200 bauds et essayez la màj OTA, vous devriez voir des infos défiler

Bonjour
j'ai essayé le croquis BasicOTA je le téléverse avec COM3 et après je fais à nouveau un téléverse avec l'adresse IP
pas de problème tout fonctionne correctement
je pense que dans mon croquis il y a une interférence
Laquelle ??
pouvez vous faire l'essai avec mon code
merci d'avance
Pierre

je n'ai pas votre environnement. Avez vous essayé en connectant un autre Terminal sur le port série ? que voyez vous ?

Bonjour
j'ai téléversé mon croquis à partir du COM3
j'ai maintenant dans Outils/Ports mon esp avec son adresse IP
j'ai lancé PuTTY et j'ai essayé de téléverser sur l'adresse IP
dans Arduino j'ai le message d'erreur No Answer
dans PuTTY ci-joint la réponse
Pierre

PuTTY.PNG

PuTTY.PNG