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

Eteindre une led dans une boucle

  1. #1
    blazz78

    Eteindre une led dans une boucle

    Bonjour à tous,

    J'ai un niveau assez faible en programmation, mais je me deçoit moi meme en me rendant compte que je n'arrive même pas à piloter une led correctement.
    Oui vous pouvez me huer.
    Pour faire simple, je suis dans une boucle et je veux que lorsque ma tension est supérieure à 3V une led rouge clignote. Et lorsque la tension est inferieure à 3V qu'une led Verte s'allume 2 sec, puis s'eteigne. Mais j'aimerai que quand le courant redevient inferieur, puis superieur encore une fois, cette meme led Verte se rallume 2sec et s'eteigne à nouveau.

    J'ai donc ce programme :

    Code:
    if (Vout_tension > 3.0)
                {
                    RED_Led_Write(~RED_Led_Read());
                    CyDelay(500);
                    GREEN_Led_Write(0);
                }
            else 
                {
                    RED_Led_Write(0);
                    GREEN_Led_Write(1);
                    CyDelay(2000);
                    GREEN_Led_Write(0);
                }
    etant donné ma boucle, ma led verte reste constamment allumée quand la tension est inferieure à 3V. Pouvez vous m'aider ?

    Merci à vous,
    Blazz78

    -----

    Dernière modification par JPL ; 13/04/2018 à 13h28. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. Publicité
  3. #2
    Tryss2

    Re : Eteindre une led dans une boucle

    Ici, une idée possible c'est d'utiliser ce qu'on appelle un flag (drapeau en français).

    Tu initialises en dehors de la boucle une variable booléenne nommée RedMode (par exemple), et tu l'utilises pour savoir si tu es déjà en mode "rouge"

    Code:
    if (Vout_tension > 3.0)
    {
       RED_Led_Write(~RED_Led_Read()) ;
       CyDelay(500);
       GREEN_Led_Write(0);
       RedMode = true;  // on est en mode rouge
    }
    else
    {
    
       if (RedMode)  // si c'est true, c'était qu'on était en mode rouge avant
       {
          RedMode = false;  // on passe en mode vert
          RED_Led_Write(0);
          GREEN_Led_Write(1);
          CyDelay(2000);
          GREEN_Led_Write(0);
       }
    }
    Dernière modification par Tryss2 ; 13/04/2018 à 13h17.

  4. #3
    blazz78

    Re : Eteindre une led dans une boucle

    Merci beaucoup de ta réponse,

    J'ai essayé ta solution, et malheuresement ma led ne s'etteint toujours pas. L'erreur vient peut etre de moi. J'ai utilisé ton code, en définissant la variable booleenne Redmode, mais ça marche toujours pas.
    Je suis contraint d'utiliser PSoC Creator, mais je ne pense que le probleme vienne de là.

  5. #4
    Tryss2

    Re : Eteindre une led dans une boucle

    Tu as bien défini la variable booléenne en dehors de la boucle, mais telle que sa valeur soit conservée entre chaque boucle ?

  6. #5
    blazz78

    Re : Eteindre une led dans une boucle

    Oui enfin je passe

    je l'ai defini en dehors de mon main avec un "Bool RedMode;"
    puis j'ai tout simplement reutiliser ton "RedMode = False;" ou "RedMode = True;" au même endroit ou tu les avais mis

  7. #6
    naru2to

    Re : Eteindre une led dans une boucle

    Bonjour,
    Est-ce qu'on pourrait avoir le code complet, car il peut y avoir plusieurs cas qui font que le programme ne s'exécute pas correctement :
    - Déclaration des fonctions RED_Led_Write(); et GREEN_Led_Write();
    - Comment est obtenue la valeur Vout_tension et est elle correcte?
    - Boucle qui ne s'exécute pas?

  8. #7
    blazz78

    Re : Eteindre une led dans une boucle

    oui bien sur. du coup je vous situe tout. J'ai un Ampli OP et je mesure la tension en sortie de celui-ci.

    #include <project.h>

    float ADC_tension = 0.0;
    float Vout_tension = 0.0;
    #define FALSE 0
    #define TRUE (!FALSE)
    typedef unsigned char Bool; // Les trois ligne sont faites pour que le boolean fonctionne

    Bool RedMode;

    int main()
    {
    /* Start Opamp component */
    Opamp_Start();
    /* Sets Opamp power mode to High power */
    Opamp_SetPower(Opamp_HIGH_POWE R);

    /*Start ADC component*/
    ADC_Start();

    CyGlobalIntEnable;

    for(;
    {
    ADC_StartConvert();

    ADC_IsEndConversion(ADC_WAIT_F OR_RESULT);

    ADC_tension = ADC_CountsTo_Volts(0, ADC_GetResult16(0));

    Vout_tension = ADC_tension * 0.66;

    if (Vout_tension > 3.0)
    {
    RED_Led_Write(~RED_Led_Read()) ;
    CyDelay(500);
    GREEN_Led_Write(0);
    RedMode = TRUE;
    }
    else
    {
    RedMode = FALSE;
    RED_Led_Write(0);
    GREEN_Led_Write(1);
    CyDelay(2000);
    GREEN_Led_Write(0);
    }
    }
    }

    Tout ce qui concerne L'Ampli OP marche tres bien, et je n'ai aucun message d'erreur, juste la led reste tout le tmeps allumer.

  9. #8
    naru2to

    Re : Eteindre une led dans une boucle

    Code:
    int main()
    {
    /* Start Opamp component */
    Opamp_Start();
    /* Sets Opamp power mode to High power */
    Opamp_SetPower(Opamp_HIGH_POWE R);
    
    /*Start ADC component*/
    ADC_Start();
    
    CyGlobalIntEnable;
    
    for(;;)
    {
    ADC_StartConvert();
    
    ADC_IsEndConversion(ADC_WAIT_F OR_RESULT);
    
    ADC_tension = ADC_CountsTo_Volts(0, ADC_GetResult16(0));
    
    Vout_tension = ADC_tension * 0.66;
    
    if (Vout_tension > 3.0)
    {
    RED_Led_Write(~RED_Led_Read()) ;
    CyDelay(500);
    GREEN_Led_Write(0);
    RedMode = TRUE;
    }
    else
    {
    RedMode = FALSE;
    RED_Led_Write(0);
    GREEN_Led_Write(1);
    CyDelay(2000);
    GREEN_Led_Write(0);
    }
    }
    }
    Est-ce que la fonction GREEN_Led_Write() permet bien d'allumer et d'éteindre la LED (confirmerait la bonne configuration du port)
    Il n'y a pas de paramètre dans le for()?
    Est-ce qu'en remplaçant for( ; ; ) par while(1) ça change quelque chose :

    Code:
    int main()
    {
    /* Start Opamp component */
    Opamp_Start();
    /* Sets Opamp power mode to High power */
    Opamp_SetPower(Opamp_HIGH_POWE R);
    
    /*Start ADC component*/
    ADC_Start();
    
    CyGlobalIntEnable;
    
    while(1)
    {
    ADC_StartConvert();
    
    ADC_IsEndConversion(ADC_WAIT_F OR_RESULT);
    
    ADC_tension = ADC_CountsTo_Volts(0, ADC_GetResult16(0));
    
    Vout_tension = ADC_tension * 0.66;
    
    if (Vout_tension > 3.0)
    {
    RED_Led_Write(~RED_Led_Read()) ;
    CyDelay(500);
    GREEN_Led_Write(0);
    RedMode = TRUE;
    }
    else
    {
    RedMode = FALSE;
    RED_Led_Write(0);
    GREEN_Led_Write(1);
    CyDelay(2000);
    GREEN_Led_Write(0);
    }
    }
    }

  10. #9
    blazz78

    Re : Eteindre une led dans une boucle

    Oui GREEN_Led_Write marche.
    Et en essayant while(1) rien ne change.

  11. #10
    naru2to

    Re : Eteindre une led dans une boucle

    Est-ce que c'est possible de sortir la valeur de la tension sur un terminal? à mon avis c'est la conversion numérique->tension qui n'est pas bonne. L'ADC a combien de bits de résolution?

  12. #11
    blazz78

    Re : Eteindre une led dans une boucle

    Je verifie ma tension sur un oscillo. Pour faire simple l'une de mes deux resistances qui servent à faire le gain de l'ampli OP est remplacer pour deux bornes. quand elles sont le vide est théoriquement de 0 (pas tout a fait vrai) et de 3.3V lorsque quelque chose crée un contact entre les deux bornes. Donc avec l'oscillo je sais que mon AOP marche bien.
    J'ai une fonction DEBUG qui me permet de verifier ce que je lis, et il m'indique la meme tension que sur l'oscillo.

  13. #12
    naru2to

    Re : Eteindre une led dans une boucle

    Est-ce que c'est possible de faire les tests suivants :
    - Vérifier que le programme tourne en enlevant la condition if, juste laisser les delay et les LED à '1' et '0' (si les LEDs clignotent c'est que le programme tourne, sinon il est bloqué quelque part avant)
    - Remplacer la condition par if(ADC_GetResult16(0)>=32700) (si ADC 16 bit)

  14. #13
    Tryss2

    Re : Eteindre une led dans une boucle

    Si le code que tu as copié est celui que tu fais tourné, normal que ça ne marche pas !

    Ne vois tu pas la différence (fondamentale) avec le code que je t'ai proposé?

  15. #14
    naru2to

    Re : Eteindre une led dans une boucle

    Moi j'ai trouvé

    pssst dans le else{...} tu as oublié if (RedMode){...} // si c'est true, c'était qu'on était en mode rouge avant

    Sinon quand tu copies du code pense à utiliser la balise code # et indenter le code, c'est plus sympa à lire

  16. #15
    blazz78

    Re : Eteindre une led dans une boucle

    ah oui en effet je l'avais enlevé car on m'indiquait une faute à cette ligne. Et au final, il y avait des erreurs autre part, et c'est vrai que je n'ai pas remis cette ligne de code.

    J4essaierai vos propositions, mais malheuresement je ne suis plus en mesure de faire tout essais avant Lundi. Merci à tous pour votre aide et bon week end.

    Je vous tiens Lundi au courant, en esperant que cette fichu led finira par clignoter

  17. #16
    naru2to

    Re : Eteindre une led dans une boucle

    en esperant que cette fichu led finira par clignoter
    Sinon un NE555 le fera très bien...

  18. #17
    blazz78

    Re : Eteindre une led dans une boucle

    Merci à tous de m'avoir aider sur ce sujet, ma led fonctionne comme je le souhaitais.
    Une mention particuliere à Tryss2 car ton programme fonctionne parfaitement, merci à toi.

Discussions similaires

  1. [Biologie Moléculaire] Eteindre expression d'un gène dans un organe/tissus bien précis
    Par hilal9207 dans le forum Biologie
    Réponses: 1
    Dernier message: 28/08/2017, 09h07
  2. [Programmation] Opérateur OU (||) dans boucle while (CCS C)
    Par NicolasV08 dans le forum Électronique
    Réponses: 13
    Dernier message: 20/06/2017, 19h59
  3. boucle for dans excel
    Par Naeth23 dans le forum Programmation et langages, Algorithmique
    Réponses: 6
    Dernier message: 09/05/2017, 20h54
  4. Petite minuterie avec relais allumer/éteindre en boucle ?
    Par qcastl32 dans le forum Électronique
    Réponses: 5
    Dernier message: 10/10/2015, 15h29
  5. boucle dans une boucle
    Par nir92 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 15/04/2012, 09h51