Pages: [1]   Go Down
Author Topic: Besoin d'aide sur une question de programmation  (Read 1251 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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.
Logged

Moselle
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

BTS F2 en 94. Like électronique audio et tube, Programmation Basic, Pascal, C, Assembleur, un peu de html/php/mysql. Tout Linux.

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3547
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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:
Code:
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.
« Last Edit: March 17, 2013, 03:43:49 pm by fdufnews » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ? smiley
Merci
Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :
Code:
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 :
Code:
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; 
 
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3547
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Il y a une erreur vicieuse qui traine. Voici le code initial
Code:
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:

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

Logged

Pages: [1]   Go Up
Jump to: