[Résolu] Stérilisateur à conserve, probleme changement d'état temperature

Bonjour à tous,

Explication du projet : je veut commander un stérilisateur par arduino, c’est à dire que je veut couper l’alimentation electrique du strérilisateur, quand la température à atteint au moins 90°C et que 2 heures ou 3 heures se sont ecouler depuis le debut de l’ebulition de l’eau. la selection du mode 2 heures ou 3 heures se fait par un interupteur. Une fois l’alimenttion du stérilisateur coupé, une led et une alarme m’informe de la fin de cuisson.

Voici mon code :

int capteur = 0;
unsigned long Tviande = 10800000; //Temps de cuisson viande
unsigned long Tlegumes = 7200000; //Temps de cuisson légumes
unsigned long Tcuisson = 0; //Temps de cuisson
unsigned long Tebulition = 0; //Temps a partir du quel l'eau est à ebulition


void setup() 

{

  pinMode(3,OUTPUT); //Relai alimentation stérilisateur
  digitalWrite(3,HIGH); //Allume le stérilisateur
  pinMode(4,INPUT); //Bouton selectionV_L (Viande_Légumes)
  pinMode(5,OUTPUT); //Diode et alarme fin de cuisson
  pinMode(7,OUTPUT); //Diode viande
  pinMode(8,OUTPUT); //Diode légumes
  pinMode(0,INPUT); //Capteur température d'eau

}

void loop() 

{

  unsigned long datecourante = millis();
  int selectionV_L = digitalRead(4); //Lire la position du bouton Viand_Légumes
  
      if(selectionV_L = HIGH) //Si le bouton sélection V_L est passant
          { Tcuisson = Tviande; //Alors le temps de cuisson est selui de la viande
             digitalWrite(7,HIGH); //La del Viandes est allumée
             digitalWrite(8,LOW); } //Et la del légumes est éteinte

   else if(selectionV_L = LOW) //Si le bouton de sélection V_L est non passant
         { Tcuisson = Tlegumes; //Alors le temps de cuisson est celui des légumes
            digitalWrite(7,LOW); //La del viandes est éteinte
            digitalWrite(8,HIGH); } //Et la del légumes est allumer
 
  int valcapt = analogRead(capteur); //valcapt (valeur capteur), est egal à la lecture analogique de la broche 0
  float voltage = valcapt*5.0/1024.0;
  float temperature = (voltage-0.5)*100; //Convertion de la tention du capteur en °C

  if(temperature > 90)
    {{ unsigned long Tebulition = datecourante; }

  if (millis() == Tebulition + Tcuisson) /*Si le temps est egal à T_ebulition + T_cuisson*/
    { digitalWrite(3,LOW); //Aors l'alimentation du sterilisateur s'interompt
      digitalWrite(5,HIGH); } //.Et la del de fin de cuisson s'allume

}}

Tout fonctionne bien sauf le plus important, la ligne :

if(temperature > 90)
    {{ unsigned long Tebulition = datecourante; }

Je pense qu le probleme viens du fait que “unsigned long Tebulition” se decale a chaque fois que void loop fait un tour, il faudrait donc faire en sorte que se soit le passage de 90°C qui fasse enregistrer le temps, au lieu du fait que se soit superieur à 90°c. J’ai regarder un tuto sur le site locoduino.org mais je ne comprend pas tout.

Si qu’elqu’un peut m’aider, je suis evidament preneur, merci d’avoir lu et désoler si ce n’est pas claire.

J’ai fait un shema sur tinkercad si vous en avez besoin ou si ça interaisse quelqu’un.

Il est probable que ton problème soit lié à la "portée des variables".

Tu crées une variable globale ici

unsigned long Tebulition = 0; //Temps a partir du quel l'eau est à ebulition

Et dans ton code tu crées un bloc dans lequel tu crées une nouvelle variable du même nom

{ unsigned long Tebulition = datecourante; }

Cette nouvelle variable n'existe que dans ce bloc ! Donc sa valeur (datecourante) n'est pas conservée en dehors du bloc.

Essaye simplement de changer cette ligne par

{ Tebulition = datecourante; }

Je n'ai pas lu le reste du code, mais ceci est déjà un problème.

hello
dans un premier temps:
déclares :
boolean top_chrono = false;
unsigned long Tebulition = 0;

puis corriges:
pinMode(0,INPUT); //Capteur température d'eau

par pinMode(A0,INPUT); //Capteur température d'eau

puis modifies:ton contrôle de température par :

if(temperature > 90)
    {
      if(top_chrono==false)
      {Tebulition = millis();top_chrono=true; }

  if (millis() - Tebulition >= Tcuisson) /*Si le temps passé> T_cuisson*/
    { digitalWrite(3,LOW); //Aors l'alimentation du sterilisateur s'interompt
      digitalWrite(5,HIGH); } //.Et la del de fin de cuisson s'allume
}

Ca fonctionne, merci beaucoup dfgh,

Juste une precision ? : pour le "A" de "pinMode(A0,INPUT)" , je doit metre un "A" parce-que c'est un capteur branché sur une broche analogique, ou juste parce-que c'est une broche analogique ?

Pour le reste, je vais étudier ça tranquillement :slight_smile:

Merci lesept pour ta participation, j'essayerais egalement ta solution juste par curiosité :slight_smile:

Pas besoin, elle est incluse dans la solution de dfgh… plus complète

D'accord, merci beaucoup :slight_smile:

Et juste pour comprendre,( mis à par le "==" remplacer par ">=") est-ce nécessaire de remplacer :

  if (millis() == Tebulition + Tcuisson) /*Si le temps est egal à T_ebulition + T_cuisson*/

par :

 if (millis() - Tebulition >= Tcuisson) /*Si le temps passé> T_cuisson*/

ou bien le résultat est similaire ?

La seconde version est nécessaire.
Si tu rates la bonne valeur exacte de millis() (parce que ton prog a un peu attendu autre chose), la 1ère formule ne marche plus.La seconde si.

biggil:
La seconde version est nécessaire.
Si tu rates la bonne valeur exacte de millis() (parce que ton prog a un peu attendu autre chose), la 1ère formule ne marche plus.La seconde si.

je dirais même qu'elle est indispensable :

imagine que lors du déroulement de ton programme il se passe tellement de temps pendant une boucle ( loop() ) que la valeur de millis() ne corresponde plus exactement à ta valeur de comparaison ?

lorsque tu la testes à la valeur à comparer elle peut l'avoir dépassé et n'en sera donc plus "égale", elle sera supérieure et donc l'égalité ne sera plus vraie : résultat, tu ne sauras pas que tu as "passé" la valeur que tu attendais, or c'est le dépassement qui conditionne l'action à effectuer.

c'est vrai, dans ton esprit c'est l'égalité des temps qui doit provoquer les actions, mais dans la vraie vie, comme il est impossible d'être parfaitement synchronisé, il faut surveiller le dépassement du temps surveillé pour agir.

Merci cinq cylindre,

mais ce que je voulais dire c'est : mis part le (==) remplacer par (>=), le reste peut il etre conserver ?

donc remplacer ça :

if (millis() >= Tebulition + Tcuisson)

Par ça :

if (millis() - Tebulition >= Tcuisson)

Merci

bonsoir,

comme écrit précédemment (notamment par biggil avant moi) il faut tester le dépassement, et ça tu l'as bien compris.

pour ta dernière question, il ne s'agit que d'une simple équation : le passage d'un terme d'un côté à l'autre du signe d'égalité (ou inégalité, ou autre) s'accompagne d'un changement de signe dans le cas d'une addition/soustraction, donc oui, le résultat est le même.

le plus important à retenir est la notion de "dépassement" de la valeur, car l'exactitude de celle-ci lors du test n'est jamais certaine : quand tu fais cuire des œufs, tu attends que le temps nécessaire soit dépassé, et non "parfaitement égal" car tu ne peux pas surveiller ta montre en permanence puisque tu dois en même temps (par exemple) vérifier la cuisson des pâtes, mais pas suivant une durée, plutôt en fonction de leur "mollesse".
comme tu le constates, dans un cas tu surveilles un temps, dans l'autre un état, et les deux ne peuvent l'être simultanément avec un système séquentiel comme un microcontrôleur, il peut donc y avoir dépassement de la valeur surveillée.

pour finir, dans l'absolu au niveau écriture du code, il serait plus prudent, pour "aider" le compilateur, de bien encadrer les différents termes de ton test :

if ( ( millis() - Tebulition ) >= Tcuisson)...

(je n'utilise pas les balises-code exprès, la couleur ne passe pas)

d’accord, c’est limpide :slight_smile: merci beaucoup