J'ai créé un simulateur de train sur la base d'un vieux pupitre de locomotive. Il est presque terminé mais je bute encore sur une difficulté. Pour faire fonctionner l'avertisseur, il faut maintenir la touche "I" appuyée. J'utilise évidemment l'un des boutons du pupitre. Le code est le suivant
if (etatAvertisseur == LOW)
{
Keyboard.write('I');
}
Néanmoins, en utilisant train simulator, je constate que l'avertisseur reste en fonctionnement même si je relâche le bouton. En ouvrant un traitement de texte, j'ai constaté que la vitesse d'impression est très élevée. J'ai donc modifié le code avec la fonction delay.
if (etatAvertisseur == LOW)
{
Keyboard.write('I');
delay(16);
}
La valeur de 16 a été déterminée par itérations mais le résultat n'est pas très satisfaisant. L'avertisseur alterne démarrage et arrêt alors que je maintiens le bouton appuyé.
Merci pour cette réponse. Je viens d'essayer avec les fonctions keyboard.press() et keyboard.release() mais, malheureusement, une fois l'avertisseur démarré il ne s'arrête plus alors que j'ai relâché le bouton. Je constate sur un traitement de texte que la lettre "I" défile très vite lorsque j'appuie sur le bouton et qu'elle s'arrête lorsque je le relache.
Tu peux donner ton code entre balise < code>
Si tu as la lettre I qui s'affiche en double, c'est que tu envois bien le caractère à travers le clavier virtuel.
Si l'avertisseur reste actif, alors que tu ne vois plus de i, c'est que la détection de l'arrêt de la touche i, ne doit pas ce faire correctement.
essayez ce code où pinCloche est le N° de broche connectée au bouton (dans le dessin ci dessus, ce serait 2)
// variable globale
bool clocheActive = false;
...
// dans votre code
// si bouton appuyé et qu'on n'a pas encore envoyé la touche
if (digitalRead(pinCloche) == LOW && !clocheActive) {
Keyboard.press('B');
clocheActive = true;
}
// si bouton relâché et qu'on n'a pas envoyé le relâchement de la touche
if (digitalRead(pinCloche) == HIGH && clocheActive) {
Keyboard.release('B');
clocheActive = false;
}
Merci de votre réponse. J'ai implémenté le code. Il permet de n'écrire qu'une seule lettre sur le traitement de texte. Le problème est le suivant : pour que la cloche sonne, il faut maintenir la touche "B" appuyé.
le code tel qu'il est maintient B appuyé puis le relâche plus tard
certaines applications gèrent l'auto-repeat, d'autres non ou alors pour certaines touches seulement
ici il semble donc que votre application ne gère pas l'auto-repeat, il faut donc que l'arduino envoie des appuis réguliers, on n'a pas besoin de press et release dans ce cas
// variables globales
const byte pinCloche = ... ; // le bon N° de pin pour le bouton
bool clocheActive = false;
unsigned long debutCloche;
...
// dans votre code
// si bouton appuyé et qu'on n'a pas encore envoyé la touche
if (!clocheActive && digitalRead(pinCloche) == LOW) {
Keyboard.print('B');
debutCloche = millis();
clocheActive = true;
}
// si bouton relâché et qu'on n'a pas noté le relâchement de la touche
if (clocheActive && digitalRead(pinCloche) == HIGH) {
clocheActive = false;
}
// si la cloche est active et que le temps entre 2 appuis (ici 100ms) est écoulé, on renvoie un appui
if (clocheActive && millis() - debutCloche >= 100) {
Keyboard.print('B');
debutCloche = millis();
}
(j'ai édité le post ce dessus pour mettre le test sur le booléen en premier, ça évite de faire le digitalRead dans bien des cas et donc ça améliorera la performance)