Bonjour.
Je cherche depuis un bon moment à envoyer une liste de commandes infra-rouge RC5 une par une par appui sur un bouton pour programmer un module télécommande blue-tooth/infra-rouge. J'ai réussi à faire le programme en C en passant par un fichier txt et un tableau de structure, mais lors du passage à Arduino (en fait un module simplifié genre boarduino), j'ai dû laisser de coté le tableau et le fichier texte.
Voici mon code en C:
#include <stdlib.h>
#include <stdio.h>
void liste(char *label, unsigned long value);
int main(int argc, char *argv[]) {
liste ("KEY_POWER", 0x17BD);
liste("KEY_TV", 0x179C);
liste("KEY_VIDEO", 0x1798);
liste("KEY_AUDIO", 0x1799);
return EXIT_SUCCESS;
}
void liste(char *label, unsigned long value) {
int bits = 32;
char appuiBouton[3];
printf("Appuyez sur une touche pour continuer ...");
fgets(appuiBouton, sizeof appuiBouton, stdin);
if (appuiBouton != 0) {
printf("%s\n", label);
int n;
for (n = 0; n < 3; ++n) {
printf("%08lX %d\n", value, bits);
}
}
}
Lors de l'appui sur une touche du clavier, le programme affiche la première commande répétée trois fois précédée du nom de la commande. Lors d'un autre appui, il m'envoie la seconde commande de la liste et ainsi de suite jusquà la fin de la liste comme attendu.
Et celui pour Arduino :
#include <IRremote.h>
IRsend irsend;
const int buttonPin = 2; // Bouton-poussoir en broche 2
int buttonState = 0; // Variable pour enregistrer l'état du bouton-poussoir
int bits = 32;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT); // Broche bouton-poussoir comme entrée
}
void liste(char *label, unsigned long value) {
int i = 0;
buttonState = digitalRead(buttonPin); // Interrogation du bouton-poussoir
if (buttonState == HIGH) { // Si le bouton-poussoir est appuyé
Serial.println(label); // On affiche le label
for (int i=0; i<3; i++) { // La commande est envoyée 3 fois de suite
irsend.sendRC5(value, bits);
delay(40);
}
}
i++; // La ligne est incrémentée de 1 - on passe à la ligne suivante
}
void loop() {
liste ("KEY_POWER", 0x17BD);
liste("KEY_TV", 0x179C);
liste("KEY_VIDEO", 0x1798);
liste("KEY_AUDIO", 0x1799);
}
Si j'appuie sur le bouton, il m'envoie bien la première commande comme souhaité et si je maintiens le bouton appuyé, il m'envoie la liste des commandes dans l'ordre puis reprend au début de la liste. Mais si j'appuie plusieurs fois successivement sur le bouton, il m'envoie les commandes mais dans un ordre aléatoire.
Donc comment modifier ce code pour obtenir le même résultat qu'avec le code en C : un appui bouton = une commande, un autre appui bouton = la commande suivante, etc
Merci par avance de votre aide