Séparer une variable en plusieurs variable

Bonjour je suis en train de réaliser un bandeau LED RGB connecter a Homebridge par MQTT cependant le plugin dans Homebridge ne sait pas envoyer R G et B sur des Topic différent je me retrouve donc avec (255,255,255) par exemple mais impossible de le diviser avec l'arduino.
si quelqu'un sait comment faire je suis preneur Merci.

Bonjour,
Quelle carte utilisez-vous pour recevoir les données mqtt?
Quelle librairie pour décoder le message mqtt?

Normalement le serveur domotique doit envoyer une trame Json avec certainement quelque chose comme value1 pour R ,Value2 pour G et Value 3 pour B.

Pour voir les trames Mqtt, j'utilise Fx cela permet de voir la composition du Json envoyé par mqtt.
voici un exemple de message décodé dans Mqttfx

{
	"Battery" : 255,
	"RSSI" : 12,
	"description" : "",
	"dtype" : "Light/Switch",
	"hwid" : "9",
	"id" : "00014064",
	"idx" : 20,
	"name" : "Lampe Parking",
	"nvalue" : 1,
	"stype" : "Switch",
	"svalue1" : "0",
	"switchType" : "On/Off",
	"unit" : 1
}

Bonjour,

Je ne suis pas sur de comprendre ton problème. (255,255,255) c'est déjà trois valeurs séparées.
Si ton problème consiste à séparer une valeur longue en trois octets tu peux faire comme ceci:

  long val = 0xffffff;

  byte red = val >> 16;
  byte green = (val >> 8) & 0xff;
  byte blue = val & 0xff;

J'utilise un esp8266 avec la librairie PubSubClient.
quand je regarde dans Mqtt.fx j'obtient rien de plus

ah ok.
Dans la fonction callback, je pense que :
payload[0]= R
payload[1]= G
payload[2]= B

A essayer!
voici un extrait de la fonction call back.. normalement les valeurs de payload doivent être affichées dans le moniteur série.

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }

Bonjour

chaine

il semble effectivement que tu récupères une chaîne de caracrtères dans laquelle les 3 données sont séparées par des virgules, ce n'est pas du json.

ça doit pouvoir se séparer avec strtok() ou sscanf() :
https://riton-duino.blogspot.com/2021/07/les-expressions-regulieres.html

.....ecrit avant d'avoir vu la proposition de @leptro

Je reçois la valeur dans une variable byte (payload)

void callback(char* topic, byte *payload, unsigned int length) {
Serial.println("-------Nouveau message du broker mqtt-----");
Serial.print("Canal:");
Serial.println(topic);
Serial.print("donnee:");
Serial.write(payload, length);
Serial.println();

et j'obtient cela
image

Donc tu reçois les trois valeurs en ASCII. La solution de @al1fch te permet de les convertir en numérique.

Cela fonctionne seul problème il me sépare tout les caractère un par un.

image

il faut utiliser payload[i] !
essai avec la modif

void callback(char* topic, byte *payload, unsigned int length) {
Serial.println("-------Nouveau message du broker mqtt-----");
Serial.print("Canal:");
Serial.println(topic);
Serial.print("donnee:");
for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);}
Serial.println();

Il faut suivre le tuto donné par @al1fch
Ce qui donne par exemple avec sscanf

  unsigned red;
  unsigned green;
  unsigned blue;

  sscanf(payload,"%u,%u,%u",&red,&green,&blue);

  Serial.println(red);
  Serial.println(green);
  Serial.println(blue);

je vient d'essayer le problème c'est que pour sscanf la variable payload doit être une const char

image

Ca ne marche pas il ne découpe mm plus.

payload doit être défini en byte
Il suffit de caster payload en char

sscanf((const char *)payload,"%u,%u,%u",&red,&green,&blue);

1 Like

Super!!!! ça marche un seul problème il me rajoute un 0 après Blue

image

affiche le payload brut comme en #9

Je ne peux pas il me mais ça

image

image

Même chose, il faut caster en char
Serial.println((char *)payload);

image
(la valeur envoyer par mqtt est 512 sur le dernier)