Problème de valeur de retour d'une fonction de type structure

Bonjour à tous,
Je vais vous présenter mon projet. Je suis en train de créer un dispositif qui détecte la température et averti quand la température est inférieure à la température consigne saisie sur le clavier.
Mon problème c'est que je voudrais récupérer deux variables de différentes types dans un fonction appeler ecouter() et je ne sais pas pourquoi mais quand j'appelle la fonction dans loop ,seule la variable bool est récupéré et le variable float(consigneTemperature) n'est pas considéré par la fonction loop.
Est-ce vous pouvez m'aidez s'ils vous plaît

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Keypad.h>

// Configuration du capteur DS18B20
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Configuration du clavier matriciel
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', '-'},
  {'4', '5', '6', '.'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8, 9};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// Configuration de l'écran LCD
LiquidCrystal_I2C lcd(0x20,16,2);

//broche LED
const int LED1 = 12;

// Broche du buzzer
const int buzzerPin = 11; 

// Température consigne
float consigneTemperature = 0;

struct data {
  float consigneTemperature;
  bool sensorState;
};

// unsigned long previousMillis = 0;
// const unsigned long interval = 2000;
int compt = 1000;

void setup() {
  sensors.begin();
  lcd.init();
  lcd.begin(16, 2);
  pinMode(buzzerPin, OUTPUT);
  pinMode(LED1,OUTPUT);
  lcd.backlight();
  
  lcd.setCursor(0,0);
  lcd.print("consigne ");
  lcd.setCursor(0,1);
  lcd.print("avec # puis *");
  delay(2000);
  
}

bool sensorState = true;
// créer une structure pour regrouper le consigneTemperature et buzzerStop

data config;
data ecouter() {
  char key = keypad.getKey();
  config.sensorState= sensorState;
  if (key != NO_KEY) {
    if (key == '#'){
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Consigne:");
      String tempStr = "";
      while (key != '*') {
        
        key = keypad.getKey();
        if (key != NO_KEY) {
          if ((key >= '0' && key <= '9') || key =='-' || key =='.') {
            tempStr += key;
            lcd.print(key);
          }
        }
      }
      config.consigneTemperature= consigneTemperature;
      consigneTemperature = tempStr.toFloat();
      lcd.clear();
      lcd.print("Temp. consigne:");
      lcd.setCursor(0, 1);
      lcd.print(consigneTemperature);
      sensorState = true; 

      while (compt != 0) {
        lcd.display();
        compt--;
      }
      lcd.clear(); 
      compt=1000;
    } 
    
    else if (key == 'C'){
      digitalWrite(buzzerPin, LOW);
      digitalWrite(LED1,LOW);
      lcd.setCursor(0,0);
      lcd.clear();
      lcd.print("buzzer arreter!");
      sensorState = false;
    }
  
    
  }return {sensorState,consigneTemperature};
} 

unsigned long previousUpdateTime = 0;
const unsigned long updateInterval = 1000;  // Mettez ici l'intervalle désiré en millisecondes

void loop() {
  unsigned long currentMillis = millis();

  // Écouter le clavier
  data config = ecouter();
  consigneTemperature= config.consigneTemperature;
  sensorState= config.sensorState;

  if (sensorState == true){
    // Mettre à jour l'affichage de la température à intervalles réguliers
  if (currentMillis - previousUpdateTime >= updateInterval) {
    previousUpdateTime = currentMillis;

    sensors.requestTemperatures();
    float tempC = sensors.getTempCByIndex(0);
    
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp:");
    lcd.print(tempC);
    lcd.print(" C");
    

    if (tempC <= consigneTemperature ) {
      digitalWrite(buzzerPin, HIGH);
      digitalWrite(LED1,HIGH);
      lcd.setCursor(0, 1);
      lcd.print("Buzzer actif ");
    
    } else {
      digitalWrite(buzzerPin, LOW);
      digitalWrite(LED1,LOW);
      lcd.setCursor(0, 1);
      lcd.print("Buzzer inactif");
    }
  
  }
  lcd.display();
  

  
}
  }
  




type or paste code here

Le C++ ne retourne pas plusieurs valeurs séparées

Ici vous avez l’opérateur virgule qui évalue la première expression (qui ne fait rien) puis le seconde et retourne son résultat

Si vous voulez retourner plusieurs valeurs retournez une structure (retour par copie) ou passez la par référence en paramètre, la fonction travaille alors directement avec la mémoire fournie par l’appelant.

data uneFonction() {
  data valeur;
  valeur.consigneTemperature = 32.5;
  valeur.sensorState = true;
  return valeur;
}

Ou alors par référence en paramètre

bool uneFonction(data& valeur) {
  valeur.consigneTemperature = 32.5;
  valeur.sensorState = true;
  return true;
}

La fonction pouvant retourner en plus un bool par exemple pour dire si les données ont bien été initialisées

1 Like

Merci beaucoup. En effet , c'était là le problème.
Ça a marché. Merci

Super
Bons bidouillages!

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