Esp32 mqtt info binaire

Bonjour,
je connais rien en Arduino a part faire du copier collé, je cherche via un esp32 a remonter une info binaire (contact qui se fermerait…) via jmqtt .
j arrive a mettre ce code dans l esp. Le moniteur série montre bien le binaire. l’esp est bien connecté en wifi;
le topic renseigné …l équipement créé dans jmqtt ok ;
Mais quel mécanique dans le code pour remonter l’information?

Tu veux récupérer l’état du bouton via topic? c’est bien ça ?

#include Pubsubclient ne suffit pas ?

oui l état binaire de la sortie 32
pour me faire un capteur simple

Dac, et c’est publié sur mqtt_explorer ou pas?

je n’ai pas regardé
a part sur jmqtt en temps réel mais …

essaies « client.publish (topic, buttonState) » pluton que « bouton » qui n’est pas défini

j essaie cela

et check sur mqqt_explorer, tu devrais avoir 1 ou 0 comme valeur, après tu peux mettre un nom devant ta variable pour la repérer facilement

je viens d’install mqtt explorer je regarde

cela ne remonte pas

tu pourrais m’envoyer ton code formater stp parce que je vois pas rand chose

ok je fais ca
Ah j’ ai un truc buttonState = jeedom/buttonState

#include "WiFi.h"
#include "PubSubClient.h"
#include  "Wire.h"
  // WiFi 
const char *ssid = "xxxxxxxxxxxx"; // Entrez votre SSID WiFi  
const char *password = "xxxxxxxxxx"; // Entrez votre mot de passe WiFi 
  
// MQTT Broker 
const char *mqtt_broker = "192.168.1.160"; 
const char *topic = "buttonState"; 
const char *mqtt_username = "jeedom"; 
const char *mqtt_password = "xxxxxxxxxxxxxxxxxxx"; 
const int mqtt_port = 1883; 
WiFiClient espClient; 
PubSubClient client(espClient); 

const int buttonPin = 32;
const int ledPin =  23;

// Etat du bouton poussoir
int buttonState = 0;

void setup() { 
 //Mise de la vitesse de transmission à 115200; 
 Serial.begin(115200); 
 
 //Configuration du pin en entrée pullup
    pinMode(buttonPin, INPUT_PULLUP);
    pinMode(ledPin, OUTPUT);
    
 // Connecting to a Wi-Fi network 
 WiFi.begin(ssid, password); 
 while (WiFi.status() != WL_CONNECTED) { 
 delay(500); 
 Serial.println("Connecting to WiFi.."); 
  } Serial.println("Connected to the Wi-Fi network"); 
  //connexion au broker MQTT  
 client.setServer(mqtt_broker, mqtt_port); 
 client.setCallback(callback); 
 while (!client.connected()) { 
 String client_id = "esp32-client-"; 
 client_id += String(WiFi.macAddress()); 
 Serial.printf("The client %s connects to the public MQTT brokern", client_id.c_str()); 
 if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) { 
  Serial.println("Public EMQX MQTT broker connected"); 
  } else { 
  Serial.print("failed with state "); 
  Serial.print(client.state()); 
  delay(2000); 
  } 
  } 
  // Publish et subscribe 
  client.publish(topic, "jeedom/buttonState"); 
  client.subscribe(topic);
  } 
  // Reception du message MQTT 
void callback(char *topic, byte *payload, unsigned int length) { 
Serial.print("Message arrived in topic: "); 
Serial.println(topic); 
  Serial.print("Message:"); 
  for (int i = 0; i < length; i++) { 
Serial.print((char) payload[i]); 
  } 
  Serial.println(); 
  Serial.println("-----------------------"); 
  } 
void loop() { 

       buttonState = digitalRead(buttonPin);
    Serial.println(buttonState);

    if (buttonState == 1) {
        // Allume la led
        digitalWrite(ledPin, HIGH);
    } else {
        // Eteins la led
        digitalWrite(ledPin, LOW);
        
      }
    }
    

Hello,
Je ne suis pas spécialiste du code mais;
tu peux déplacer dans le global:

// Publish et subscribe
void MQTTsend() {
String buttonStateString = String(buttonState);
client.publish(topic, buttonStateString.c_str());
client.subscribe(topic);
}

et tu rajoute dans la loop:

void loop() { 
  delay(1000);
  MQTTsend();

ce qui donne :

#include "WiFi.h"
#include "PubSubClient.h"
#include  "Wire.h"
  // WiFi 
const char *ssid = "xxxxxxxxxxxxxxx"; // Entrez votre SSID WiFi  
const char *password = "xxxxxxxxxxxxxxx"; // Entrez votre mot de passe WiFi 
  
// MQTT Broker 
const char *mqtt_broker = "192.168.1.160"; 
const char *topic = "bouton_esp"; 
const char *mqtt_username = "jeedom"; 
const char *mqtt_password = "xxxxxxxxxxx"; 
const int mqtt_port = 1883; 
WiFiClient espClient; 
PubSubClient client(espClient); 

const int buttonPin = 32;
const int ledPin =  23;

// Etat du bouton poussoir
int buttonState = 0;

// Publish et subscribe
void MQTTsend() {
String buttonStateString = String(buttonState);
client.publish(topic, buttonStateString.c_str());
client.subscribe(topic);
}


void setup() { 
 //Mise de la vitesse de transmission à 115200; 
 Serial.begin(115200); 
 
 //Configuration du pin en entrée pullup
    pinMode(buttonPin, INPUT_PULLUP);
    pinMode(ledPin, OUTPUT);
    
 // Connecting to a Wi-Fi network 
 WiFi.begin(ssid, password); 
 while (WiFi.status() != WL_CONNECTED) { 
 delay(500); 
 Serial.println("Connecting to WiFi.."); 
  } Serial.println("Connected to the Wi-Fi network"); 
  //connexion au broker MQTT  
 client.setServer(mqtt_broker, mqtt_port); 
 client.setCallback(callback); 
 while (!client.connected()) { 
 String client_id = "esp32-client-"; 
 client_id += String(WiFi.macAddress()); 
 Serial.printf("The client %s connects to the public MQTT brokern", client_id.c_str()); 
 if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) { 
  Serial.println("Public EMQX MQTT broker connected"); 
  } else { 
  Serial.print("failed with state "); 
  Serial.print(client.state()); 
  delay(2000); 
  } 
  } 

/*
// Publish et subscribe 
  client.publish(topic, "jeedom/buttonState"); 
  client.subscribe(topic);
  } */
  
  // Reception du message MQTT 
void callback(char *topic, byte *payload, unsigned int length) { 
Serial.print("Message arrived in topic: "); 
Serial.println(topic); 
  Serial.print("Message:"); 
  for (int i = 0; i < length; i++) { 
Serial.print((char) payload[i]); 
  } 
  Serial.println(); 
  Serial.println("-----------------------"); 
  }
void loop() { 
  delay(1000);
  MQTTsend();

       buttonState = digitalRead(buttonPin);
    //Serial.println(buttonState); //debug

    if (buttonState == 1) {
        // Allume la led
        digitalWrite(ledPin, LOW);
    } else {
        // Eteins la led
        digitalWrite(ledPin, HIGH);
        
      }
    }
    

Tu as aussi le bouton qui est pas bon car sur le gpio 32 tu es HIGH par défaut sur l’esp32

ok je vois le probleme, je suis dans le train donc pas moyen de tester mais essaies avec ces modifications :

#include "WiFi.h"
#include "PubSubClient.h"
#include "Wire.h"
#include "wifi.h"
  // WiFi 
const char *ssid = ""; // Entrez votre SSID WiFi  
const char *password = "!"; // Entrez votre mot de passe WiFi 
  
// MQTT Broker 
const char *mqtt_broker = "192.168.1.XXX"; 
const char *topic = "buttonState"; 
const char *mqtt_username = "jeedom"; 
const char *mqtt_password = "xxxxxxxxxxxxxxxxxxx"; 
const int mqtt_port = 1883; 
WiFiClient espClient; 
PubSubClient client(espClient); 

const int buttonPin = 32;
const int ledPin =  23;

// Etat du bouton poussoir
bool buttonState = 0;
//conversion string


void setup() { 
  const char*button ;
   buttonState = digitalRead(buttonPin);
  
 //Mise de la vitesse de transmission à 115200; 
 Serial.begin(115200); 
 
 //Configuration du pin en entrée pullup
    pinMode(buttonPin, INPUT_PULLUP);
    pinMode(ledPin, OUTPUT);
    
 // Connecting to a Wi-Fi network 
 WiFi.begin(ssid, password); 
 while (WiFi.status() != WL_CONNECTED) { 
 delay(500); 
 Serial.println("Connecting to WiFi.."); 
  } Serial.println("Connected to the Wi-Fi network"); 
  //connexion au broker MQTT  
 client.setServer(mqtt_broker, mqtt_port); 
 client.setCallback(callback); 
 while (!client.connected()) { 
 String client_id = "esp32-client-"; 
 client_id += String(WiFi.macAddress()); 
 Serial.printf("The client %s connects to the public MQTT brokern", client_id.c_str()); 
 if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) { 
  Serial.println("Public EMQX MQTT broker connected"); 
  } else { 
  Serial.print("failed with state "); 
  Serial.print(client.state()); 
  delay(2000); 
  } 
  } 
   
  // Publish et subscribe 
  client.publish(topic, button, String(buttonState) ); 
  client.subscribe(topic);
  } 
  // Reception du message MQTT 
void callback(char *topic, byte *payload, unsigned int length) { 
Serial.print("Message arrived in topic: "); 
Serial.println(topic); 
  Serial.print("Message:"); 
  for (int i = 0; i < length; i++) { 
Serial.print((char) payload[i]); 
  } 
  Serial.println(); 
  Serial.println("-----------------------"); 
  } 
void loop() { 

    buttonState = digitalRead(buttonPin);
    Serial.println(buttonState);

    if (buttonState == 1) {
        // Allume la led
        digitalWrite(ledPin, HIGH);
    } else {
        // Eteins la led
        digitalWrite(ledPin, LOW);
        
      }
    }
    

Hello,

Je passe juste par là, mais pourquoi ne pas simplement utiliser un cade déjà fait, maintenu et répondant à la majorité des cas d’usages génériques comme ESPEasy ou Tasmota pour ton usage ?

Bad

parce que c’est quand même plus marrant quand on se prend un peu la tête!

Oui,ce serait plus simple, mais j’aime bien connaitre le pourquoi du comment ? :wink: la mécanique du truc quoi.
Aussi je suis sur Mac et je ne sais pas sur que ces solutions soient compatibles sur Mac OS ?

Allez essaie en cours…