Go Down

Topic: Effectuer 2 actions simultanément  (Read 449 times) previous topic - next topic

Yazid140

D'accord merci j'ai rajouté une petite question, comment commander un bandeau Led ou savoir son état? car si je le déclare en pinMode(3, INPUT) en essayant un digitalWrite je ne peux pas le commander je ne pense pas que cela marche comme ça.

dbrion06

Bon déjà, est ce que vous pouvez démarrer et arrêter le moetur par des applaudissements.
Parce ce que je ne sais toujours pas
a) si la question précédente est résolue, celle que VOUS avez évoquée en post 11
b) quelle est la fonction loop()? Parce ce que tenter de  modifier en aveugle par du codage "à la volée" n'est pas sain à long therme.

Ensuite, que voulez vous faire avec vos bandeaux de LEDS?

Yazid140

#17
Apr 30, 2019, 02:14 pm Last Edit: Apr 30, 2019, 02:16 pm by Yazid140
Non je n'arrive pas à démarrer et arrêter le moteur par un applaudissement. J'arrive par contre à effectuer une autre action SEULEMENT à la fin du cycle du premier clap, il n'y a pas d'interruption

Voici le code que j'essaye en ce moment :
Code: [Select]
#include <FastLED.h>
#define LED_PIN     3
#define NUM_LEDS    100
CRGB leds[NUM_LEDS];

int Distance = 0;
int Distance2 = 0;
const char digitalPin = 6;



void setup(){
  
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
pinMode(digitalPin, INPUT);
pinMode(3, INPUT);
  int nb=100;
  bool flag = false;
}

void loop() {

  if(digitalRead(digitalPin))
  {
    if (flag==true)
    {
      Moteur1();     // Vitesse moteur 1
      Lumiere1();    // Couleur Lumiere 1
      
      flag=false;
    }
    else
    {
      Moteur2();    // Vitesse moteur accelere
      Lumiere2()    // Couleur lumiere changé
      flag=true;
    }
    delay(50);
    
  }
}


void Lumiere1() {
  
for (int i = 0; i <= nb; i++) {
    leds[i] = CRGB (0, 0, 255);
    FastLED.show();
    delay(20);
    }
}
    
void Lumiere2() {
 
for (int i = 0; i <= nb; i++) {
    leds[i] = CRGB ( 255, 0, 0);
    FastLED.show();
    delay(20);}
    }
  
void Moteur1(){         // VITESSE MOTEUR 1
  
    int P1=5000, P2=3000, P3=2000;

    while (Distance!=10)       {                         //PHASE 1

            digitalWrite(9,HIGH);
            digitalWrite(8, HIGH);
            delayMicroseconds(P1);                   // IMPULSION
            digitalWrite(8, LOW);
            delayMicroseconds(P1);  
Distance = Distance + 1;
                            }
if (Distance == 10 ){
  //--------------------------------------------
while(Distance!=40){                                       // PHASE 2
           digitalWrite(8, HIGH);
           delayMicroseconds(P2);                           // IMPULSION
           digitalWrite(8, LOW);
           delayMicroseconds(P2);
  
Distance = Distance + 1;
}}
if (Distance == 40 ){
  //--------------------------------------------
  
while(Distance!=500)      {                               // PHASE 3
          digitalWrite(8, HIGH);
          delayMicroseconds(P3);                          // IMPULSION
          digitalWrite(8, LOW);
          delayMicroseconds(P3);
Distance = Distance + 1;
                          }}
if (Distance ==500)       {
  //--------------------------------------------
while (Distance!=520)     {                                   // PHASE 4
          
          digitalWrite(8, HIGH);
          delayMicroseconds(P1);                            // IMPULSION
          digitalWrite(8, LOW);
          delayMicroseconds(P1);
Distance = Distance + 1;
                          }}

if (Distance == 520)                                        // DISTANCE MONTEE
        {delayMicroseconds(2000);}
  
//----------------------------------------------------------------------------  
//----------------------------------------------------------------------------

 while (Distance2!=10)   {                 //DISTANCE MONTEE PHASE 1
           digitalWrite(9,LOW);
           digitalWrite(8, HIGH);
           delayMicroseconds(P1);                   // IMPULSION
           digitalWrite(8, LOW);
           delayMicroseconds(P1);
Distance2 = Distance2 + 1;
                         }
if (Distance2 == 10 ) {
  //---------------------------------------------
while(Distance2 != 40){                             // PHASE 2
          digitalWrite(8, HIGH);
          delayMicroseconds(P2);                   // IMPULSION
          digitalWrite(8, LOW);
          delayMicroseconds(P2);
 Distance2 = Distance2 + 1;
}}
if (Distance2 == 40 ){
  //--------------------------------------------
while(Distance2 != 500)        {                       // PHASE 3
        digitalWrite(8, HIGH);
        delayMicroseconds(P3);                         // IMPULSION
        digitalWrite(8, LOW);
        delayMicroseconds(P3);
Distance2 = Distance2 + 1;
                                }}

if (Distance2 == 500) {  
//--------------------------------------------

while (Distance2 != 520)     {                      //¨PHASE 4
        digitalWrite(8,HIGH);
        digitalWrite(8, LOW);
        delayMicroseconds(P1);                   // IMPULSION
        digitalWrite(8, LOW);
        delayMicroseconds(P1);
Distance2 = Distance2 + 1;
                            }}

if (Distance2 == 520)                  // DISTANCE MONTEE
        {delayMicroseconds(2000);}
  
  
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
 
Distance = 0;
Distance2 = 0;

  }
  
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


  void Moteur2(){          // VITESSE MOTEUR 2
    
    int P1=4000, P2=2000, P3=1000;

    while (Distance!=10)       {                         //PHASE 1

            digitalWrite(9,HIGH);
            digitalWrite(8, HIGH);
            delayMicroseconds(P1);                   // IMPULSION
            digitalWrite(8, LOW);
            delayMicroseconds(P1);  
Distance = Distance + 1;
                            }
if (Distance == 10 ){
  //--------------------------------------------
while(Distance!=40){                                       // PHASE 2
           digitalWrite(8, HIGH);
           delayMicroseconds(P2);                           // IMPULSION
           digitalWrite(8, LOW);
           delayMicroseconds(P2);
  
Distance = Distance + 1;
}}
if (Distance == 40 ){
  //--------------------------------------------
  
while(Distance!=500)      {                               // PHASE 3
          digitalWrite(8, HIGH);
          delayMicroseconds(P3);                          // IMPULSION
          digitalWrite(8, LOW);
          delayMicroseconds(P3);
Distance = Distance + 1;
                          }}
if (Distance == 500)       {
  //--------------------------------------------
while (Distance!=520)     {                                   // PHASE 4
          
          digitalWrite(8, HIGH);
          delayMicroseconds(P1);                            // IMPULSION
          digitalWrite(8, LOW);
          delayMicroseconds(P1);
Distance = Distance + 1;
                          }}

if (Distance == 520)                                        // DISTANCE MONTEE
        {delayMicroseconds(2000);}
  
//----------------------------------------------------------------------------  
//----------------------------------------------------------------------------

 while (Distance2!=10)   {                 //DISTANCE MONTEE PHASE 1
           digitalWrite(9,LOW);
           digitalWrite(8, HIGH);
           delayMicroseconds(P1);                   // IMPULSION
           digitalWrite(8, LOW);
           delayMicroseconds(P1);
Distance2 = Distance2 + 1;
                         }
if (Distance2 == 10 ) {
  //---------------------------------------------
while(Distance2 != 40){                             // PHASE 2
          digitalWrite(8, HIGH);
          delayMicroseconds(P2);                   // IMPULSION
          digitalWrite(8, LOW);
          delayMicroseconds(P2);
 Distance2 = Distance2 + 1;
}}
if (Distance2 == 40 ){
  //--------------------------------------------
while(Distance2 != 500)        {                       // PHASE 2
        digitalWrite(8, HIGH);
        delayMicroseconds(P3);                         // IMPULSION
        digitalWrite(8, LOW);
        delayMicroseconds(P3);
Distance2 = Distance2 + 1;
                                }}

if (Distance2 == 500) {  
//--------------------------------------------

while (Distance2 != 520)     {                      //¨PHASE 4
        digitalWrite(8,HIGH);
        digitalWrite(8, LOW);
        delayMicroseconds(P1);                   // IMPULSION
        digitalWrite(8, LOW);
        delayMicroseconds(P1);
Distance2 = Distance2 + 1;
                            }}

if (Distance2 == 520)                  // DISTANCE MONTEE
        {delayMicroseconds(2000);}
  
  
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
 
Distance = 0;
Distance2 = 0;


  }



Voici ce que je veux faire ici :

CLAP > Moteur tourne + Bandeau LED activé
CLAP > Changement vitesse Moteur + Changement couleur Bandeau LED

Ce que je veux faire ensuite :

Moteur tourne non stop + Bandeau LED
CLAP > Changement couleur bandeau LED
CLAP > Changement encore

dbrion06

Vous avez un boolean, flag (2 valeurs) , qui est censé piloter cinq états (au moins: d'après votre description: il en faut peut être plus pour changer la couleur);
ceci est impossible.

vous avez des delays un peu partout qui rendent impossible la détection à certains moments, que ce soit d'une télécommande ou d'applaudissements.

Je vous ai expliqué comment
a) modifier  l'état s'il y a lieu .
b) en fonction de l'état, activer -ou pas- le moteur et le-s- bandeaux de leds.

Ensuite, il faudrait arriver à retirer (avec des sous états; un pour le moteur, un pour chaque bandeau de LEDs?) les delays....
A noter qu'il est plus facile de piloter les bandeaux de LEDS et le débarrasser des delays : j'ai mis une esquisse post 8.

(les programmes de demo aiment bien mettre des dealys, rendant la compréhension aisée; cependant, si, comme le titre l'indique, vous souhaitez faire plusieurs choses à la fois : tourner moteur, gigoter des LEDs ET recevoir les ordres; seule une machine d'état peut le faire sur un petit arduino

Yazid140

D'accord j'ai bien compris ce que vous me demandez sauf que je découvre l'arduino ce n'est pas évident encore.

Ensuite comment puis-je récupérer l'état de mon bandeau de LED ? Sachant que la fonction digitalWrite ne marche pas j'imagine que c'est pareil pour digitalRead



dbrion06

Vous devriez lire (ou relire) le tutorial de JLM sur les machines d'état et essayer de l'adapter (j'ai du le faire à la volée au post 8) à votre bandeau de LEDs, de façon à le débarrasser de ses delays.
Je sais que c'est long à faire, mais c'est la façon la plus facile de commencer pour gérer aussi les moteurs (pour les bandeaux, vous avez un delai fixe; pour le moteur, le delay varie, complexifiant la structure de sonnées: une fois que vous aurez compris le squelette de  programme pour un cas simple, vous pourrez le raffiner ... oi comprendre les raffinements que l'on vous propose -qui ont pour objectif de redonner du temps/des cycles pour pouvoir répondre aux ordres-)

Yazid140

D'accord oui effectivement j'ai pas encore lu nikel si cette question est abordé, je vous remercie pour le temps prit à me répondre. Bonne journée !

Go Up