Pages: [1]   Go Down
Author Topic: bloquer sur un increment de variabe progressif  (Read 1035 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je bute sur une variable que j'incrémente via un BP, cette variable va de 0 à 500.
Forcement extrêmement long à faire évoluer de plus ou de moins 1, et de 1 en 1.
Je cherche à faire incrémenter ma variable après une durée de pression sur le BP en sautent de 5 puis 10 etc... et de revenir a une incrémentation normal après relâchement.

D'une pression simple j'obtiens +1
Si je reste appuyer 1 demi seconde de j'obtiens + 5 en 4 sauts (donc 5x4) avec un temps de pose de 500ms entre les incrément automatique puis de +10 en 5 saut avec pose etc et ainsi de suite.

Il y a pas de code a retranscrire ici,  hé oui puisque je bloque totalement !
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3230
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Lorsque tu appuies sur ton BP, tu fais une différence du temps passé avec le temps actuel en utilisant la fonction millis().
Ensuite avec un switch-case, tu contrôles la valeur de cette différence et tu mets dans une variable "increment" la valeur de l'incrément qui s'y rapporte.

Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Ça m'as tout l'air d'être le principe des boutons "Press and Hold" ?

Ce lien devrait te donner des pistes pour ton systéme :
-> http://jmsarduino.blogspot.fr/2009/05/click-for-press-and-hold-for-b.html
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

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

Merci,

skywodd: je suis une quiche en anglais , mais j'ai compris quand même (en gros).

jean-francois: j'avais dans l'idée d'utiliser millis().
Il me manquer les conditions de teste, j'en été rester à de simples "If" (en paquet).
Je me suis écrit une version avec les switch case, ... il ma parut très long.
Alors après réflexion j'ai peut-être trouver plus compacte en changeant un brin l'usage.

Le résultat incrémente -1 en pression simple et jusqu'à 4 fois -5 en pression longue de 500ms au delà il incrémente avec un multiple de 5  (ex: -1, -5, -5, -5, -5, -25, -30, -35 ..). Après relâchement il teste, si la valeur est négative il remet à zéro.

Voyez vous même si quelque chose choque ...
Note : j'utilise le notepad++, donc normal si il y a des fautes

Code:
// lecture de freq1 minima
if (analogRead(pin_freq1) <= 400 && etat == false){
freq[0]--; temps = millis();
// incremente plus rapidement si...
while(analogRead(pin_freq1) <= 400){
tempo = millis() - temps
teste_temps = tempo - (int(tempo / 1000); // incremente a chaque 500 ms, max.4 fois
if (teste_temps == 500 && increment <= 4){
increment++; freq[0] = freq[0] - 5; }
else if (teste_temps == 500 && increment >= 5){
freq[0] = freq[0] - (5 * increment); increment++; }// increment avec acceleration 25,30,35,40,45...
else if (teste_temps == 510){
// rafraichi un affichage  LCD eventuellement
}
}
increment = 0; etat = true;
}
if (freq[0] <= 0){freq[0] = 1; }
Logged

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 864
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour, désolé de te dire ça mais ton code est bof quand même on peut faire mieux aller regarde:

Code:
if (analogRead(pin_freq1) <= 400 && etat == false) // appuie sur le bouton
{
temps = millis();                                         //prise du temps début
while(analogRead(pin_freq1) <= 400)            //tant que bouton enfoncé
        {
     tempo = millis() - temps;                         //temps depuis appuie
             cpt_sec= millis() - temps - nb_sec;            //compteur seconde depuis appuis toujours <1
     switch (x)
             {
                       case 1 :
                                   if (tempo >500){ x=2;  ajout=1;}   //minimums pour +1 500ms
                                      break;
                       case 2 :
                                  if (tempo>1000){ x=3; ajout=2;} // passage a +2 si appui + d'une seconde
                                      break;
                       case 3 :
                                   if (tempo>2000){ x=4; ajout=5;} // passage a +5 si appui + de 2 seconde
                                      break;
                       case 4 :
                                  if (tempo>4000) { ajout=10; }  //passage a +5 +1 par tour si appui + de 4 seconde
                                      break;

              }
              if (cpt_sec>1000)                      // toute les 1 seconde depuis l'appuie sur le bouton
              {
                      nb_sec++;                         //nb seconde passée
                      compteur=compteur+ajout;   // incrémentation de ton compteur progressif 1/s|0.5s    2/s|1s     5/s|2s     10/s|4s
              }

}
}
else
{
   ajout =0;   // remise a 0 de k'ajout progressif
   x=1;        // retour a la case 1 du case progressif
}

voila en éspérant que ça t'aide, manque plus qu'a déclaré tes variable et normalement c'est bon smiley

Skizo !
Logged

Un tien vaux mieux que deux tu l'auras !

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

Je pense avoir trouver plus court ....
je reset les variables "incrément" et "teste_temps" avant le teste.

Maintenant je me demande pourquoi j'avais écrit un int() alors qu'il me suffisez de faire une addition de l'un et une soustraction de l'autre, sans même avoir besoin de mettre une variable de plus.

Code:
if (analogRead(pin_freq1) < 400 && etat == false){
freq[0]--; temps = millis(); // incremente plus rapidement si...
while(analogRead(pin_freq1) < 400)
{
tempo = millis() - temps; // increment avec acceleration par tranche de 500ms vers 5, 10, 15, 20
if (tempo - teste_temps > 500){increment++; teste_temps = teste_temps + 500; freq[0] = freq[0] - (5 * increment); }
}
etat = true;
}
Logged

Pages: [1]   Go Up
Jump to: