Bouton et Envoi de commandes

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

Up!

loop tourne en boucle indéfiniment, BP appuyé ou pas. quand tu appuies sur le BP, l'exécution du code peut être sur n'importe lequel des 4 liste(). Déplace la gestion du BP dans loop. Et gère le message à envoyer dans ta fonction.

Merci tahitibob35. Je vais potasser ça sous ce nouvel angle. parce que du coup ça change tout concernant la fonction liste si la liste des commandes doit s’y retrouver.