Problème conversion char*

Salut, Je suis un peu au tout début avec l'esp8266 et j'ai un problème. Avec adafruit io j'arrive bien à récupérer les valeurs de mes "toggle" mais pour pouvoir régler les couleurs de la bande led il faut que je les convertisse en int si j'ai bien compris. Mais le problème c'est qu'en faisant ce que j'ai fait ça me renvoie 0 ... J'ai beau chercher je ne comprends pas vraiment ce qui est dit ... J'utilise la fonction "atoi" mais apparemment c'est pas vraiment adapté ... Si quelqu'un sait je veux bien un peu d'aide svp. Mon code peut surement être optimisé mais je préfère faire moins rapide mais que je comprenne vraiment ce que je fais.

#define FASTLED_ESP8266_NODEMCU_PIN_ORDER
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include <FastLED.h>

const char *ssid     = "WIFI";
const char *password = "MOT DE PASSE";

uint16_t sliderval;
char *rouge;
char *vert;
char *bleu;
int BLEU;
int VERT;
int ROUGE;

// variables et constantes pour les LEDs
#define NUM_LEDS 60        // nb de LED sur le bandeau
#define LED_PIN 2          // PIN de connexion
CRGB leds[NUM_LEDS];

/************************* Adafruit.io Setup *********************************/
#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "IDENTIFIANT"
#define AIO_KEY         "CLé ADAFRUIT"

//Wifi
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

/****************************** Les outils************************************/
Adafruit_MQTT_Subscribe intensite = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/intensite");
Adafruit_MQTT_Subscribe rougeada = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/rouge");
Adafruit_MQTT_Subscribe vertada = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/vert");
Adafruit_MQTT_Subscribe bleuada = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/bleu");
Adafruit_MQTT_Subscribe Bool1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME"/feeds/allumer");

void MQTT_connect() {
  int8_t ret;
  if (mqtt.connected()) {
    return;
  }
  Serial.print("Connecting to MQTT... ");
  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       mqtt.disconnect();
       delay(5000);  // wait 5 seconds
  }
  Serial.println("MQTT Connected!");
}

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

  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }
  Serial.println("Wifi connecté");
  
  mqtt.subscribe(&intensite);
  mqtt.subscribe(&rougeada);
  mqtt.subscribe(&vertada);
  mqtt.subscribe(&bleuada);
  mqtt.subscribe(&Bool1);

  
  Serial.begin(9600);
  FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS);
  }


void loop() {
  MQTT_connect();

  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(1000))) {
    if (subscription == &intensite) {
      Serial.print("Intensité : ");
      sliderval = atoi((char *)intensite.lastread); 
      Serial.println(sliderval);
      FastLED.setBrightness(map(sliderval,0,100,0,255));
      FastLED.show();
    }
    if (subscription == &rougeada) {
      Serial.print("Rouge : ");
      rouge=(char *)rougeada.lastread;
      Serial.println(rouge);
      int ROUGE = atoi(rouge);
      }

    if (subscription == &vertada) {
      Serial.print("Vert : ");
      vert=(char *)vertada.lastread;
      Serial.println(vert);
      int VERT = atoi(vert);
      }
    if (subscription == &bleuada) {
      Serial.print("Bleu : ");
      bleu=(char *)bleuada.lastread;
      Serial.println(bleu);
      int BLEU = atoi(bleu);
    }
    Serial.println(ROUGE);
    for(int dot = 0; dot < NUM_LEDS; dot++) { 
            leds[dot] = CRGB(ROUGE,VERT,BLEU);
            FastLED.show();}
      
    if (subscription == &Bool1) {
      Serial.print("Lumière : ");
      Serial.println((char *)Bool1.lastread);
      int Bool1_State = atoi((char *)Bool1.lastread);
      if (Bool1_State == 1){
        Serial.println("ON");}
      else {
        Serial.println("OFF");
      }
    
        }}
   
  mqtt.ping();
  delay(100);
}

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

je ne connais pas cette bibliothèque, quel est le type retourné par intensite.lastread?

si ce n'est pas un char * mais une String par exemple, atoi() ne va pas marcher

sinon attention à la portée et redéfinition des variables. par exemple ici votre variable rouge n'est que locale au if, une fois sorti du if elle disparait

si vous voulez modifier la variable globale il ne faut pas la Re-définir

    if (subscription == &rougeada) {
      Serial.print("Rouge : ");
      rouge=(char *)rougeada.lastread;
      Serial.println(rouge);
      ROUGE = atoi(rouge); // <==== là on modifie bien la variable globale
      }

Merci, au final un prof m'a répondu très rapidement et j'ai pu finir

#define FASTLED_ESP8266_NODEMCU_PIN_ORDER
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include <FastLED.h>

const char *ssid     = "WIFI";
const char *password = "MDP";

uint16_t sliderval;
char *rouge;
char *vert;
char *bleu;
int BLEU;
int VERT;
int ROUGE;

// variables et constantes pour les LEDs
#define NUM_LEDS 60        // nb de LED sur le bandeau
#define LED_PIN 2          // PIN de connexion
CRGB leds[NUM_LEDS];

/************************* Adafruit.io Setup *********************************/
#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "ID"
#define AIO_KEY         "CLE ADAFRUIT"

//Wifi
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

/****************************** Les outils************************************/
Adafruit_MQTT_Subscribe intensite = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/intensite");
Adafruit_MQTT_Subscribe rougeada = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/rouge");
Adafruit_MQTT_Subscribe vertada = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/vert");
Adafruit_MQTT_Subscribe bleuada = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/bleu");
Adafruit_MQTT_Subscribe Bool1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME"/feeds/allumer");

void MQTT_connect() {
  int8_t ret;
  if (mqtt.connected()) {
    return;
  }
  Serial.print("Connecting to MQTT... ");
  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       mqtt.disconnect();
       delay(5000);  // wait 5 seconds
  }
  Serial.println("MQTT Connected!");
}

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

  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }
  Serial.println("Wifi connecté");
  
  mqtt.subscribe(&intensite);
  mqtt.subscribe(&rougeada);
  mqtt.subscribe(&vertada);
  mqtt.subscribe(&bleuada);
  mqtt.subscribe(&Bool1);

  
  Serial.begin(9600);
  FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS);
  }


void loop() {
  MQTT_connect();

  Adafruit_MQTT_Subscribe *subscription;
  
  while ((subscription = mqtt.readSubscription(1000))) {
  
    if (subscription == &intensite) {
      Serial.print("Intensité : ");
      sliderval = atoi((char *)intensite.lastread); 
      Serial.println(sliderval);
    }
    if (subscription == &rougeada) {
      Serial.print("Rouge : ");
      rouge=(char *)rougeada.lastread;
      Serial.println(rouge);
      sscanf(rouge, "%3d", &ROUGE);
    }
    

    if (subscription == &vertada) {
      Serial.print("Vert : ");
      vert=(char *)vertada.lastread;
      Serial.println(vert);
      sscanf(vert, "%3d", &VERT);
    }

    
    if (subscription == &bleuada) {
      Serial.print("Bleu : ");
      bleu=(char *)bleuada.lastread;
      Serial.println(bleu);
      sscanf(bleu, "%3d", &BLEU);
    }
    Serial.println(sliderval);
    Serial.println(ROUGE);
    Serial.println(VERT);
    Serial.println(BLEU);
    
    for(int dot = 0; dot < NUM_LEDS; dot++) { 
      leds[dot] = CRGB(ROUGE,VERT,BLEU);
      FastLED.setBrightness(sliderval);
      FastLED.show();
            FastLED.show();}
    
      
    if (subscription == &Bool1) {
      Serial.print("Lumière : ");
      Serial.println((char *)Bool1.lastread);
      int Bool1_State = atoi((char *)Bool1.lastread);
      if (Bool1_State == 1){
        Serial.println("ON");}
      else {
        Serial.println("OFF");
      }
    
        }}
   
  mqtt.ping();
  delay(100);
}

ça marche mais ça ajoute une très grosse bibliothèque à votre programme. atoi() (ou mieux strtol qui permet de détecter une entrée non conforme) fonctionnait très bien, il fallait juste enlever le type juste avant le nom de la variable (sinon vous créez une variable locale du même nom que la variable globale qui n'avait comme portée (durée de vie) que celle du if, la variable globale n'était jamais modifiée.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.