Gérer des boutons

Bonjours à tous,

voilà quelque temps que je vous embêtes avec mes questions farfelue et mon manque de connaissance mais sans vous dire pourquoi.

Je suis en train de préparer une petit cockpit d'avion pour FSX et P3D.

Un truc dans ce genre là

Un système de maître esclave devait être mis en place, mais n'a pas aboutis suite à plusieurs problème de com.

Mais aujourd'hui le sujet de ma question et beaucoup plus léger :slight_smile:

j'utilise des platines LKM1638 dont en voici une en pleine action sur mon bureau

16 digits, 16 leds 16 boutons, le tous en SPI.

J'ai trouvé comment gérer les digit led et les boutons.

Voici d'ailleurs une super librairie avec en plus un wiki

lm1638 et 1640

Donc voici comment je récupère les infos des boutons.

byte keys=module1_1.getButtons();
for (byte i = 0; i < 8; i++) 
    {
        bp1_1[i]=keys & (1 << (i)) ? 1 : 0;
    }

L'état de mes boutons est stocké dans un tableau et si je veux vérifier un bouton je fait

if(bp1_1[3]==1){module1_1.setLED(TM1638_COLOR_RED, 3);}
else{module1_1.setLED(TM1638_COLOR_NONE, 3);}

j'ai mes boutons, je peux les utiliser, mais maintenant là ou je n'ai pas encore d'idée c'est sur les différent mod d'appui.

Déjà éviter de prendre en compte les rebonds du contact lors de l'appui, ensuite pouvoir détecter un appuie court et un appui long.

Je n'utilise pas de système de delay mais ça

unsigned long time=0;//mémoire du temps passé, capacité 50 jours grossiérement
unsigned long time_S=0;//mémoire du temps passé pour les secondes
unsigned long time_S2=0;//mémoire du temps passé pour les secondes
unsigned long time_S4=0;//mémoire du temps passé pour les secondes
void loop()
{
    time = millis();//mise en mémoire du temps
    if((time-time_S)>1000)
        {
             time_S=time;
             //action
        }

}

le but pour moi est le suivant, si j'appuie brièvement sur le bouton, il ajoute +1 à un compteur, si j'appuie sur le bouton plusieurs seconde, dans un premier temps il va ajouté +1 au compteur tous les 500 ms, et au bout de 3 seconde, il ajoute +1 toutes les 100ms. Et si je relâche il arrête bien entendu.

pour le moment je n'ai pas l'idée de la chose.

pourriez vous me guider.

Merci d'avance Flo

Salut,

Il suffit de rajouter une condition et de géré le temps de départ à l'appui du bouton.

if(digitalRead(bouton)==LOW && !contact) {

depart=millis();
appuiLong=0;
contact=1;

}

if(contact && millis()>depart+1000) {
appuiCourt=1;
}

if(firstContact && millis()>depart+3000) {
appuiLong=1;
}

if(appuiLong) appuiLong();
else if(appuiCourt) appuiCourt();

if(digitalRead()==HIGH && rebond==0) {
rebond=1;
appuiCourt=0;
appuiLong=0;
timeRebond=millis();

}

if(millis()>timeRebond+50 && rebond==1) {
contact=0;
rebond=0;
}

}

FP24V:
j'utilise des platines LKM1638 dont en voici une en pleine action sur mon bureau

le but pour moi est le suivant, si j'appuie brièvement sur le bouton, il ajoute +1 à un compteur, si j'appuie sur le bouton plusieurs seconde, dans un premier temps il va ajouté +1 au compteur tous les 500 ms, et au bout de 3 seconde, il ajoute +1 toutes les 100ms. Et si je relâche il arrête bien entendu.

pour le moment je n'ai pas l'idée de la chose.

pourriez vous me guider.

Merci d'avance Flo

bonjour
les TM1638 et TM1640 sont sympa à utiliser
au passage tu connais cet article de skywodd sur le sujet ? (recup possible de 16 contacts supplémentaires)

pour ton cas une solution est peut etre de passer par un tableau de temps associé à chaque bouton
et d'effectuer une alimentation de temps lors d'une detection 1 (utilisation de millis() )avec raz si detection à zero.
il "suffit" ensuite de verifier depuis combien de temps ton bouton est préssé pour reagir en conséquence

Artouste:
au passage tu connais cet article de skywodd sur le sujet ? (recup possible de 16 contacts supplémentaires)

oui c'est grâce à lui que j'ai trouvé ces engins, et son blog set une vrai mine d'or

@ ba@tto: je regarde et je te dit quoi.