While farouche

Bonjour,

je suis sur un projet d’ouverture et fermeture de porte selon une contrainte de température. J’ai cherché à intégrer des fin de courses au pilotage du moteur. Pour éviter de soumettre au moteur une mise sous tension inutile dans la boucle j’ai mis une boucle while avec pour condition la variable de température. Tout fonctionne très bien au début puis après 3, 4 usages de boutons le while ne se lance plus ?! Parfois la variable de température passe du simple au double ?!

Une idée pour stabiliser ça ?

Pour faire avec ce que j’ai sous la main voici mon matériel :

  • Arduino Uno (Rev3)
  • L293D
  • DC Motor
  • résistance 10kΩ
  • Momentary Switch
  • TMP36

Câblé comme suit :

Codé de cette façon :

//constentes pour la sonde de température
const int sensorPin = A0;
//pilotage du sens du moteur
const int controlpin1 = 2;
const int controlpin2 = 4;
const int speedpin1 = 3;
//fins de courses
const int arrethaut = 5;
const int arretbas = 6;

//Variables d'état
int etatarrethaut = 0;
int etatarretbas = 0;
int sonde = 0;
int sonde2 = 0;
int temperature = 0;
int voltage = 0;
int temp = 0;

//fonctions

void ouvre() {

  Serial.println("Ouvre");
  digitalWrite(controlpin1, LOW);
  digitalWrite(speedpin1, HIGH);
  digitalWrite(controlpin2, HIGH);
  while (1 != (digitalRead (arrethaut))) /* NULL */;
  arret();

}

void ferme() {

  Serial.println("Ferme");
  digitalWrite(controlpin1, HIGH);
  digitalWrite(speedpin1, HIGH);
  digitalWrite(controlpin2, LOW);
  while (1 != (digitalRead (arretbas))) /* NULL */;
  arret();
}
void arret() {
  Serial.println("Arret");
  digitalWrite(controlpin1, LOW);
  digitalWrite(speedpin1, LOW);
  digitalWrite(controlpin2, LOW);
}

void setup() {
  // ouvre le porte serie pour afficher les valeurs
  Serial.begin(9600);
  // declaration des broches entrées et sorties
  pinMode(controlpin1, OUTPUT);
  pinMode(controlpin2, OUTPUT);
  pinMode(speedpin1, OUTPUT);
  pinMode(arrethaut, INPUT_PULLUP);
  pinMode(arretbas, INPUT_PULLUP);
}

void loop() {
  // put your main code here, to run repeatedly:
  etatarrethaut =
    digitalRead(arrethaut);
  Serial.print("Fin de course haut : ");
  Serial.print(etatarrethaut);
  etatarretbas =
    digitalRead(arretbas);
  Serial.print(" - Fin de course bas : ");
  Serial.print(etatarretbas);

  sonde = analogRead(sensorPin);
  float voltage = (sonde / 1024.0) * 5.0;
  Serial.print(" - Température : ");
  float temperature = (voltage - .5) * 100;
  Serial.println(temperature);

  if (temperature > 40) {
    ouvre();
    while (temp > 40) {  //je maintien l'arret tant que la température est supérieure
      arret();
      sonde2 = analogRead(sensorPin);
      float voltage = (sonde2 / 1024.0) * 5.0;
      Serial.print(" - Température : ");
      temp = (voltage - .5) * 100;
      Serial.println(temp);
      delay (5000);
    }
    
  }
  else if (temperature < 40)  {
    ferme();
    while (temp < 40) {
      arret();
      sonde2 = analogRead(sensorPin);
      float voltage = (sonde2 / 1024.0) * 5.0;
      Serial.print(" - Température : ");
      temp = (voltage - .5) * 100;
      Serial.println(temp);
      delay (5000);
    }
  }


delay (5000);

}

Merci pour vos lumières

serre.ino (2.39 KB)

Bonsoir

Si l'on en croit l'image en couleur le câblage des boutons poussoirs est lui aussi 'farouche' (entre +5V et +9V ??)
Pas certain que le microcontrolleur supporte longtemps 9V sur un de ses ports d'entrée/sortie.....

Où est initialisé temp avant d’aborder le while dans

if (temperature > 40) {
    ouvre();
    while (temp > 40) { // <=== COMBIEN VAUT TEMP?

Bonjour,

merci pour vos réponses.

al1fch:
Bonsoir

Si l’on en croit l’image en couleur le câblage des boutons poussoirs est lui aussi ‘farouche’ (entre +5V et +9V ??)
Pas certain que le microcontrolleur supporte longtemps 9V sur un de ses ports d’entrée/sortie…

Oui effectivement mais l’erreur n’est que sur le schéma, je vais le corriger rapidement.

J-M-L:
Où est initialisé temp avant d’aborder le while dans

if (temperature > 40) {

ouvre();
   while (temp > 40) { // <=== COMBIEN VAUT TEMP?

temp est initialisée en début de code et à bien la bonne valeur.

J’ai refait des tests ce matin et c’est toujours pareil … J’avoue ne pas comprendre.

AnTeBiOs:
temp est initialisée en début de code et à bien la bonne valeur.

euh.... vous pouvez préciser ce que vous appelez la bonne valeur?
moi je ne vois que l'initialization de la variable globale

int temp = 0;

... sinon la prochaine fois que vous la mettez à jour c'est dans la boucle while elle même...

      temp = (voltage - .5) * 100;

mais ça ne nous dit pas combien elle vaut vraiment à l'entrée de la boucle (la première évaluation du while --> ce sera la dernière valeur connue. 0 au début, celle de la boucle d'avant sinon)

à mon avis un petit temp = temperature;avant le while ne ferait pas de mal...

Salut ,

pour y voir plus clair , j ’ ai l ’ habitude d ’ ecrire tous les bouts de code qui se retrouve plusieurs fois dans le programme sous forme de fonction simple .

ca donne un truc comme en PJ .

je trouve que la formule pour calculer temperature n ’ est pas ecrite " proprement " a mon gout.

de plus je ne comprend pas pour quoi vous avez 2 variables de type sonde , une variable temperature et une variable temp .

test.ino (2.24 KB)

Merci pour ces éclairages.

J-M-L:
euh.... vous pouvez préciser ce que vous appelez la bonne valeur?
moi je ne vois que l'initialization de la variable globale

int temp = 0;

... sinon la prochaine fois que vous la mettez à jour c'est dans la boucle while elle même...

      temp = (voltage - .5) * 100;

mais ça ne nous dit pas combien elle vaut vraiment à l'entrée de la boucle (la première évaluation du while --> ce sera la dernière valeur connue. 0 au début, celle de la boucle d'avant sinon)

à mon avis un petit

temp = temperature;

avant le while ne ferait pas de mal...

J'ai placé un Serial.print dans la boucle pour pouvoir la vérifier. Je pense avoir trouvé le problème de la valeur de sonde qui passe du simple au double. Je pense à un faux contact quelque part. J'ai cablé la sonde vers l'extérieur plutot que la laisser sur le breadboard. ça à l'air d'être carrément plus stable.

Coté prog j'ai repris les fonctions écrites pas Iznobe que je remercie au passage pour tester et afficher la variable température. ça à l'air de bien fonctionner aussi.

iznobe:
Salut ,

pour y voir plus clair , j ' ai l ' habitude d ' ecrire tous les bouts de code qui se retrouve plusieurs fois dans le programme sous forme de fonction simple .

J'essaie aussi tant que faire ce peu à réduire les reccurences en fonctions, mais je le fais après coup quand tout fonctionne. J'ai la facheuse habitude de me perdre dans les tests en tout sens quand ça ne fonctionne pas et j'épure par la suite.

iznobe:
je trouve que la formule pour calculer temperature n ' est pas ecrite " proprement " a mon gout.

c'est celle du bouquin :slight_smile: :slight_smile:

iznobe:
de plus je ne comprend pas pour quoi vous avez 2 variables de type sonde , une variable temperature et une variable temp .

J'ai enlevé tout ce qui ne servait à rien. A force de tests je me retrouve souvent avec des résidus ...

En tous cas merci beaucoup ça fonctionne clairement mieux.

Bonne journée à tous

AnTeBiOs:
J'ai placé un Serial.print dans la boucle pour pouvoir la vérifier.

le souci n'est pas dans la boucle mais à l'entrée de la boucle...

AnTeBiOs:
En tous cas merci beaucoup ça fonctionne clairement mieux.

je n ’ ai pas tester voir si le code fonctionnait , il doit certainement y avoir des erreurs car j ’ ai juste repris votre code de base , et eclairci en transformant certains morceaux en fonction .

j ’ ai fait ca a main levé en vitesse si ca marche tant mieux , mais ca serait etonnant , je sais juste que ca compile …

si ca t ’ a aider tant mieux , c ’ est le but .

if (temperature > 40) {
    ouvre();
    while (temp > 40) { // <=== COMBIEN VAUT TEMP?

d ’ apres le code d ’ origine , il est toujours egal a zero :stuck_out_tongue: ( au premier passage de la boucle )

il serait interressant pour vous , que vous compreniez d’ ou vient l ’ erreur dans votre programme , comme le fait remarquer @J-M-L !

( je suis etonné que ce que j ’ ai mis marche … )

J-M-L:
le souci n'est pas dans la boucle mais à l'entrée de la boucle...

Au début mon while faisait appel à la variable température, comme ça :

 if (temperature > 40) {
    ouvre();
    while (temperature > 40) {  //je maintien l'arret tant que la temp est supérieure 
      arret();
      sonde = analogRead(sensorPin);
      float voltage = (sonde2 / 1024.0) * 5.0;
      Serial.print(" - Température : ");
      temperature = (voltage - .5) * 100;
      Serial.println(temperature);
      delay (5000);
    }
    
  }

C'est là que sont apparus les problèmes. De tous les prints que j'ai ajoutés la valeur renvoyée semblait correcte. Mais le while ne tournait que deux, trois fois puis fini... En regardant mon code à nouveau je comprends pourquoi le temp commençait à 0 dans le while. Mais comme avant avec la variable temperature à jour en entrée de boucle ça aurait fonctionner.

J-M-L:
à mon avis un petit temp = temperature;avant le while ne ferait pas de mal...

J'ai bien capté, merci :slight_smile:

iznobe:
( je suis etonné que ce que j ' ai mis marche ... )

Virtuose ?

Encore merci :smiley:

AnTeBiOs:
Au début mon while faisait appel à la variable température, comme ça :

 if (temperature > 40) {

ouvre();
    while (temperature > 40) {...

Mouais.. et nous on est censé deviner le code d'avant ? :wink:
(c'était mieux avant !)