Besoin d'aide sur une question de programmation

Bonjour à toutes et à tous,
Je travaille actuellement sur un projet faisant appel à une carte Arduino, ce qui m'a amené à découvrir la programmation. Malheureusement mon premier programme ne fait pas ce que j'aimerais qu'il fasse, j'espère donc qu'en m'adressant à vous je réussirai à résoudre le problème. Pour vous aider à mieux comprendre le but du programme voilà une petite explication en français:

Composants: Un switch, trois boutons-poussoirs A,B,C, une électrovanne

Si le micro switch est en position enfoncée, quoi qu'il arrive, le microprocesseur ordonne à l'électrovanne de s'ouvrir et de l'eau coule.
Si un bouton poussoir (détection A, B ou C) est en position enfoncée au moment où le micro switch est enfoncé aussi, le microprocesseur ordonne à l'électrovanne de s'ouvrir et doit compter le temps pendant lequel l'eau coule. Une fois ce temps déterminé, le microprocesseur peut définir la quantité d'eau qui a été versée grâce à un calcul de débit qu'il est capable de réaliser. Finalement l'information du volume d'eau servi est envoyée à l'ordinateur, relié à la carte Arduino.

Voilà le programme que j'ai rédigé, mais qui ne fonctionne pas:

unsigned long debut_A = 0;
unsigned long debut_B = 0;
unsigned long debut_C = 0;

unsigned long temps_A = 0;
unsigned long temps_B = 0;
unsigned long temps_C = 0;

int volume_A = 0;
int volume_B = 0;
int volume_C = 0;
int volume_total_A = 0;
int volume_total_B = 0;
int volume_total_C = 0;

const int switch_tlm = 0; //<-- Interrupteur général sur la Pin 0
const int switchA = 1; //<-- Interrupteur A sur la Pin 1
const int switchB = 2; //<-- Interrupteur B sur la Pin 2
const int switchC = 3; //<-- Interrupteur C sur la Pin 3
const int vanne = 4;  //<-- Vanne sur la Pin 4


void setup ()
{
	Serial.begin(9600); //<-- Lancement de l'intéraction entre l'Arduino et le PC à 9600 Bits par Secondes
 	pinMode(switch_tlm, INPUT);
 	pinMode(switchA, INPUT);
 	pinMode(switchB, INPUT);
 	pinMode(switchC, INPUT);
 	pinMode(vanne, OUTPUT);
}


void loop ()
{

 	while(digitalRead(switch_tlm == 1))
	{
   		digitalWrite(vanne, HIGH); //<-- On ouvre la vanne quoi qu'il arrive

   		if(digitalRead(switchA == 1))
   		{
   			debut_A = millis(); //<-- Si A est pressé on lance le Timer
   			while (digitalRead(switchA == 1))
   				{/*Tant que A est pressé...*/}

   			temps_A = ((millis() - debut_A) / 1000); //<-- A n'est plus pressé, on fait les calculs, et on repasse le temps en Secondes
   			Serial.print("Temps de remplissage: ");
 			  Serial.println(temps_A);
 			  Serial.print("Volume servi: ");
 		 	  volume_A = temps_A*3.33;
 			  Serial.println(volume_A);
			  volume_total_A = volume_total_A + volume_A; //<-- Volume total de la personne A
  			Serial.print("Volume total A: ");
  			Serial.println(volume_total_A);
  			temps_A = debut_A = 0; //<-- Remise à 0 des variables Temps
   		}


   		if(digitalRead(switchB == 1))
   		{
   			debut_B = millis(); //<-- Si B est pressé on lance le Timer
   			while (digitalRead(switchB == 1))
   				{/*Tant que B est pressé...*/}

   			temps_B = ((millis() - debut_B) / 1000); //<-- B n'est plus pressé, on fait les calculs, et on repasse le temps en Secondes
   			Serial.print("Temps de remplissage: ");
 			Serial.println(temps_B);
 			Serial.print("Volume servi: ");
        		volume_B = temps_B*3.33;
 			Serial.println(volume_B);
			volume_total_B = volume_total_B + volume_B; //<-- Volume total de la personne B
  			Serial.print("Volume total B: ");
  			Serial.println(volume_total_B);
  			temps_B = debut_B = 0; //<-- Remise à 0 des variables Temps
   		}


      		if(digitalRead(switchC == 1))
      		{
        		debut_C = millis(); //<-- Si C est pressé on lance le Timer
       			 while (digitalRead(switchC == 1))
          			{/*Tant que C est pressé...*/}

        		temps_C = ((millis() - debut_C) / 1000); //<-- A n'est plus pressé, on fait les calculs, et on repasse le temps en Secondes
        		Serial.print("Temps de remplissage: ");
        		Serial.println(temps_C);
        		Serial.print("Volume servi: ");
        		volume_C = temps_C*3.33;
        		Serial.println(volume_C);
        		volume_total_C = volume_total_C + volume_C; //<-- Volume total de la personne C
        		Serial.print("Volume total C: ");
        		Serial.println(volume_total_C);
       			temps_C = debut_C = 0; //<-- Remise à 0 des variables Temps
      }
 	}

 	digitalWrite(vanne, LOW); //<-- Fermeture de la Vanne si le switch_tlm n'est plus pressé
}

Voilà, j'espère que vous allez pouvoir m'aider car je ne vois vraiment pas pourquoi ça ne marche pas. La compilation et le téléversement se font sans problème, cependant le programme ne fait absolument rien de ce que je lui demande.

Bonsoir,
Qu'est-ce qu'il fait et qu'est-ce qu'il ne fait pas ?

Le remise à zéro du temps sert à quoi puisqu'elle est initialisée par millis en début de while ?

Les variables sont elles dimensionnées correctement ? Quel est l'ordre de grandeur des durées d'appui sur les inters ?

Voilà le programme que j'ai rédigé, mais qui ne fonctionne pas

On ne peut pas dire que tu donnes beaucoup de détails sur ce qui ne fonctionne pas.

Maintenant, il y a ça:

const int switch_tlm = 0; //<-- Interrupteur général sur la Pin 0
const int switchA = 1; //<-- Interrupteur A sur la Pin 1

Le problème peut venir de là. Les broches 0 et 1 sont utilisées par la liaisons série pour la communication. Il faudrait en choisir d'autres pour ces interrupteurs.

Bonjours, alors voilà ce qu'il se passe lorsque je lance le programme:

  • la LED simulant l'électrovanne est allumée alors qu'elle devrait être éteinte puisque je n'appuie pas sur le switch.
  • le moniteur PC ne m'envoie rien, sinon une suite infinie avec marquée Temps A: ; Volume A ; ... ; sans indication sur les variables
  • lorsque je presse les switchs dans n'importe quelle combinaison il ne se passe rien.

J'ai vérifié il ne s'agit pas d'un problème hardware à mon avis.
Sinon je pense que le dimensionnement des variables est correct, mais si tu as une astuce pour le vérifier volontiers ! Le temps de pression est de l'ordre de la seconde (4s max).
Pour les broches, je vais essayer ce que tu m'as conseillé et je te dis tout ça.

En tout cas merci de m'aider et bonne soirée :slight_smile:

Hormis les pins utilisées par le port série je ne vois pas ce qui cloche
Par contre le calcul du volume tu devrais faire une fonction plutôt qu'un copier colle
C'est plus lisible et en cas de changement plus simple et tu économisera de la place mémoire

Sinon je vois aussi qu'en relâchant le bouton principal ça n'arrêtera pas l'eau tant qu'un autre bouton est pressé.
Mais c'est peut être voulu ?

Euh non ce n'est pas voulu et c'est peut-être ça le problème... Par contre je ne vois pas ce dont tu parles, est-ce que tu pourrais m'aider à le corriger stp ? :slight_smile:
Merci

En fait ca doit marcher mais c'est juste que la manip a faire ne semble pas être celle décrite.
Voici ce que je lis dans le code:

Je presse le bouton principal.
Ca ouvre la vanne.
Je presse A ca commence à compter pour ce "canal".
Tant que A reste appuyé tu peux lâcher le principal tu est dans une boucle :

while (digitalRead(switchA == 1))
{/*Tant que A est pressé...*/}

Comme tu le dis toi même : tant que A est pressé tu attends.
Tu laches A à ce moment tu fais ton calcul + Serial.print... puis la vanne se ferme.

Maintenant là dedans il n'y a rien qui cloche en soit si ce comportement te convient.

Sinon il faut remplacer le while par :

while (digitalRead(switch_tlm == 1))
{/*Tant que le principal est pressé...*/}

Pour le problème de la vanne tu as essayé d'intervertir les pins ?

const int switch_tlm = 2;
const int switchA = 3;
const int switchB = 4;
const int switchC = 5;
const int vanne = 6;

Bonjour, j'ai fait ce que tu m'as dit (le while et les pins), mais le problème persiste... La LED qui simulent la présence de l'électrovanne est allumée en permanence lorsque je la branche sur le pin correspondant et l'ouverture ou la fermeture des interrupteurs n'influe en rien.

Tu as bien libéré les entrées 0 et 1?
La liaison série fonctionne-t-elle maintenant?

Le problème peut être électrique. Tu as bien des résistances de tirage à la masse sur tes entrées switch et poussoir?

Bonjour,

Marsthor pourrais-tu nous faire un schéma de ton installation est des différents connections afin que l'on puisse t'aider plus facilement ?

Bonjour,

Il y a une erreur vicieuse qui traine. Voici le code initial

const int switchA = 1;
...
while (digitalRead(switchA == 1))
{/*Tant que A est pressé...*/}

L'expression (switchA == 1) vaut 1 si switchA vaut 1 ce qui est le cas dans tes premier tests.

while (digitalRead(switchA == 1)) se résume donc à while (digitalRead(1)) qui est une boucle
qui lit bien la pin 1 et qui boucle tant que celle-ci est à HIGH.

Tu aurais du écrire ainsi:

while (digitalRead(switchA) == 1)
{/*Tant que A est pressé...*/}