Convertir un String en uint16_t

Salut a tous,

Je continu sur mon projet de contrôle de clim et de radiateur. J’ai un soucis dans mon code : je récupère une requette http sous la forme d’un string qui contient le pin a controlé et son état qui peut être un int ou un uint16_t.

J’aimerai savoir comment faire pour récupérer cette valeur et la donner en argument à une fonction. J’ai trouvé comment convertir un string en Int. Est la meilleur solution ?

Je ne trouve pas comment convertir mon string en uint16_t. Une idée ?

J’ai mis mon code en PJ. Je sais qu’il est faux n’hésitez pas (c’est pour ça que j’ai besoin d’aide).

#include <ESP8266WiFi.h>
#include <IRsend.h>
#include <string.h>

#define ssid      "*******"      // WiFi SSID
#define password  "**************" 
WiFiServer server(80);

int IR_LED = D1; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
IRsend irsend(IR_LED);
int hz = 38000; //NB Change this default value as neccessary to the correct modulation frequency

uint16_t OFF[] = {};
uint16_t COOL[] = {};

uint16_t WARM_low[] = {};

 uint16_t WARM_high[]{};

int ledPin = D4; 

void setup() {
  Serial.begin(115200);
  
  WiFi.begin(ssid, password);  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP()); 

  server.begin();
  Serial.println("Serveur demarrer !");

  // initialisation de la sortie pour la led 
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
   
}

void loop() {
  WiFiClient client;
  client = server.available();
  if (!client)
  {
    return;
  }
 
  // Attendre si le client envoie des données ...
  Serial.println("nouveau client");
  while(!client.available()){
    delay(1);
  }
 
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

//  int value = LOW;
//  if (request.indexOf("/LED_ON") != -1)  {
//    digitalWrite(ledPin, HIGH); // allumer la led
//    value = HIGH;
//  }
//  if (request.indexOf("/LED_OFF") != -1)  {
//    digitalWrite(ledPin, LOW); // éteindre la led
//    value = LOW;
//  }
  
  if (request.indexOf("/LED_") !=-1){
    int posLED = request.indexOf("/LED_");
    String reqVal;
    reqVal = (request.substring(posLED+5));
    int ledState = reqVal.toInt();
    //ChangeLedState (ledPin, ledState);    
    }
    
  if (request.indexOf("/IR_") !=-1){
    int posIR = request.indexOf("/IR_");
    String reqVal;
    reqVal = (request.substring(posIR+4));
    int ledState = reqVal.toInt();
    //ChangeLedState (irsend, ledState);
    }
    
 
  // Réponse
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); 
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
 
  client.print("Etat de la led : ");
 
/*  if(value == HIGH) {
    client.print("On");
  } else {
    client.print("Off");
  }*/
  client.println("

");
  client.println("<a href=\"LED_HIGH\"\"><button>Allumer </button></a>");
  client.println("<a href=\"LED_LOW\"\"><button>Eteindre </button></a>
");
  
  client.println("<a href=\"/IR_OFF\"\"><button>Clim_OFF </button></a>");
  client.println("<a href=\"/IR_COOL\"\"><button>Clim_Cool </button></a>
");
  client.println("<a href=\"/IR_WARM_LOW\"\"><button>Clim_Warm_low </button></a>");
  client.println("<a href=\"/IR_WARM_High\"\"><button>Clim_Warm_low </button></a>
");  
  client.println("</html>");
 
  delay(1);
  Serial.println("Client deconnecter");
  Serial.println("");
 
}

void ChangeLedState (int ledPin, int ledState){
   digitalWrite(ledPin, ledState); // allumer la led
}

void ChangeLedState (IRsend irsend, int ledState){
    irsend.sendRaw(ledState, sizeof(ledState) / sizeof(int), hz);
}

Bonsoir

lis bien les messages épinglés en tête de forum, en particulier celui là pour éditer ton message

tu y verras comment poster le code proprement dans le corps du message et ainsi donner de la visibilité au message. Il faut penser aux intervenants de plus en plus nombreux utilisant un smartphone ( un fichier joint .ino n’est pas toujours exploitable !!)

al1fch: Bonsoir

lis bien les messages épinglés en tête de forum, en particulier celui là pour éditer ton message https://forum.arduino.cc/index.php?topic=394754.0

tu y verras comment poster le code proprement dans le corps du message et ainsi donner de la visibilité au message. Il faut penser aux intervenants de plus en plus nombreux utilisant un smartphone ( un fichier joint .ino n'est pas toujours exploitable !!)

C'est fait. Désolé pour le post un peu rapide

1: Tu ne devrais pas mettre ton SSID et ton password en clair dans le code posté sur un forum. Édite le code et remplace par des ****

2: Lorsque tu utilises substring avec un seul argument, il te renvoie la portion de String à partir de cet endroit jusqu'à la fin. Si cette portion contient des caractères non numériques, peut-être que le toInt a du mal à la convertir. Tu devrais afficher sur la console le contenu du résultat du substring pour voir si c'est bien ce que tu attends.

lesept: 1: Tu ne devrais pas mettre ton SSID et ton password en clair dans le code posté sur un forum. Édite le code et remplace par des ****

2: Lorsque tu utilises substring avec un seul argument, il te renvoie la portion de String à partir de cet endroit jusqu'à la fin. Si cette portion contient des caractères non numériques, peut-être que le toInt a du mal à la convertir. Tu devrais afficher sur la console le contenu du résultat du substring pour voir si c'est bien ce que tu attends.

Après mes nombreuse boulettes, on va pouvoir avancer...

2 : oui c'est voulu, enfin pour le moment. Je récupère bien le chant qui m'intéresse et à le stocker dans une variable string. Comment puis je faire pour faire en sorte que ce string soit interprété comme le nom d'une variable ? Est ce que tu aurais une idée de comment rechercher des chaines comprises entre des caractères spéciaux ?

skarab2201:
Comment puis je faire pour faire en sorte que ce string soit interprété comme le nom d’une variable ?
Est ce que tu aurais une idée de comment rechercher des chaines comprises entre des caractères spéciaux ?

Tu veux dire que le contenu de la String est en fait le nom d’une variable dont tu veux ensuite utiliser la valeur ?
Mauvaise nouvelle : c’est impossible (sauf erreur de ma part).

Par contre, si tu sais que ce nom de variable peut prendre un certain nombre de valeurs, du genre ‘variable1’, ‘variable2’, ‘variable3’, ‘variable4’, tu peux tester avec un if et agir selon le résultat :

if (maString == "variable1") valeur = variable1;
else if (maString == "variable2") valeur = variable2;
else if (maString == "variable3") valeur = variable3;
else if (maString == "variable4") valeur = variable4;

Ceci dit, il existe peut-être une solution magique avec des pointeurs… mais je ne vois rien comme ça.

Faire un tableau avec une structure contenant un champ "nom" et un champ "valeur".

lesept: Par contre, si tu sais que ce nom de variable peut prendre un certain nombre de valeurs, du genre 'variable1', 'variable2', 'variable3', 'variable4', tu peux tester avec un if et agir selon le résultat :

if (maString == "variable1") valeur = variable1;
else if (maString == "variable2") valeur = variable2;
else if (maString == "variable3") valeur = variable3;
else if (maString == "variable4") valeur = variable4;

Ceci dit, il existe peut-être une solution magique avec des pointeurs... mais je ne vois rien comme ça.

C'est ce que j'ai fait. Tant que je n'ai pas trop de valeurs ça marche pas mal.

fdufnews: Faire un tableau avec une structure contenant un champ "nom" et un champ "valeur".

Tu peux m'en dire plus ? Je vois comment faire une structure, par contre je ne vois pas dans quelle mesure m'en servir. Désolé, je débute en C++. J'ai quelques reste de l'école mais très light.

Est ce que vous auriez une idée pour modifier plusieurs pin dans la même requête ?

Pour les pins tu peux utiliser un tableau.
Exemple

byte pins[4] = {10,11,12,13};
for (byte i=0; i<4; i++) pinMode (pins[i], OUTPUT) ;

Tu peux passer les numéros des indices des pins dans ton tableau via la requête et jouer avec ensuite.