Serial Read valeur modifiées...

Bonjour à tous,

Pour régler un problème de régulation de ma chaufferie, plus précisément la commutation d’un moteur de vanne à trois voies, j’ai fait un bout de code.

N’ayant pas encore reçu les sondes de températures ds18b20, j’ai mis les valeurs en dur dans le code.

Afin de faire un test de fonctionnement, j’utilise Serial.read() pour entrer une des température.

Cependant, mon problème est le suivant:

Je saisi 80.00, le serial me répond que la valeur saisie est de 56.00 puis à chaque loop (delay(2000)) cette valeur baisse jusqu’à arriver à 10.00…

Je suis perdu et je comprend pas pourquoi… voici mon code

#include <Wire.h>
#include<LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3e,16,2);// pour la simulation, si ok utiliser les lignes du dessous, ou l'une ou l'autre
//LiquidCrystal_I2C lcd(0x27,20,4);
//LiquidCrystal_I2C lcd(0x3F,20,4);

#define RELAY1 8 // Y2 sur toujour fermé en cas de coupure de courant ou de mauvais fonctionnement de l'Arduino


int statutVanne = 0; //Valeur d'initialisation pour démarrage du programme
long tActionVanne = 180000; //1000 = 1 seconde
float TempAller ;
float TempAccuHaut = 65.00;

void statVanne () {
  if (statutVanne == 1)
  {
    Serial.println ("Vanne ouverte");
  }
  else if (statutVanne == 2)
  {
    Serial.println ("Vanne fermee");
  }   
}

  

void setup() 
{
Wire.begin();
lcd.init();
Serial.println("Initialisation de l'ecran");
delay(1000);  

Serial.begin (9600);
Serial.println("\nI2C Scanner");
Serial.println ("**************");
Serial.println ("Initialisation");
Serial.println ("**************");
Serial.println ("Commutation de vanne 3 voies Siemens SSY319");
Serial.println ("*******************************************");
Serial.println ("*******************************************");
Serial.print ("La vanne est actuellement sur: ");
statVanne();
Serial.println (statutVanne);
Serial.println ("*******************************************");
Serial.println ("");


lcd.backlight();
lcd.setCursor(0,0);
// à terminer 


pinMode(RELAY1,OUTPUT);

  //Initialisation des Pins des relais sur "OUTPUT"
digitalWrite (RELAY1, LOW);


}

void loop() {
  float Hysterese = 2.00;
  float DeltaT = 3.00;


if(Serial.available()!= 0)
{
  TempAller = Serial.read(); //insertion dans le moniteur de la temperature aller
  Serial.print("la temperature aller a ete saisie a: ");
  Serial.println(TempAller);
  delay(500);
}  

Serial.print("La temperature de l'accu est actuellement de ");
Serial.print(TempAccuHaut);
Serial.print("'C      -        ");
Serial.print("La temperature de l'aller de la chemiee est actuellement de ");
Serial.print(TempAller);
Serial.println("'C");
Serial.print ("La vanne est actuellement sur: ");
statVanne();
Serial.println (statutVanne);
Serial.println("");

  if (TempAccuHaut + DeltaT < TempAller &&( statutVanne == 2 || statutVanne == 0)) // si il y a diff de temp et que la vanne est fermee 2
    {
    statutVanne = 0;  
    digitalWrite (RELAY1, HIGH);
    Serial.println("la vanne s'ouvre");
    statVanne();
    statutVanne = 1;
    }  

  if (TempAccuHaut + DeltaT > TempAller && (statutVanne == 1 || statutVanne == 0))// si il y a diff de temp et que la vanne est ouverte 1
    {
    statutVanne = 0;
    digitalWrite (RELAY1, LOW);
    Serial.println("la vanne se ferme");
    statVanne();
    statutVanne = 2;
    }  
    
delay(2000);

}

voici les résultats du serial en ayant saisi la température à 80.00

**************
Initialisation
**************
Commutation de vanne 3 voies Siemens SSY319
*******************************************
*******************************************
La vanne est actuellement sur: 0
*******************************************

La temperature de l'accu est actuellement de 65.00'C   -   La temperature de l'aller de la chemiee est actuellement de 0.00'C
La vanne est actuellement sur: 0

la vanne se ferme
La temperature de l'accu est actuellement de 65.00'C   -   La temperature de l'aller de la chemiee est actuellement de 0.00'C
La vanne est actuellement sur: Vanne fermee
2

--------------c'est ici que j'ai saisi 80.00------------------

la temperature aller a ete saisie a: 56.00
La temperature de l'accu est actuellement de 65.00'C   -   La temperature de l'aller de la chemiee est actuellement de 56.00'C
La vanne est actuellement sur: Vanne fermee
2

la temperature aller a ete saisie a: 48.00
La temperature de l'accu est actuellement de 65.00'C   -   La temperature de l'aller de la chemiee est actuellement de 48.00'C
La vanne est actuellement sur: Vanne fermee
2

la temperature aller a ete saisie a: 10.00
La temperature de l'accu est actuellement de 65.00'C   -   La temperature de l'aller de la chemiee est actuellement de 10.00'C
La vanne est actuellement sur: Vanne fermee
2

La temperature de l'accu est actuellement de 65.00'C   -   La temperature de l'aller de la chemiee est actuellement de 10.00'C
La vanne est actuellement sur: Vanne fermee
2

En soit, lorsque j’aurai les sondes il ne devrait pas y avoir de problème.
Merci d’avance pour votre précieuse aide ! :grinning:

Bonjour,

Serial.read() retourne un caractère et non la valeur de la chaine de caractères que tu as envoyée.
Utilises par exemple Serial.readBytesUntil() pour lire la chaine de caractères reçue puis atof() pour la convertir en flottant.

Merci pour ta réponse rapide,

J'ai fais pas mal de recherches sur Serial.readBytes() et Serial.readBytesUntil() par contre j'ai toujours pas trouvé la solution... aurais-tu un exemple ?

Merci de ta compréhension, je suis à mes débuts en programmation Arduino.

:slight_smile:

Tu peux faire quelquechose comme ça

  if (Serial.available())
  {
    char buf[10];
    int n=Serial.readBytesUntil('\n',buf,sizeof buf-1);  // lecture de la chaine de caractères reçue
    buf[n]=0;     // marque la fin de la chaine
    TempAller = atof(buf); //insertion dans le moniteur de la temperature aller
    Serial.print("la temperature aller a ete saisie a: ");
    Serial.println(TempAller);
    delay(500);
  }

Pour que ça fonctionne bien il faut que tu configures le terminal série pour envoyer CR LF en fin de ligne.

Hello,
Merci beaucoup pour tes explications ! ça marche enfin! Mais de manière bien plus compliquées que ce que je pensais. ReadFloat aurai été bien plus simple ^^