Problème envoi de données entre 2 arduinos

Bonjour, je m'appelle Clément et suis actuellement en terminale STI2D SIN.

Je travaille actuellement sur mon projet de bac qui a pour but de connaitre l'état de santé d'une ruche grâce à des capteurs de poids, de température et d'humidité.

Ma partie consiste à envoyer ces valeurs par bluetooth à un shield ethernet et une arduino, pour ensuite les comparer avec des valeurs seuils entrées par l'apiculteur et les afficher sur un site.

Etant débutant en C j'ai réussi à envoyer une variable, la recevoir et l'afficher dans le moniteur série, mais je n'y arrive pas lorsque ma variable est un nombre à virgule, le moniteur ne m'affiche que la valeur entière.

Voici mon code d'envoi:

#include <SoftwareSerial.h>
 
SoftwareSerial bluetooth(2,3);
float e=21.25;
 
void setup()
{
  Serial.begin(9600);
   
  bluetooth.begin(9600);
}
 
 
void loop()
{
bluetooth.write(e);
delay(5000);
}

Et celui qui reçoit:

#include <SoftwareSerial.h>
 
SoftwareSerial bluetooth(2,3);
 
 
 
void setup()
{
  Serial.begin(9600);
 
  bluetooth.begin(9600);
}
 
 
void loop()
{
  float e;
   
  if(bluetooth.available())
  {
    e = bluetooth.read();
    Serial.println(e);
  }
}

De plus, je vais devoir envoyer les valeurs de chaque capteur, et à la réception les différencier et mettre chaque valeur dans une variable différente.

Et je ne sais absolument pas comment faire cela.

Si quelqu'un a des choses à me proposer :slight_smile:

Merci par avance,

Clément.

Bonjour,

D'après ce que je lis dans les classes Stream et Print, la méthode read() renvoit un int et pas un float. De plus write va convertir ton flottant en entier (en byte en fait). Les deux méthodes sont inappropriées

En émission, il est préférable d'utiliser println pour que le flottant soit converti en chaine de caractère. En effet, rien ne prouve que les nombres soient codés de la même manière côté émetteur et côté récepteur. Il est donc préférable de passer en ASCII (pour ce genre d'appli, l'augmentation du nombre d'octets envoyés n'est pas critique)

En réception, faire

e = bluetooth.parseFloat();

plutôt

Concernant la seconde question, il va falloir faire un petit protocole. Par exemple au lieu d'envoyer un flottant tout seul, tu envoies un caractère pour l'identifier puis le flottant.

Par exemple pour envoyer une température tu préfixes par la lettre T, l'humidité par la lettre H, etc.

bluetooth.print("T ");
bluetooth.println(temperature);
bluetooth.print("H ");
bluetooth.println(humidite);

En réception :

  if (bluetooth.available())
  {
    char typeDeDonnee = bluetooth.read(); // récupère la lettre qui identifie la donnee
    float donnee = bluetooth.parseFloat();  // récupère la donnée
    switch (typeDeDonnee) {
        case 'T':
            Serial.print("temperature = ");
            Serial.println(donnee);
            break;
        case 'H':
            Serial.print("humidite = ");
            Serial.println(donnee);
            break;

        /* etc */

        default:
            Serial.println("donnee inconnue");
    }
  }

Pour l'affichage des virgules d'un float :

Tu dois spécifier le format de l'affichage à utiliser :

Serial.println(1.23456, 0) gives "1"
Serial.println(1.23456, 2) gives "1.23"
Serial.println(1.23456, 4) gives "1.2346"

1.23456 c'est ton float donc si tu veux afficher 4 chiffres après la virgule sur le moniteur serie tu utilises

  • Serial.println(ton float, 4) ;

Clément

Le second argument a une valeur par défaut à 2. Voir la lignes 67 et 79 de Print.h