communication sérial

bonjour
j’ai un projet le but c’est la mesure de température le long d’un barreau donc j’ai utilisé un convertisseur MAX6675 c’est un convertisseur pour thermocouple type K et j’ai 7 thermocouple pour mesurer la température au différent point donc j’ai utilser un multiplexeur pour obtenir les différent valeurs des thermocouples. j’ai utiliser la communication série pour envoyer les mesures a une autre carte arduino puis les afficher à l’aide du moniteur série de l’arduino.
voici le code pour la carte arduino de mesure

#include <SoftwareSerial.h>
#include <max6675.h>
#include <LiquidCrystal.h>
SoftwareSerial mySerialtwo(10, 11);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int thermoD0 = 12;
int thermoCS = 9;
int thermoCLK = 13;
float temp1 = 0;
float temp2 = 0;
float temp3 = 0;
float temp4 = 0;
float temp5 = 0;
float temp6 = 0;
float temp7 = 0;


MAX6675 thermocouple( thermoCLK, thermoCS, thermoD0);


 
void setup(){
 pinMode(8, OUTPUT);  
 digitalWrite(8,LOW);
 lcd.begin(16, 2);
 lcd.clear();
 mySerialtwo.begin(9600);
 analogWrite ( A0, 255);
 analogWrite ( A1, 255);
 analogWrite ( A2, 255);
 analogWrite ( A3, 0);
 //Serial.begin(9600);
}
 
void loop(){
 // premiere thermocouple 
while(1) 
{

analogWrite (A0, 0);
analogWrite (A1, 0);
analogWrite (A2, 0);
delay(100);
temp1 = thermocouple.readCelsius();
delay(1000);
 lcd.display();
 lcd.clear();
 lcd.setCursor(1,0);
 lcd.print("th1= ");
 lcd.setCursor(6,0);
 lcd.print(temp1-16);
 float temp11 = (temp1-16)/10;
 //mySerialtwo.write(1);
 
 mySerialtwo.write(temp11);
// Serial.print("th1");
// Serial.println(temp1-16);

  if (temp1-16>50)
 {
  digitalWrite(8, HIGH);
  }
  else {
    digitalWrite(8, LOW);
    }
    //Serial.println(temp1);

// deuxième thermocouple 

analogWrite (A0, 255);
analogWrite (A1, 0);
analogWrite (A2, 0);
delay(100);
temp2 = thermocouple.readCelsius();
delay(1000);
 lcd.display();
 lcd.clear();
 lcd.setCursor(1,0);
 lcd.print("th2= ");
 lcd.setCursor(6,0);
 lcd.print(temp2-16);
 //mySerialtwo.write("th2");
 float temp22 = (temp2-16);
 mySerialtwo.write(temp22);
//
//// troisième  thermocouple 
//
analogWrite (A0, 0);
analogWrite (A1, 255);
analogWrite (A2, 0);
delay(100);
temp3 = thermocouple.readCelsius();
delay(1000);
 lcd.display();
 lcd.clear();
 lcd.setCursor(1,0);
 lcd.print("th3= ");
 lcd.setCursor(6,0);
 lcd.print(temp3-16);
 //mySerialtwo.write("th3")
 float temp33 = 10*(temp3-16);
 mySerialtwo.write(temp33);
// 
////// quatrième  thermocouple 
////
analogWrite (A0, 255);
analogWrite (A1, 255);
analogWrite (A2, 0);
delay(100);
temp4 = thermocouple.readCelsius();
delay(1000);
 lcd.display();
 lcd.clear();
 lcd.setCursor(1,0);
 lcd.print("th4= ");
 lcd.setCursor(6,0);
 lcd.print(temp4-16);
 //mySerialtwo.write("th4");
  float temp44 = 100*(temp4-16);
 mySerialtwo.write(temp44);
//
//// cinquième  thermocouple 
//
analogWrite (A0, 0);
analogWrite (A1, 0);
analogWrite (A2, 255);
delay(100);
temp5 = thermocouple.readCelsius();
delay(1000);
 lcd.display();
 lcd.clear();
 lcd.setCursor(1,0);
 lcd.print("th5= ");
 lcd.setCursor(6,0);
 lcd.print(temp5-16);
 //mySerialtwo.write("th5");
  float temp55 = 1000*(temp5-16);
 mySerialtwo.write(temp55);
// 
//// // sixième  thermocouple 
////
analogWrite (A0, 255);
analogWrite (A1, 0);
analogWrite (A2, 255);
delay(100);
temp6 = thermocouple.readCelsius();
delay(1000);
 lcd.display();
 lcd.clear();
 lcd.setCursor(1,0);
 lcd.print("th6= ");
 lcd.setCursor(6,0);
 lcd.print(temp6-16);
 //mySerialtwo.write("th6");
  float temp66 = 10000*(temp6-16);
 mySerialtwo.write(temp66);
//////
//////// septième  thermocouple 
////
analogWrite (A0, 0);
analogWrite (A1, 255);
analogWrite (A2, 255);
delay(100);
temp7 = thermocouple.readCelsius();
delay(1000);
 lcd.display();
 lcd.clear();
 lcd.setCursor(1,0);
 lcd.print("th7= ");
 lcd.setCursor(6,0);
 lcd.print(temp7-16);
 //mySerialtwo.write("th7");
  float temp77 = 100000*(temp7-16);
 mySerialtwo.write(temp77);

}
 }

et ci dessous l’autre carte

#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 9); 
SoftwareSerial mySerialtwo(10,11);
//String data = "";
void setup() {
    
  Serial.begin (115200);
  mySerial.begin(9600);
  mySerialtwo.begin(9600);
}

void loop() {
//while(1)
//{
 mySerial.listen();
 while (mySerial.available()==0);
 //delay(1000);
   // mySerialtwo.end();
 float  c = mySerial.read();
 delay(90);
 Serial.print("courant");
 Serial.println(c , 3);
 
 //Serial.println();
 
 ////////////////////////////////
 ////////////////////////////////
 ////////////////////////////////
  
  
  //Serial.println();
   
  mySerialtwo.listen();
  while (mySerialtwo.available()==0);
 
   // mySerial.end();
   // data = mySerialtwo.read(); 
    
    double a = mySerialtwo.read();
    delay(100);
//    if (data.startsWith("th2"))
//    {
//      String data1 = data.substring(3,7);
//      }
 
    //Serial.println(data);
  if (a<10)
  {
    Serial.print("th1 ");
    Serial.println(a*10);
    delay(1000);
    }
  else if (10<a<100)
   {
    Serial.print("th2 ");
    Serial.println(a);
    delay(1000);
    }
  else if (100<a<1000)
   {
    Serial.print("th3 ");
    Serial.println(a/10);
    delay(1000);
    }
    else if (1000<a<10000)
   {
    Serial.print("th4 ");
    Serial.println(a/100);
    delay(1000);
    }
   else if (10000<a<100000)
   {
    Serial.print("th5 ");
    Serial.println(a/1000);
    delay(1000);
    }
    else if (100000<a<1000000)
   {
    Serial.print("th6 ");
    Serial.println(a/10000);
    delay(1000);
    }
    else if (1000000<a<10000000)
   {
    Serial.print("th7 ");
    Serial.println(a/100000);
    delay(1000);
    }
//}   
}

j’ai utiliser une pondération et une dépondération pour envoyer les valeurs puisque les mesures sont dans le méme intervalle donc la pondération c’est pour identifier la valeur de chaque thermocouple.
le problème c’est que j’obtiens seulement des valeur dans les deux première thermocouple de plus ils sont fausse les résultats obtenues
voila une capture du moniteur série

Bonjour,

write() et read() envoient et reçoivent un caractère.
Si tu veux envoyer/recevoir de floats il faut les transmettre en ascii avec un print par exemple et recevoir une chaine de caractères (ou envoyer les 4 octets qui composent le float).

1. What is the type of the analog multiplexer that you have used to acquire 8 thrmocouples signal one after another.

2. If you have used A2, A1, A0 lines to select the channels, then the codes should be: digitalWrite(A0, HIGH/LOW); and not analogWrite(A0, xxx).

3. Please, follow these guide lines and develop codes to make only one thermocouple working having direct connection with MAX6675. After connect the other thermocouples.

Try this sketch for Arduino-1 (untested)

#include <SoftwareSerial.h>
#include <max6675.h>
SoftwareSerial mySerialtwo(10, 11);
int thermoD0 = 12;
int thermoCS = 9;
int thermoCLK = 13;
float temp1 = 0;
MAX6675 thermocouple( thermoCLK, thermoCS, thermoD0);

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

void loop() 
{
    temp1 = thermocouple.readCelsius();
    float temp11 = (temp1 - 16) / 10;
    Serial.print(temp11, 2);
    mySerialtwo.print(temp11, 2);  //2-digit after decimal point
    mySerialtwo.write(0x0A);        //Newline charcater-code
    delay(1000);    //test interval
}

Sketch for Arduino-2 (untested)

#include <SoftwareSerial.h>
SoftwareSerial mySerialtwo(10, 11);

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

void loop() 
{
  byte n = mySerial.available();
  if (n !=0)
  {
    char x = mySerialtwo.read();
    Serial.print(x);
  }
}

kamill:
write() et read() envoient et reçoivent un caractère.
Si tu veux envoyer/recevoir de floats il faut [...] envoyer les 4 octets qui composent le float.

Dans ce cas il faut s'assurer que la représentation des floats est la même sur les 2 machines (même taille, même endianness).