Fusion de deux scripts

Bonjour à tous

J’ai un petit projet avec mon arduino uno qui doit mesure une profondeur de ma citerne a eau de pluie avec le capteur aj-sr04m une fois cette valeur créer je voudrais l’envoyer sur mon serveur home assistant via un serveur mqtt .

Bonne nouvelle j’ai deux script qui fonctionne parfaitement l’un pour envoyer la valeur sur mon serveur home assistant et l’autre pour mesurer la profondeur .

Mais lorsque j’essaie de les « fusionné » je ne reçois plus la valeur de profondeur

Voici mon code qui envoie vers le serveur home assitant :

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
//code correcta la connection mqtt a ne pas modifier sauf ip arduino 
// Ethernet Shield configuration
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // Replace with your Ethernet shield MAC address
IPAddress ip(192, 168, 1, 17); // Replace with your Ethernet shield IP address
IPAddress server(192, 168, 0, 5); // Replace with your MQTT server IP address





// MQTT client configuration
void callback(char* topic, byte* payload, unsigned int length) {
  // Handle incoming messages
}

EthernetClient ethClient;
PubSubClient mqttClient(ethClient);


void setup() {

  // Start serial communication
  Serial.begin(9600);

  // Initialize Ethernet Shield
  Ethernet.begin(mac, ip);
  Serial.print("Connecting to Ethernet...");

  // Wait for Ethernet connection
delay(1000); // Wait for Ethernet Shield to initialize
Serial.println("Ethernet Shield initialized");
 

  // Initialize MQTT client
  mqttClient.setServer(server, 1883);
  mqttClient.setCallback(callback);

  // Connect to MQTT broker
  while (!mqttClient.connected()) {
    Serial.println("Connecting to MQTT broker...");
    if (mqttClient.connect("arduino-client", "niveaueau", "test")) {
      Serial.println("MQTT broker connected");
    } else {
      Serial.print("MQTT connection failed, rc=");
      Serial.print(mqttClient.state());
      Serial.println(" retrying in 5 seconds");
      delay(5000);
    }
  }
}

void loop() {

  //config message
  float value = 10.5;
  char message[10];
  sprintf(message, "%.1f", value); // Convert float to string with one decimal place

  // Publish message to MQTT broker
  mqttClient.loop();
  mqttClient.publish("my/topic", "150");
 mqttClient.publish("my/pooltemp", "21");

  // Wait before publishing next message
  delay(10000);
}

Voici mon code qui mesure la profondeur :

#include <NewPing.h>

// Définir les broches pour les connexions du capteur
#define PIN_TRIG 11
#define PIN_ECHO 10

// Initialiser l'objet NewPing avec les broches appropriées
NewPing sonar(PIN_TRIG, PIN_ECHO);

void setup() {
  // Démarrer la communication série
  Serial.begin(9600);
}

void loop() {
  // Mesurer la distance en centimètres avec le capteur
  unsigned int distance = sonar.ping_cm();

  // Vérifier si la mesure est valide (distance non nulle)
  if (distance != 0) {
    // Afficher la distance mesurée sur le moniteur série
    Serial.print("Distance : ");
    Serial.print(distance);
    Serial.println(" cm");
  } else {
    // Si la mesure est invalide, afficher un message d'erreur
    Serial.println("Erreur de mesure. Vérifier les connexions du capteur.");
  }

  // Attendre une courte période avant de mesurer à nouveau
  delay(500);
}

Voici mon code « fusionné » :


#include <NewPing.h>
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Définir les broches pour les connexions du capteur
#define PIN_TRIG 11
#define PIN_ECHO 10

// Initialiser l'objet NewPing avec les broches appropriées
NewPing sonar(PIN_TRIG, PIN_ECHO);

// Ethernet Shield configuration
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // Remplacez par l'adresse MAC de votre shield Ethernet
IPAddress ip(192, 168, 1, 17); // Remplacez par l'adresse IP de votre shield Ethernet
IPAddress server(192, 168, 0, 5); // Remplacez par l'adresse IP de votre serveur MQTT

// MQTT client configuration
void callback(char* topic, byte* payload, unsigned int length) {
  // Handle incoming messages
}

EthernetClient ethClient;
PubSubClient mqttClient(ethClient);

void setup() {
  // Démarrer la communication série
  Serial.begin(9600);
  
  // Initialize Ethernet Shield
  Ethernet.begin(mac, ip);
  Serial.print("Connecting to Ethernet...");
  
  // Wait for Ethernet connection
    delay(100);
  Serial.println("Ethernet Shield connected");

  // Initialize MQTT client
  mqttClient.setServer(server, 1883);
  mqttClient.setCallback(callback);

  // Se connecter au serveur MQTT avec mot de passe
  if (mqttClient.connect("arduino-client", "niveaueau", "test")) {
    Serial.println("Connected to MQTT server");
  } else {
    Serial.println("Failed to connect to MQTT server");
    while (1); // Bloquer l'exécution si la connexion MQTT échoue
  }
}

void loop() {
  // Mesurer la distance en centimètres avec le capteur
  unsigned int distance = sonar.ping_cm();

  // Vérifier si la mesure est valide (distance non nulle)
  if (distance != 0) {
    // Afficher la distance mesurée sur le moniteur série
    Serial.print("Distance : ");
    Serial.print(distance);
    Serial.println(" cm");

    // Convertir la distance en chaîne de caractères
    String payload = String(distance);
    
    // Publier la distance sur un sujet MQTT
    mqttClient.publish("capteur/sonar/distance", payload.c_str());
  } else {
    // Si la mesure est invalide, afficher un message d'erreur
    Serial.println("Erreur de mesure. Vérifier les connexions du capteur.");
  }

  // Attendre une courte période avant de mesurer à nouveau
  delay(500);
}

Lors de mes test pour le debug quand je retire cette ligne Ethernet.begin(mac, ip) ma mesure revient dans le moniteur

Avez vous une idée de mon erreur ?

Merci

est-ce que vous voyez dans le terminal

pourquoi ne pas avoir conservé

  // Connect to MQTT broker
  while (!mqttClient.connected()) {
    Serial.println("Connecting to MQTT broker...");
    if (mqttClient.connect("arduino-client", "niveaueau", "test")) {
      Serial.println("MQTT broker connected");
    } else {
      Serial.print("MQTT connection failed, rc=");
      Serial.print(mqttClient.state());
      Serial.println(" retrying in 5 seconds");
      delay(5000);
    }
  }

dans le code qui marche vous avez

  mqttClient.loop();
  mqttClient.publish("my/topic", "150");
 mqttClient.publish("my/pooltemp", "21");

dans l'autre vous n'avez plus l'appel à loop() et vous publiez dans un autre topic

    mqttClient.publish("capteur/sonar/distance", payload.c_str());

Désolé cette ligne mqttClient.publish("capteur/sonar/distance", payload.c_str());

et une des multiples versions que j’ai essaie hier tard dans la soirée au moment que je rédigeais ce sujet j’avais les yeux qui piquais .

La bonne version est cette partie de code

  
mqttClient.loop();
  
mqttClient.publish("my/topic", "150");
 
mqttClient.publish("my/pooltemp", "21");

je remplacerai les valeurs " fixe " par les valeur des capteurs ,mais actuellement j’ai l’impression que le capteur du sonar de profondeur et la connexion au réseau local rentre en conflit et je ne sais pas quel est la cause .

Du coup tu as quoi sur la sortie du moniteur.
Tu indique que les deux codes te semble rentrer en conflit, c'est à dire?

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