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);
}
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
}
ç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.