Go Down

Topic: boucle en attente action telecommande [Résolu] (Read 7020 times) previous topic - next topic

osaka

#15
Nov 04, 2011, 05:10 pm Last Edit: Nov 04, 2011, 05:45 pm by osaka Reason: 1

j'ai placé à tous les endroits possibles cette ligne dans ma boucle for
Code: [Select]
if(irrecv.decode(&results) && results.value != 12495) break; // si on appui sur un bouton autre que "0" break -> sort du for


Dans le principe ça devrait fonctionné.
Peut être essayer ça dans ton for :

Code: [Select]

if (test == 12495) {
     irrecv.resume(); // Receive the next value
     
     for ( int i = -1;i < 3024; i++) {
       if (irrecv.decode(&results))   //n'importe quel événement devrait fonctionné
        {
         break;
       }
       digitalWrite(redPin, i);
       digitalWrite(greenPin, i + 12);
       digitalWrite(bluePin, i + 56);
       
       delay (5);
}



Par contre autres chose mais peut être en rapport, les
Code: [Select]
irrecv.resume(); // Receive the next value

je pense que tu n'as besoin de le mettre qu'une seule fois à la fin de ton premier if global celui qui prend un évenement.
Code: [Select]

if (irrecv.decode(&results)) {
.
.
.
 irrecv.resume(); // Receive the next value
}


(ma solution sans le for tu l'as testée ?)


la solution case idem.


C'était surtout pour que le code soit plus propre.  :%
;)

(osx inside pour moi :smiley-mr-green:)

infobarquee

j'ai épuré le code cet après midi, mais toujours pas possible d'interrompre un for ou while, même avec les suggestions données.
ca commence a ressembler à quelque chose, même s'il y a encore des améliorations.
Code: [Select]
#include <IRremote.h>

int RECV_PIN = A0;
int test = 1;
int test1 = 255;
int redPin = 11;
int greenPin = 10;
int bluePin = 9;
int testlolo = 0;
// Indicates what color we are reading next; 0 = red, 1 = green, 2 = blue
int pos = 0;

// red PWM value
int red = 0;
// green PWM value
int green = 0;
// blue PWM value
int blue = 0;

int i = 1;
int value = 0 ;

int brightness = 0;    // how bright the LED is
int fadeAmount = 5;  // how many points to fade the LED by

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);   
  pinMode(bluePin, OUTPUT);
  // turn on LED on low brightness 
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin,LOW);
  digitalWrite(bluePin, HIGH);
  Serial.begin(9600);


  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    //Serial.println(results.value, DEC);
    //test=results.value;
    testlolo = results.value,DEC;
    //Serial.println(test);
    Serial.println(testlolo);
    irrecv.resume(); // Receive the next value
    switch (testlolo){
    case 255:
      action1();
      break ;
    case 12495:
      action2();
      break ;
    case 2295:
      action3();
      break ;
    case -30601:
      action4();
      break ;
    case 18615:
      action5();
      break ;
    case 10455:
      action6();
      break;
    case -22441:
      action7();
      break ;
    case 26775:
      action8();
    case -24481:
      action9();
      break ;

    }

  }

}

void action1()
{
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin, HIGH);
  digitalWrite(bluePin, HIGH);
  irrecv.resume(); // Receive the next value
}

void action2()
{
  for ( int i = -1;i < 3024; i++) {
    digitalWrite(redPin, i);
    digitalWrite(greenPin, i + 12);
    digitalWrite(bluePin, i + 56);
    irrecv.resume(); // Receive the next value
    if (irrecv.decode(&results)) {
      break;
    }
    delay (5);
  }
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin,LOW);
  digitalWrite(bluePin, HIGH);
  irrecv.resume(); // Receive the next valu


void action3()
{
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin,LOW);
  digitalWrite(bluePin, HIGH);
  irrecv.resume(); // Receive the next value
}

void action4()
{
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin, HIGH);
  digitalWrite(bluePin, LOW);
  irrecv.resume(); // Receive the next value
}

void action5()
{
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, HIGH);
  digitalWrite(bluePin, HIGH);
  irrecv.resume(); // Receive the next value
}

void action6()
{
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(bluePin, LOW);
  irrecv.resume(); // Receive the next value
}

void action7()
{
  for(value = 0 ; value <= 1255; value+=5) //fade in (from min to max)
  {
    analogWrite(redPin, value); //sets the value (range from 0 to 255)
    analogWrite(greenPin, value);
    analogWrite(bluePin, value);
    delay(100); // waits for 30 milli seconds to see the dimming effect
  }
  for(value = 1255; value >=0; value-=5) //fade out (from max to min)
  {
    analogWrite(redPin, value); //sets the value (range from 0 to 255)
    analogWrite(greenPin, value);
    analogWrite(bluePin, value);
    delay(100);
  }

  irrecv.resume(); // Receive the next value
}

void action8()
{
  for ( brightness = 0; brightness < 256 ; brightness++){
    //brightness = brightness + fadeAmount;
    analogWrite(redPin, brightness);
    delay(30); 
    irrecv.resume(); // Receive the next value
  }
  for ( brightness = 0; brightness < 256 ; brightness++){
    //brightness = brightness + fadeAmount;
    analogWrite(greenPin, brightness);
    delay(30); 
    irrecv.resume(); // Receive the next value
  }
  for ( brightness = 0; brightness < 256 ; brightness++){
    //brightness = brightness + fadeAmount;
    analogWrite(bluePin, brightness);
    delay(30); 
    irrecv.resume(); // Receive the next value
  }

}

void action9()
{
  int rando = random(500);
  analogWrite(redPin, rando);
  //Serial.println(rando);
  analogWrite(greenPin, rando +12);
  //Serial.println(rando + 12);
  analogWrite(bluePin, rando + 56);
  //Serial.println(rando + 56);
  irrecv.resume(); // Receive the next value
}

AUCUNE AIDE PAR MP

osaka

#17
Nov 04, 2011, 07:23 pm Last Edit: Nov 04, 2011, 08:43 pm by osaka Reason: 1
Pas mal d' "erreur" de programmation ou confusion.
Utilise des constante macro (#define) au lieu de créé des variables qui ne changeront jamais.
Pour toute les fonction répétitive il y a moyen de simplifié ça.
L'utilisation de int (2 octet) là ou un byte (1 octet valeur allant de 0 à 255) suffit. (j'y vois là le php qui revient avec un typage invisible, d'où le fait que je dise qu'il ne peut servir de réfférance)
testlolo = results.value,DEC; encore là ce ,DEC la solution est ailleur.
digitalWrite ne prend que 2 valeurs possible, 0 (false) ou 1(true) et AnalogWrite prend des valeur comprise entre 0 et 255:

Code: [Select]

for ( int i = -1;i < 3024; i++) {
   digitalWrite(redPin, i);
   digitalWrite(greenPin, i + 12);
   digitalWrite(bluePin, i + 56);


digitalWrite ne prend que deux valeur 0 ou 1 donc temps que tu auras n'importe quel valeurs autre que 0 sera compris comme un HIGH (true)
si c'est un analogWrite que tu as voulu faire il ne prend de toute façon que des valeurs comprise entre 0 et 255.

Code: [Select]

for(value = 0 ; value <= 1255; value+=5) //fade in (from min to max)
for(value = 1255; value >=0; value-=5) //fade out (from max to min)


idem pourquoi monté à 1255 ou c'est une erreur de frappe ?

Ce que j'aurais fais.
Code: [Select]

#include <IRremote.h>

#define RECV_PIN A0
#define redPin 11
#define greenPin 10
#define bluePin 9


int testlolo = 0;

int brightness = 0;    // how bright the LED is
int fadeAmount = 5;  // how many points to fade the LED by

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
 pinMode(redPin, OUTPUT);
 pinMode(greenPin, OUTPUT);  
 pinMode(bluePin, OUTPUT);
 // turn on LED on low brightness  
 digitalWrite(redPin, HIGH);
 digitalWrite(greenPin,LOW);
 digitalWrite(bluePin, HIGH);
 Serial.begin(9600);


 irrecv.enableIRIn(); // Start the receiver
}

void loop() {
 if (irrecv.decode(&results)) {
   //Serial.println(results.value, DEC);
   //test=results.value;
   testlolo = results.value;
   //Serial.println(test);
   Serial.println(testlolo);
   switch (testlolo){
   case 255:
     actionDigital(1,1,1);
     break ;
   case 12495:
     action1();
     break ;
   case 2295:
     actionDigital(1,0,1);
     break ;
   case -30601:
     actionDigital(1,1,0);
     break ;
   case 18615:
     actionDigital(0,1,1);
     break ;
   case 10455:
     actionDigital(0,0,0);
     break;
   case -22441:
     action2();
     break ;
   case 26775:
     action3();
   case -24481:
     action4();
     break ;

   }
   
   irrecv.resume(); // Receive the next value
 }

}

void actionDigital(byte red,byte green,byte blue)
{
 digitalWrite(redPin, red);
 digitalWrite(greenPin, green);
 digitalWrite(bluePin, blue);
}

void actionAnalog(byte red,byte green,byte blue)
{
 analogWrite(redPin, red);
 analogWrite(greenPin, green);
 analogWrite(bluePin, blue);
}

void action1()
{
 irrecv.resume(); // Receive the next value
 
 for ( int i = -1;i < 3024; i++) {
   actionAnalog(i,i+12,i+56);
   delay (5);
   if(irrecv.decode(&results))
   {
     break;
   }
 }
 actionDigital(1,0,1);
}  


void action2()
{
 for(byte value = 0 ; value <= 255; value++) //fade in (from min to max)
 {
   actionAnalog(value,value,value);
   delay(100); // waits for 30 milli seconds to see the dimming effect
 }
 for(byte value = 255; value >=0; value--) //fade out (from max to min)
 {
   actionAnalog(value,value,value);
   delay(100);
 }
}



void action3()
{
 for(byte p = redPin; p >= bluePin; p--)
 {
   for (byte brightness = 0; brightness <= 255 ; brightness++)
   {
     analogWrite(p, brightness);
     delay(30);  
   }
 }
}

void action4()
{
 int rando = random(500);
 actionAnalog(rando,rando + 12,rando + 56);
}


Par contre je comprend toujours pas pourquoi la solution donnée ne fonctionne pas pour le for ?

infobarquee

et oui le php revient au galop parfois :)

par contre, pourquoi
Code: [Select]
for ( int i = -1;i < 3024; i++) {
    digitalWrite(redPin, i);
    digitalWrite(greenPin, i + 12);
    digitalWrite(bluePin, i + 56);

bonne question, si je mets comme toi en analogWrite, l'effet clignotant girophare US ne fonctionne plus, pourquoi? je ne sais pas.
ca clignote une toute petite fois et point barre.

Rectification :
ca fonctionne avec ton code mais pas avec le même effet, mais il ne faut pas rester appuyé très longtemps, sinon, un -1 apparait sur la console et ca provoque le break, qui lui fonctionne :)
pourquoi pas avant, malgré plusieurs essais ?  ]:)
et pas faute d'avoir mis comme toi, mais sur une seule ligne.


sinon, avec ton code qui est super (on sent le pro), une chose ne fonctionne pas.
le rouge qui est en permanence allumé sans fade et ca tourne en boucle.
j'essaye de comprendre pourquoi.
Code: [Select]
void action3()
{
  for(byte p = redPin; p >= bluePin; p--)
  {
    for (byte brightness = 0; brightness <= 255 ; brightness++)
    {
      analogWrite(p, brightness);
      delay(30); 
    }
  }
}


sinon il manquait un break :)
Code: [Select]
case 26775:
      action3();
      break;
    case -24481:
         action4();
      break ;


on va pouvoir passer en résolu dans peu de temps je pense
AUCUNE AIDE PAR MP

infobarquee

ok pigé pourquoi ca prenait pas le break, j'ai agencé comme toi mon code et là le break est pris en compte.
juste un question d'emplacement  ]:)
avec digitalWrite, ca fait un effet blink en gros sur les leds, avec un décallage très très léger entre les couleurs, d'ou l'effet obtenu.
Code: [Select]
void action2()
{
  irrecv.resume(); // Receive the next value
  for ( int i = -1;i < 3024; i++) {
    digitalWrite(redPin, i);
    digitalWrite(greenPin, i + 12);
    digitalWrite(bluePin, i + 56);
      delay (5);
    if (irrecv.decode(&results)) {
      break;
    }


idem pour ici avec ton code, les leds s'allument en même temps au lieu d'avoir un fade couleur par couleur
Code: [Select]
void action2()
{
  for(byte value = 0 ; value <= 255; value++) //fade in (from min to max)
  {
    actionAnalog(value,value,value);
    delay(100); // waits for 30 milli seconds to see the dimming effect
  }
  for(byte value = 255; value >=0; value--) //fade out (from max to min)
  {
    actionAnalog(value,value,value);
    delay(100);
  }
}


on peut passer en résolu,
merci à vous pour votre aide précieuse et sympathique.
AUCUNE AIDE PAR MP

osaka

#20
Nov 04, 2011, 10:53 pm Last Edit: Nov 04, 2011, 10:59 pm by osaka Reason: 1

et oui le php revient au galop parfois :)

par contre, pourquoi
Code: [Select]
for ( int i = -1;i < 3024; i++) {
    digitalWrite(redPin, i);
    digitalWrite(greenPin, i + 12);
    digitalWrite(bluePin, i + 56);

bonne question, si je mets comme toi en analogWrite, l'effet clignotant girophare US ne fonctionne plus, pourquoi? je ne sais pas.
ca clignote une toute petite fois et point barre.


j'avais mis un analogWrite comme je ne savais pas vraiment quels effets tu désirais et comme je voyais une variation de -1 à 3024 (ne pas oublier analogWrite prend des valeurs de 0 à255) et des +12 et + 56 j'ai supposé qu'il s'agissait de fadding donc analogWrite.



Rectification :
ca fonctionne avec ton code mais pas avec le même effet, mais il ne faut pas rester appuyé très longtemps, sinon, un -1 apparait sur la console et ca provoque le break, qui lui fonctionne :)
pourquoi pas avant, malgré plusieurs essais ?  ]:)
et pas faute d'avoir mis comme toi, mais sur une seule ligne.


Je soupçonne les "irrecv.resume(); // Receive the next value" semé un peux partout alors qu'il n'est utile qu'une fois après la réception d'un évènement (afin d’accepté un nouvel évènement je pense).
Peut être une petit delay entre deux commande afin d'éviter les répétition en cas d'appuis long.


sinon, avec ton code qui est super (on sent le pro), une chose ne fonctionne pas.
le rouge qui est en permanence allumé sans fade et ca tourne en boucle.
j'essaye de comprendre pourquoi.

Code: [Select]
void action3()
{
  for(byte p = redPin; p >= bluePin; p--)
  {
    for (byte brightness = 0; brightness <= 255 ; brightness++)
    {
      analogWrite(p, brightness);
      delay(30); 
    }
  }
}



peut être un conflit avec la variable globale brightness en haut que j'ai oublier de retiré.

Sinon pour des effets ne correspondant pas à ceux voulu il ne reste plus qu'a faire joujou et tester pour avoir celui désiré, la seule chose à ne pas oublier:

- digitalWrite prend deux valeurs 0(LOW) ou 1(HIGH), éteins ou allumé  quoi.
- analogWrite accepte des valeurs comprise ente 0 et 255, variation (pwm).

Go Up