Délais différents

Bonsoir,

J'utilise deux thermocouples pour mesurer la température, je voudrai que la température mesurée par le 1er thermocouple s'affiche chaque seconde et celle mesurée par le 2ème thermocouple s'affiche chaque 5 seconde (donc pour chaque affiche de la 2ème température j'aurai 5 affichages de la 1ère).
j'ai utiliser le code suivant:

#include "max6675.h"

int thermoDO = 4;
int thermoCS = 5;
int thermoCLK = 6;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
int thermoDO2 = 7;
int thermoCS2 = 9;
int thermoCLK2 = 8;

MAX6675 thermocouple2(thermoCLK2, thermoCS2, thermoDO2);
void setup() {
  Serial.begin(9600);

  Serial.println("MAX6675 test");
  // wait for MAX chip to stabilize
  delay(500);
}

void loop () {
  
   Serial.print("Temp_1 = "); 
   Serial.print(thermocouple.readCelsius());
   Serial.print("      ");
   delay(1000);
   Serial.print("Temp_2 = "); 
   Serial.print(thermocouple2.readCelsius());
   Serial.println("      ");
   delay(5000);   
}

Mais le résultat ce n'été pas ce que je voulais, Temp_1 s'affiche chaque 6 secondes au lieu de chaque seconde (parce que le delay (5000) de Temp_2 s'ajoute au delay (1000) de Temp_1, du coup cette dernière ne s'affiche pas chaque seconde).

Pourriez-vous m'expliquer comment faire ?

Merci d'avance

Bonjour,
Regarde du côté de "blink without delay"

Bonjour.
Si vous ne voulez pas vous compliquer la vie avec des millis, (un jour vous devrez le faire). Je suppose que ce que vous vouliez faire est quelque chose comme ce qui suit :

void loop () {
  for (int x = 0; x < 5; x++) {
    Serial.print("Lecture-");
    Serial.println(x);
    Serial.print("Temp_1 = ");
    Serial.print(thermocouple.readCelsius());
    Serial.println(" Celsius");
    delay(835);
  }
  Serial.print("Temp_2 = ");
  Serial.print(thermocouple2.readCelsius()); 
  Serial.println(" Celsius");
  delay (835);
}

Salutations.

1 Like

Pas tout à fait. La 6ème seconde @athcerr veut lire temp1 ET temp2.
Mais utiliser millis() rendrait la chose plus facile à maintenir et/ou faire évoluer.

Alors il suffit de faire

void loop () {
  Serial.print("Temp_2 = ");
  Serial.print(thermocouple2.readCelsius()); 
  Serial.println(" Celsius");

  for (int x = 0; x < 5; x++) {
    Serial.print("Lecture-");
    Serial.println(x);
    Serial.print("Temp_1 = ");
    Serial.print(thermocouple.readCelsius());
    Serial.println(" Celsius");
    delay(835);
  }
}
1 Like

Oui, pour le moniteur série, il est préférable de traiter le thermocouple2 de cette façon.
Regards.

Bonjour athcerr

Je plussoie, ça évite des "bricolages", l'utilisation de millis() est plus élégante.
Un petit exemple pour tes mesures:

unsigned long mesureTempoMsec = 1000;     // Tempo de 1 seconde
unsigned long mesureTemposMillis = millis();     // Tempo chrono
const int  mesurePeriodeTempos = 5;      //Toutes les 5 secondes
int  mesureTempos = 0;      //Compteur de tempos

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

void loop() 
{
	if (millis()-mesureTemposMillis >= mesureTempoMsec)
	{
		Serial.print(F("Mesure temperature 1\t"));
		
		mesureTempos ++;
		if (mesureTempos == mesurePeriodeTempos)
		{
			Serial.print(F("Mesure temperature 2"));
			mesureTempos = 0;
		}
		Serial.println("");
		
		mesureTemposMillis = millis();
	}
}

Cordialement
jpbbricole

Une imprécision de millis() ou de micros() est inacceptable. S'il n'est pas possible d'utiliser des délais, il est préférable de mettre le MCU en veille et d'économiser un peu d'énergie. :speech_balloon:

#include <LowPower.h>

const int  mesurePeriodeTempos = 5;      //Toutes les 5 secondes
int  mesureTempos = 0;      //Compteur de tempos

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

void loop() {
  LowPower.powerDown(SLEEP_1S , ADC_ON, BOD_ON);
  Serial.print(F("Mesure temperature 1\t"));
  mesureTempos ++;
  if (mesureTempos == mesurePeriodeTempos) {
    Serial.print(F("Mesure temperature 2"));
    mesureTempos = 0;
  }
  Serial.println("");
  Serial.flush();
}

Regards.

Les deux derniers posts s'écartent beaucoup de la demande. Sauf si @athcerr a demandé de ne pas utiliser delay(), mais je ne crois pas l'avoir vu.

Bonjour gonpezzi
Je n'ai pas compris pourquoi une imprécision de millis() ou micros() peut être gênante quand on travail avec 1 et 5 seconde(s)?
Le fait d'utiliser LowPower a le même effet qu'utiliser delay() pour temporiser, on ne peut rien faire d'autre?

Cordialement
jpbbricole

Bonsoir vileroi

Je ne l'ai pas vu non plus, mais quand à dire que l'on s'écarte beaucoup, on a vu pire sur ce forum!

Ces 2 postes restent dans la droite ligne de la question, la suppression de delay(), remplacé par millis() est la façon la plus "propre" de résoudre son problème. Il est tout à fait de bon aloi que de faire remarquer l'avantage de cette "technique" à @athcerr.

Cordialement
jpbbricole

Merci à tous pour vos réponses

J'ai essayé toutes les méthodes proposées elles marchent bien sauf pour LowPower (une nouvelle information pour moi), ca a compilé mais lorsque je voulais simuler sur isis proteus, rien ne s'affiche sur le virtual terminal, voici le code que j'ai compilé:

#include <LowPower.h>
#include "max6675.h"

int thermoDO = 4;
int thermoCS = 5;
int thermoCLK = 6;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
int thermoDO2 = 7;
int thermoCS2 = 9;
int thermoCLK2 = 8;
MAX6675 thermocouple2(thermoCLK2, thermoCS2, thermoDO2);
const int  mesurePeriodeTempos = 5;      //Toutes les 5 secondes
int  mesureTempos = 0;      //Compteur de tempos

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

void loop() {
  LowPower.powerDown(SLEEP_1S , ADC_ON, BOD_ON);
  Serial.print(F("Mesure temperature 1\t"));
     Serial.print(thermocouple.readCelsius());
  mesureTempos ++;
  if (mesureTempos == mesurePeriodeTempos) {
    Serial.print(F("Mesure temperature 2"));
    Serial.print(thermocouple2.readCelsius());
    mesureTempos = 0;
  }
  Serial.println("");
  Serial.flush();
}

sinon les autres méthodes marche bien (j'ai le choix :grin: :laughing:)

C'est vrai je l'ai pas demandé, et ça m'est égal de l'utiliser ou pas l'essentiel que l'objectif est atteint (avoir deux fréquences d'affichage différentes), mais des informations de plus ne font de mal à personne :sweat_smile:.

Merci encore à vous.

Il doit y avoir une certaine incompatibilité des bibliothèques avec l'isis proteus. Je viens de télécharger votre code et cela fonctionne bien sur un UNO.
Salutations.

Ok, c'est possible, je vais travailler avec le code millis().

Merci à vous.