Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

[ARDUINO ∞] Vérification de programme.



  1. #1
    Linke741

    [ARDUINO ∞] Vérification de programme.


    ------

    Bonsoir,

    Je me suis lancé dans mon premier programme Arduino et j'aurai besoin de votre avis sur ce que j'ai fait.

    J'ai un petit problème lorsque j’appuie sur le bouton, la LED clignote bien 2 fois mais la suite de l'algorithme ne s'enchaine pas ??
    Je sais pas si c'est du a mon montage ou pas mais en tout cas je voudrai déjà savoir si le code est "potable".
    Merci d'avance.

    Code:
    #define HOOK 1     // pin HOOK
    #define REDIAL 2   // pin REDIAL
    #define BUTTON 3  // pin du BUTTON
    #define LED 4        // pin de la LED 
    
    int val_1 = 0;
    int val_2 = 0;
    int compteur_1 = 0;
    int compteur_2 = 0;
    
    void setup()
    {
      pinMode(1, OUTPUT);  // patte HOOK en sortie
      pinMode(2, OUTPUT);  // patte REDIAL en sortie
      pinMode(3, INPUT);     // patte BUTTON en entrée  
      pinMode(4, OUTPUT);  // patte LED en sortie
    }   
    
    void loop()
    {
      val_1 = digitalRead(BUTTON);  // lit et sauve l'entrée
      if(val_1 == LOW)
      {
        delay(1000);    
        for(int compteur_1 = 0; compteur_1 < 2; compteur_1 ++) 
        {    
          digitalWrite(LED, HIGH);  // allume la LED
          delay (200);
          digitalWrite(LED, LOW);  // éteint la LED
          delay(200);
        }
       }      
      if(compteur_1 == 1)
      {
        delay(1000);
        for(int compteur_2 = 0; compteur_2 < 45; compteur_2 ++)
        {
          // premier appel
          digitalWrite(HOOK, HIGH);
          delay(1000);
          digitalWrite(REDIAL, HIGH);
          delay(200);
          digitalWrite(REDIAL, LOW);
          delay(10000);  // temps premier appel
          digitalWrite(HOOK, LOW);
          delay(2000);
          // deuxième appel
          digitalWrite(HOOK, HIGH);
          delay(1000);
          digitalWrite(REDIAL, HIGH);
          delay(200);
          digitalWrite(REDIAL, LOW);
          delay(10000);  // temps deuxième appel
          digitalWrite(HOOK, LOW);
          delay(2000);
        }
      }  
      if(compteur_2 == 44)
      {
        do
        {      
          digitalWrite(LED, HIGH);
          val_2 = digitalRead(BUTTON);
        }while(val_2 == LOW);
      }
    }

    -----

  2. Publicité
  3. #2
    Jack
    Modérateur

    Re : [ARDUINO ∞] Vérification de programme.

    A quoi sert
    if(compteur_1 == 1)
    vu qu'à ce stade, compteur_1 est forcément égal à 1?

    Pour la suite, comment veux-tu que l'on avance quelque hypothèse puisqu'on ne connait rien de la finalité du programme?
    C'est un contrôle de modem? Quel est son mode de fonctionnement?
    Dernière modification par Jack ; 12/01/2014 à 23h26.

  4. #3
    Linke741

    Re : [ARDUINO ∞] Vérification de programme.

    C'est pour faire clignoter la Led deux fois.

  5. #4
    bisou10

    Re : [ARDUINO ∞] Vérification de programme.

    Comme Jack: les tests Compteur_1 == 1 et Compteur_2 == 44 ne marchent sans doute pas.
    A toi de voir ce qu'il y aura dans ces variables après l'execution des for():
    - les variables ont elles la dernière valeur +1 ? la valeur 0 ?
    - les variables ont elles la dernière valeur du compteur ?
    - voire les variables sont elles désallouées ? vu que la déclaration leur donne une portée "bloc"...


  6. A voir en vidéo sur Futura
  7. #5
    Jack
    Modérateur

    Re : [ARDUINO ∞] Vérification de programme.

    Merci bisou10, ton intervention m'a permis de détecter une coquillle dans ma réponse précédente. lire:
    "vu qu'à ce stade, compteur_1 est forcément égal à 2"

    et pas à 1 bien sûr

  8. #6
    Linke741

    Re : [ARDUINO ∞] Vérification de programme.

    Dsl, j'ai compris le problème du if ...

    Donc j'explique plus en détaille, je dois lancer le programme qui consiste à automatiser un téléphone à l'aide d'un 4066 (microswitch)

    J'appuie sur un bouton poussoir 1R
    pour lancer le programme, une LED clignote 2 fois (visualisation pour dire que le programme va ce lancer.)
    Ensuite le câble (+) du RJ11 est relié au microswitch pour laisser passer ou non le courant (il permet de "simuler" l'appui de la touche "HOOK")
    Même chose pour le bouton "REDIALE" les deux pattes du bouton poussoir sont relié au microswitch (pareil, pour simuler son appui.)
    La partie appel se fait comme ça:

    Mètre la tonalité "activer hook"
    Activer la fonction "rediale" (pour composer le numéro enregistré)
    Mètre un délai en fonction du temps de l'appel (ce sera toujours le même temps)
    Puis désactiver la tonalité "hook"

    Cette partie est répétée 45 fois.

    Puis une fois terminé, une LED est allumée en continu et le programme ne se relance pas temps que je n'appuie pas sur le même bouton poussoir qu'au tout début.

    Dsl, si il y a des fautes de frappe ou autre je suis sur l'iPhone :/
    Dernière modification par Linke741 ; 13/01/2014 à 00h24.

  9. Publicité
  10. #7
    Jack
    Modérateur

    Re : [ARDUINO ∞] Vérification de programme.

    Tu ne dis pas ce qui ne fonctionne pas maintenant que tu as corrigé.
    Pour la suite, il est préférable que ce fil se retrouve dans le forum électronique. Je transfère donc le tout.

    En passant, je ne pense pas que le 4066 soit idéal: une ligne RTC, c'est une cinquantaine de volts continus et 90V alternatif pour la sonnerie. Un relais électromécanique ou statique (http://www.ixysic.com/home/pdfs.nsf/...ile/LCC110.pdf) est préférable.

  11. #8
    Linke741

    Re : [ARDUINO ∞] Vérification de programme.

    Re, je reviens avec quelques infos en plus.

    Bon j'ai fais quelques tests de mon code sur mon montage mais seulement à partir de certaine partie.

    Exemple:

    Code:
    void loop()
    {
       // premier appel
       digitalWrite(HOOK, HIGH);
       delay(1000);
       digitalWrite(REDIAL, HIGH);
       delay(200);
       digitalWrite(REDIAL, LOW);
       delay(10000);  // temps premier appel
       digitalWrite(HOOK, LOW);
       delay(2000);
       // deuxième appel
       digitalWrite(HOOK, HIGH);
       delay(1000);
       digitalWrite(REDIAL, HIGH);
       delay(200);
       digitalWrite(REDIAL, LOW);
       delay(10000);  // temps deuxième appel
       digitalWrite(HOOK, LOW);
       delay(2000);
    }
    J'ai testé juste avec cette partie de code et tout fonctionne nickel (j'utilise un TLP504A et ça passe super bien même sur une ligne DTF ).

    Donc verdict: bisou10 à raison le problème se passe surement au niveau de la variable compteur_1 (c'est doit être le même cas pour compteur_2); la boucle "for" se répète bien deux fois mais je crois que la variable "compteur_1" n'enregistre pas sa valeur finale (ici égale à 1).

    Donc si quelqu'un connait le moyen de faire "retenir" cette valeur à la variable ça serai cool !

    Merci pour votre aide !! J'avance doucement mais surement

  12. #9
    Jack
    Modérateur

    Re : [ARDUINO ∞] Vérification de programme.

    Donc verdict: bisou10 à raison le problème se passe surement au niveau de la variable compteur_1
    Si tu voulais me vexer, c'est gagné !

    mais je crois que la variable "compteur_1" n'enregistre pas sa valeur finale (ici égale à 1).
    C'est parce que tu n'as pas compris comment marche une boucle for: tu reboucles TANT QUE compteur_1 < 2.
    Donc tu sors DES QUE compteur_1 est >= 2, en l'occurrence compteur_1 = 2

    A+

  13. #10
    Linke741

    Re : [ARDUINO ∞] Vérification de programme.

    C'est bon j'ai trouvé !!

    En faite la variable "compteur_1 < 2" est seulement pris compte dans la boucle "for"; elle permet dire à quel moment il faut sortir de la boucle (Donc jusque là tu as raison ) mais la valeur n'est pas pris en compte pour la suite du programme...

    Donc là j'ai rajouté compteur_1 = 1 et ça MARCHE

    Voilà ce que ça donne:

    Code:
    void setup()
    {
      pinMode(5, OUTPUT);  // patte HOOK en sortie
      pinMode(2, OUTPUT);  // patte REDIAL en sortie
      pinMode(3, INPUT);   // patte BUTTON en entrée  
      pinMode(4, OUTPUT);  // patte LED en sortie
    }   
    
    void loop()
    {
      val_1 = digitalRead(BUTTON);  // lit et sauve l'entrée
      if(val_1 == LOW)
      {
        delay(1000);    
        for(int compteur_1 = 0; compteur_1 <= 1; compteur_1 ++) 
        {    
          digitalWrite(LED, HIGH);  // allume la LED
          delay (200);
          digitalWrite(LED, LOW);   // éteint la LED
          delay(200);
        }
       compteur_1 = 1; 
      }  
      
      if(compteur_1 == 1)
      {
        for(int compteur_2 = 0; compteur_2 < 45; compteur_2 ++)
        {
          // premier appel
          digitalWrite(HOOK, HIGH);
          delay(1000);
          digitalWrite(REDIAL, HIGH);
          delay(200);
          digitalWrite(REDIAL, LOW);
          delay(10000);  // temps premier appel
          digitalWrite(HOOK, LOW);
          delay(2000);
          // deuxième appel
          digitalWrite(HOOK, HIGH);
          delay(1000);
          digitalWrite(REDIAL, HIGH);
          delay(200);
          digitalWrite(REDIAL, LOW);
          delay(10000);  // temps deuxième appel
          digitalWrite(HOOK, LOW);
          delay(2000);
        }
       compteur_2 = 44;
      }  
      if(compteur_2 == 44)
      {
        do
        {      
          digitalWrite(LED, HIGH);
          val_2 = digitalRead(BUTTON);
        }while(val_2 == LOW);
      }
    }
    Merci JACK pour ton aide et à tout les autre aussi !

    Le problème est résolu !
    Dernière modification par Linke741 ; 13/01/2014 à 22h41.

  14. #11
    Jack
    Modérateur

    Re : [ARDUINO ∞] Vérification de programme.

    mais la valeur n'est pas pris en compte pour la suite du programme...
    On dirait que tu n'as toujours pas compris comment ça marche. Quend on sort de la boucle for, compteur_1 est égal à 2, pas à 1.

    C'est donc if (compteur_1 == 2) qu'il fallait écrire.

  15. #12
    Linke741

    Re : [ARDUINO ∞] Vérification de programme.

    Citation Envoyé par Jack Voir le message
    On dirait que tu n'as toujours pas compris comment ça marche. Quend on sort de la boucle for, compteur_1 est égal à 2, pas à 1.

    C'est donc if (compteur_1 == 2) qu'il fallait écrire.
    Je viens de tester et ça ne fonctionne pas...

  16. Publicité
  17. #13
    Jack
    Modérateur

    Re : [ARDUINO ∞] Vérification de programme.

    Pourquoi n'affiches-tu pas la valeur de compteur_1 en sortie de boucle sur la console? On serait fixé comme ça.

Discussions similaires

  1. [ARDUINO ∞] Simuler l'appui d'un interrupteur DPDT ON/ON.
    Par Linke741 dans le forum Électronique
    Réponses: 9
    Dernier message: 24/03/2017, 04h02
  2. [ARDUINO ∞] Analog switch.
    Par Linke741 dans le forum Électronique
    Réponses: 5
    Dernier message: 07/12/2013, 20h11
  3. Réponses: 2
    Dernier message: 23/07/2013, 13h52
  4. [ARDUINO ∞] Simuler l'appui d'une touche de téléphone fixe.
    Par Linke741 dans le forum Électronique
    Réponses: 6
    Dernier message: 18/06/2013, 04h40
  5. Petite question sur les limites en +∞ ou -∞...
    Par letim dans le forum Mathématiques du collège et du lycée
    Réponses: 7
    Dernier message: 06/02/2008, 16h44
Découvrez nos comparatifs produits sur l'informatique et les technologies.