Problème de communication entre ESP8266 et UNO

Bonjour à tous,

J'ai un problème de communication entre un arduino Uno et un esp8266 qui est connecté sur le arduino cloud.

L'Uno mesure plusieurs variables (température, conductivité, ph ainsi que 4 niveaux de liquides), il régule egalement le pH et la conductivité en recevant une consigne pour chaque de la part du ESP8266 via un Dashboard.

L'ESP8266 lui, reçoit toutes les valeurs et les affiche sur un Dashboard et l'utilisateur peut changer les consignes et ainsi de suite.

Quand la communication (serie via les broches 1 et 2) va dans un seul sens, ça marche bien. Par contre dès que ca doit aller dans les deux sens je ne reçois rien.

J'ai l'impression d'avoir tourné le problème dans tout les sens et je suis un peu perdu.

Voici mes codes :

ESP8266

#include "thingProperties.h"

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  delay(1500); 
  
  consigne_ph = 8.0; // Consigne de pH
  consigne_conductivite = 2000.0; // Consigne de conductivité


  initProperties();
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void loop() {
  ArduinoCloud.update();
  // Envoyer les valeurs de consigne pH et conductivité à l'autre Arduino
  Serial.print(consigne_ph);
  Serial.print(",");
  Serial.print(consigne_conductivite);
  Serial.println();

  // Attendre la réponse de l'autre Arduino
  while (Serial.available() == 0) {
    delay(10);
  }

  // Lire les valeurs renvoyées par l'autre Arduino
  String data = Serial.readStringUntil('\n');
  int separatorIndex = data.indexOf(',');
  if (separatorIndex != -1) {
    float ph = data.substring(0, separatorIndex).toFloat();
    float conductivite = data.substring(separatorIndex + 1).toFloat();
    float temperature = data.substring(separatorIndex + 1, data.indexOf(',', separatorIndex + 1)).toFloat();
    bool niveau_A = data.substring(data.indexOf(',', separatorIndex + 1) + 1, data.indexOf(',', separatorIndex + 1 + 1)).toInt();
    bool niveau_B = data.substring(data.indexOf(',', separatorIndex + 1 + 1) + 1, data.indexOf(',', separatorIndex + 1 + 2)).toInt();
    bool niveau_C = data.substring(data.indexOf(',', separatorIndex + 1 + 2) + 1, data.indexOf(',', separatorIndex + 1 + 3)).toInt();
    bool niveau_D = data.substring(data.indexOf(',', separatorIndex + 1 + 3) + 1).toInt();

  }

  delay(10000);
}


/*
  Since ConsignePh is READ_WRITE variable, onConsignePhChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onConsignePhChange()  {
  // Add your code here to act upon ConsignePh change
}

/*
  Since ConsigneConductivite is READ_WRITE variable, onConsigneConductiviteChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onConsigneConductiviteChange()  {
  // Add your code here to act upon ConsigneConductivite change
}

ARDUINO UNO


float consigne_ph; // Consigne de pH reçue
float consigne_conductivite; // Consigne de conductivité reçue

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

void loop() {
  if (Serial.available() > 0) {
    // Lire les valeurs de consigne de pH et conductivité envoyées par l'autre Arduino
    String data = Serial.readStringUntil('\n');
    int separatorIndex = data.indexOf(',');
    if (separatorIndex != -1) {
      consigne_ph = data.substring(0, separatorIndex).toFloat();
      consigne_conductivite = data.substring(separatorIndex + 1).toFloat();
    }

    // Traiter les données et simuler les valeurs de température et niveaux
    float ph = consigne_ph+0.5;
    float conductivite = consigne_conductivite+500;
    float temperature = 25.0; // Simulation de la valeur de température
    bool niveau_A = random(0, 2); // Générer une valeur aléatoire pour le niveau A (0 ou 1)
    bool niveau_B = random(0, 2); // Générer une valeur aléatoire pour le niveau B (0 ou 1)
    bool niveau_C = random(0, 2); // Générer une valeur aléatoire pour le niveau C (0 ou 1)
    bool niveau_D = random(0, 2); // Générer une valeur aléatoire pour le niveau D (0 ou 1)
    
    // Envoyer les valeurs de pH, conductivité, température et niveaux
    Serial.print(ph);
    Serial.print(",");
    Serial.print(conductivite);
    Serial.print(",");
    Serial.print(temperature);
    Serial.print(",");
    Serial.print(niveau_A);
    Serial.print(",");
    Serial.print(niveau_B);
    Serial.print(",");
    Serial.print(niveau_C);
    Serial.print(",");
    Serial.println(niveau_D);
    delay(5000);
  }
}

Merci pour votre aide.

J'ai pas tout lu, mais là, il manque un argument à substring.

Avez vous bien connecté GND ? avez vous mis un adaptateur de tension entre les 2 ports série ?

avoir une dépendance aux fonctions arduino comme Serial.readStringUntil() est un risque à cause du timeout notamment

Si vous voulez étudier comment bien écouter le port série vous pouvez jeter un oeil à mon petit tuto sur le sujet

Sure le ESP serie est sur broches RX0 et TX0. Sur le UNO, serie est sur broches 0 et 1. Es-tu certain d'avoir connecté les broches corrects ?

De plus, sur l'UNO, sachez que vous ne pouvez pas utiliser le série en même temps que l'USB. Ils vont interférer les uns avec les autres. Une méthode d'éviter cela consiste à utiliser la bibliothèque SoftwareSerial. Cela peut créer un deuxième port série sur d'autres broches GPIO standard.

PS, y a-t-il une raison pour laquelle les capteurs ne peuvent pas être connectés directement à l'ESP ?

oui les deux GND sont communes. Je vais aller checker ton tuto peut etre que la solution est la.

Merci

Oui les broches sont corrects RX et TX sur l'ESP et 0,1 pour l'Uno.

et vous avez le moniteur série ouvert ?

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