Void qui bloque la Void Loop

Bonsoir à tous, bon je débute avec l'arduino et j'arrive à faire quelques petits choses mais à part, cet aprem j'ai décidé de mettre ces petites choses bouts à bouts, mais ça ne marche pas comme je veut.

Donc j'ai un DS1307 qui marche, un LCD 24x8 qui marche avec le DS1307, par contre j'ai voulut intégrer un récepteur IR avec deux LED une Rouge et une verte, la rouge doit rester allumer tant que l'on a pas envoyé le bon signal par la télécommande infrarouge et la verte s'allume une fois le bon signal envoyé, et cela juste une seule fois (code qui marche quand il est seul, sans le LCD ni l'horloge).

Cependant en mettant bout à bout les diverses code du DS1307, du LCD et de l'IR, le void loop() bloque si j’intègre le void IR(), ce qui fait que le temps reste figé sur le LCD, par contre la LED rouge est allumé, et si j'envoi le bon signal IR, la LED verte s'allume (la rouge s'éteint), et l'heure se met à jour avec l'heure à laquelle j'ai envoyé le signal mais reste toujours figé.
Si je vire le void IR() du void loop(), l'heure avance normalement.

Donc ma question est, qu'est ce que j'ai loupé?
Qu'est ce que je dois aller lire?
Et comment résoudre mon soucis?

Voila le code:

#include <WProgram.h>
#include "Wire.h"
#include <M50530.h>
#include "DS1307.h"

// -------------------Déclaration IR----------------------
#include "ircodes.h" // Inclus la librairie de code "Send" par la telecommande.
//Brancher le out du capteur IR sur le Pin 19 d'un arduino Mega qui correspond au PinD2
#define IRpin_PIN PIND
#define IRpin 2
#define MAXPULSE 60000 // Definit le maximunm d'impulsion écouté durant - 60000 = 60 secondes
#define RESOLUTION 20  // Raffraichissement du delais d'attente du code, plus c'est haut plus c'est precis, mais si trop haut les valeurs seront fausses.
#define FUZZINESS 20  // pourcentage de la tolérance d'erreur entre les valeurs d'onde IR capte.
// On va stocker 100 paires de pulsation "send" (this is -a lot-)
uint16_t pulses[100][2]; // les cents paires ont deux statut : haut et bas
uint8_t currentpulse = 0; // index ou les pulsations seront stocke
//---------------------------------------------------------

int IR_Recept = 0; // variable de réception signal IR
int ETAT_LEDRouge  = 1; // variable etat de la LED Rouge
int ETAT_LEDVerte = 0; // variable etat de la LED Verte
const int LEDVerte = 18; //declaration constante de broche 
const int LEDRouge = 17; //declaration constante de broche 




void setup()
{
 Wire.begin(); // Lance Librairie Wire
 Serial.begin(9600);
 pinMode(LEDVerte, OUTPUT); //met la broche en sortie
 pinMode(LEDRouge, OUTPUT); //met la broche en sortie
 
// wait for power up
     delay(250);
     // Initialisation LCD
     LCDInit();
// Mode LCD
     LCDSetEntryMode( 80 | 64 );
// Mode du Curseur
     LCDSetDisplayMode(dmDisplayOn | dmCursorOn | dmCursorBlink | dmCharacterBlink);

//Configuration LCD 24x8
	 LCDSend( 0, LCD_CMD_SETFUNCTIONMODE | sfIO4BIT | sfFont5x8 | 8 );
	 LCDSend( 0, LCD_CMD_SETENTRYMODE | emCursorIncWrite | emDisplayNoChange );
	 LCDSetDisplayMode(dmDisplayOn | dmCursorOn | dmCursorBlink | dmCharacterBlink);
 
//Affiche du texte à sur LCD 24x8
     LCDSetCursorPos(0,0);
     LCDWrite((const char*)"LCD - 24x8 characters");
     LCDSetCursorPos(3,0);
     LCDWrite((const char*)"Samsung 0282A");
     LCDSetCursorPos(5, 16);
     LCDWrite((const char*)"test OK!!");
     LCDSetCursorPos(7, 21);
     LCDWrite((const char*)":-)");
     delay(2000);
     cls();//Efface LCD 24x8
}
void loop()
{
  digitalWrite(LEDVerte,ETAT_LEDVerte); // on/off LED Verte fonction ETAT_LED 
  digitalWrite(LEDRouge,ETAT_LEDRouge); // on/off LED Rouge fonction ETAT_LED
LCDSetCursorPos(1,0);
LCDWrite((const char*)"En Attente D'activation");
  char heureString[9] = ""; //Nombre Char dans string heure
  char dateString[9] = ""; //Nombre Char dans string date
 
  // Affecte les valeurs de la date et heure actuelle:
  int hour = RTC.get(DS1307_HR,true);
  int mins = RTC.get(DS1307_MIN,false);
  int second =RTC.get(DS1307_SEC,false);
  int date =RTC.get(DS1307_DATE,false);
  int month =RTC.get(DS1307_MTH,false);
  int year =RTC.get(DS1307_YR,false);
  //

  sprintf(heureString, "%02d:%02d:%02d", hour, mins, second); //Definit la forme string Time
  LCDSetCursorPos(0,0);
  LCDWrite(heureString); //Affiche sur LCD la string heure
  sprintf(dateString, "%02d/%02d/%02d", date, month, year); //Definit la forme string Date
  LCDSetCursorPos(0,14);
  LCDWrite(dateString); //Affiche sur LCD la string Date
  LCDSetCursorPos(7,23);
  
  IR();

	}

   




void IR() {
  int numberpulses;

  numberpulses = listenForIR();
  while (IR_Recept == 1);{
  if (IRcompare(numberpulses, PowerPlaySignal)) { // compare la code envoye avec celui de ircode.h 
     ETAT_LEDRouge = ETAT_LEDRouge -1; // change etat LED Rouge
     ETAT_LEDVerte = ETAT_LEDVerte +1; // change etat LED Verte 
     IR_Recept ++;
    }
	}
  }
 


boolean IRcompare(int numpulses, int Signal[]) {
  
  for (int i=0; i< numpulses-1; i++) {
    int oncode = pulses[i][1] * RESOLUTION / 10;
    int offcode = pulses[i+1][0] * RESOLUTION / 10;
    
    
    // check to make sure the error is less than FUZZINESS percent
    if ( abs(oncode - Signal[i*2 + 0]) <= (Signal[i*2 + 0] * FUZZINESS / 100)) {
    } else {
      return false;
    }
    
    if ( abs(offcode - Signal[i*2 + 1]) <= (Signal[i*2 + 1] * FUZZINESS / 100)) {
    } else {
      // we didn't match perfectly, return a false match
      return false;
    }
  }
  // Everything matched!
  return true;
}

int listenForIR() {
  currentpulse = 0;
  
  while (1) {
    uint16_t highpulse, lowpulse; // temporary storage timing
    highpulse = lowpulse = 0; // start out with no pulse length
  
// while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {
       // pin is still HIGH

       // count off another few microseconds
       highpulse++;
       delayMicroseconds(RESOLUTION);

       // If the pulse is too long, we 'timed out' - either nothing
       // was received or the code is finished, so print what
       // we've grabbed so far, and then reset
       if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
         return currentpulse;
       }
    }
    // we didn't time out so lets stash the reading
    pulses[currentpulse][0] = highpulse;
  
    // same as above
    while (! (IRpin_PIN & _BV(IRpin))) {
       // pin is still LOW
       lowpulse++;
       delayMicroseconds(RESOLUTION);
       if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
         return currentpulse;
       }
    }
    pulses[currentpulse][1] = lowpulse;

    // we read one high-low pulse successfully, continue!
    currentpulse++;
  }
}

Merci à vous de vos futurs réponses.

J'ai parcouru ton code en diagonale mais je vois de belle boucles dans tes méthodes de la réception ir genre "while(1)" qui peuvent coincé la continuation de la fonction loop (qui fonctionne comme une boucle infinie en quelque sorte), donc ici je vois bien le code se bloqué en attendant la réception d'un certain événement ir.

tant que l'on a pas envoyé le bon signal par la télécommande

Dis toi que la fonction loop c'est comme un "while(1)" ou "while(true)" une boucle infinie elle exécute les instructions qui se trouve dedans indéfiniment, pour que ses instructions soient exécuter à chaque tour de boucle il ne faut pas la bloqué de l'intérieure comme avec tes fonctions ir() qui attend un événement, donc ne reviens sur le reste du code (lcd ici) que quand la ou les conditions sont valide (d’où l'affichage qui se rafraichis et ce bloque à nouveau).

loop{ lcd->ir(j'attend un signal)->lcd->ir(j'attend un signal)->ldc->ir(j'attend un signal)->lcd->ir(j'attend un signal)->lcd->ir(j'attend un signal)->lcd-> ................. }

ça serait pas plus simple d'utiliser les interruptions ?

Salut Salut, merci pour ton aide Osaka, en fait j'ai complétement repris le code, et j'ai rajouté la lib IRremote, qui marche mieux que le code que j'avais pris pour le code plus haut.....

voila donc le p'tit bout de code qui fonctionne:

//LCD 24x8 M50530, Voir ici < http://www.ms-netpage.de/images_b/lcd/Seiko%20C338008,%20Samsung%200282A.pdf > pour le data et le contraste
// Les Pin Data correspondent au PORTB d'un Atmega2560, à voir pour conversion pour Atmega168
// Voir ici < http://arduino.cc/en/uploads/Hacking/Atmega168PinMap2.png >
// Et là < http://arduino.cc/en/uploads/Hacking/PinMap2560.png >
// Et pourquoi pas ici < http://arduino.cc/forum/index.php?action=profile%3Bu%3D55308%3Bsa%3DshowPosts >
// Ou encore là < http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1268859549%2Fall >
// DB0 à DB3 connecté à la masse
// DB4 Sur Pin53
// DB5 Sur Pin52
// DB6 Sur Pin51
// DB7 Sur Pin50
// Cette fois c'est sur le PORTA de l'Atmega2560 que l'on branche les Pin LCD 24x8...
// RW Sur Pin26
// IOC1 Sur Pin29
// IOC2 Sur Pin27
// EX Sur Pin28

//Shield DS1307
// pin SDA sur Arduino MEGA Digital pin 20
// pin SCL sur Arduino MEGA Digital pin 21
// pin GND sur GND
// pin VCC sur 5V

//NES Cablage, Voir ici < http://code.google.com/p/nespad/ > pour les couleurs de cables
// Blanc sur 5V
// Marron sur GND
// Jaune sur Arduino MEGA Digital pin 49
// rouge sur Arduino MEGA Digital pin 48
// orange sur Arduino MEGA Digital pin 47
*/

#include "WProgram.h"
#include "Wire.h"
#include "NESpad.h"
#include "LCD4884.h"
#include "DS1307.h"
#include "M50530.h"
#include "IRremote.h"

#include "marqueur_bmp.h" // Image Bitmap à inclure dans le dossier qui contient le Programme (xxx.pde)
#include "splash_bmp.h" // Image Bitmap à inclure dans le dossier qui contient le Programme (xxx.pde)
#include "razor_bmp.h" // Image Bitmap à inclure dans le dossier qui contient le Programme (xxx.pde)
NESpad nintendo = NESpad(47,48,49); // Mettre Pin NES strobe/clock/data correspondant pin Arduino Analog -- see the pinout in readme.txt
byte state = 0; // déclare Byte de réception signal PAD NES
const float MULTIPLIER = 0.48828;
int IR_Recept = 0; // variable de réception signal IR
int ETAT_LEDRouge = 1; // variable etat de la LED Rouge
int ETAT_LEDVerte = 0; // variable etat de la LED Verte
const int LEDVerte = 18; //declaration constante de broche
const int LEDRouge = 17; //declaration constante de broche
int receiver = 19; // pin 1 of IR receiver to Arduino Mega digital pin 19
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;

void setup()
{
// Réglage Horloge DS1307 : Décommenter la partie suivante et mettez vos valeurs pour Régler l'horloge
/*
RTC.stop();
RTC.set(DS1307_SEC,0); // Secondes
RTC.set(DS1307_MIN,00); // Minutes
RTC.set(DS1307_HR,22); // Heures
RTC.set(DS1307_DOW,0); // Jour de la semaine (0=Dimanche, 7=Samedi)
RTC.set(DS1307_DATE,9); // Jour du mois
RTC.set(DS1307_MTH,10); // Mois
RTC.set(DS1307_YR,11); // Année
RTC.start();
*/
Wire.begin(); // Lance Librairie Wire
Serial.begin(9600);
// LCD Graphique 4884
lcd.LCD_init(); // Initialises LCD 4884
lcd.LCD_clear(); // Efface LCD 4884
lcd.LCD_draw_bmp_pixel(0,0, marqueur_bmp, 84,48);//Affichage image Bitmap pour tester LCD 4884



delay(1000);



lcd.LCD_draw_bmp_pixel(0,0, splash_bmp, 84,48);//Affichage image Bitmap pour tester LCD 4884



delay(1000);



lcd.LCD_draw_bmp_pixel(0,0, razor_bmp, 84,48);//Affichage image Bitmap pour tester LCD 4884



delay(1000);



lcd.LCD_clear(); // Efface LCD 4884
// Récepteur IR
pinMode(LEDVerte, OUTPUT); //met la broche en sortie
pinMode(LEDRouge, OUTPUT); //met la broche en sortie
irrecv.enableIRIn(); // Lance le receipt IR
// LCD 24x8



LCDInit();// Initialisation LCD 24x8



LCDSetEntryMode( 80 | 64 );// Mode LCD 24x8



LCDSetDisplayMode(dmDisplayOn | dmCursorOn | dmCursorBlink | dmCharacterBlink);// Mode du Curseur LCD 24x8
//Configuration LCD 24x8



LCDSend( 0, LCD_CMD_SETFUNCTIONMODE | sfIO4BIT | sfFont5x8 | 8 );



LCDSend( 0, LCD_CMD_SETENTRYMODE | emCursorIncWrite | emDisplayNoChange );



LCDSetDisplayMode(dmDisplayOn | dmCursorOn | dmCursorBlink | dmCharacterBlink);
//Affiche du texte sur LCD 24x8 pour le tester



LCDSetCursorPos(0,0);



LCDWrite((const char*)"LCD - 24x8 characters");



LCDSetCursorPos(3,0);



LCDWrite((const char*)"Samsung 0282A");



LCDSetCursorPos(5, 16);



LCDWrite((const char*)"test OK!!");



LCDSetCursorPos(7, 21);



LCDWrite((const char*)"8D");



delay(1000);



cls();//Efface LCD 24x8
}

void loop()
{
digitalWrite(LEDVerte,ETAT_LEDVerte); // on/off LED Verte fonction ETAT_LED
digitalWrite(LEDRouge,ETAT_LEDRouge); // on/off LED Rouge fonction ETAT_LED
char heureString[9] = ""; //Nombre Char dans string heure
char dateString[11] = ""; //Nombre Char dans string date
// Affecte les valeurs de la date et heure actuelle:
int hour = RTC.get(DS1307_HR,true);
int mins = RTC.get(DS1307_MIN,false);
int second =RTC.get(DS1307_SEC,false);
int date =RTC.get(DS1307_DATE,false);
int month =RTC.get(DS1307_MTH,false);
int year =RTC.get(DS1307_YR,false);
// Affiche l'heure et la date sur le LCD 24x8
sprintf(heureString, "%02d:%02d:%02d", hour, mins, second); //Definit la forme string Time
LCDSetCursorPos(0,0);
LCDWrite(heureString); //Affiche sur le LCD 24x8 la string heure
sprintf(dateString, "%02d/%02d/%02d", date, month, year); //Definit la forme string Date
LCDSetCursorPos(0,14);
LCDWrite(dateString); //Affiche sur le LCD 24x8 la string Date
IR_Launch();
state = nintendo.buttons();
char NESString[1] = "";
sprintf(NESString,"A:%03d", state);
lcd.LCD_write_string(0,2, NESString, MENU_NORMAL);
//Affiche Texte en fonction touche PAd NES




if(state == 1){



lcd.LCD_write_string(0,4, " ", MENU_NORMAL);



lcd.LCD_write_string(0,4, "Bouton A", MENU_NORMAL);



}




if(state == 2){



lcd.LCD_write_string(0,4, " ", MENU_NORMAL);



lcd.LCD_write_string(0,4, "Bouton B", MENU_NORMAL);



}




if(state == 8){



lcd.LCD_write_string(0,4, " ", MENU_NORMAL);



lcd.LCD_write_string(0,4, "Bouton Start", MENU_NORMAL);



}




if(state == 4){



lcd.LCD_write_string(0,4, " ", MENU_NORMAL);



lcd.LCD_write_string(0,4, "Bouton Select", MENU_NORMAL);



}




if(state == 16){



lcd.LCD_write_string(0,4, " ", MENU_NORMAL);



lcd.LCD_write_string(0,4, "Bouton Haut", MENU_NORMAL);



}




if(state == 32){



lcd.LCD_write_string(0,4, " ", MENU_NORMAL);



lcd.LCD_write_string(0,4, "Bouton Bas", MENU_NORMAL);



}




if(state == 64){



lcd.LCD_write_string(0,4, " ", MENU_NORMAL);



lcd.LCD_write_string(0,4, "Bouton Gauche", MENU_NORMAL);



}




if(state == 128){



lcd.LCD_write_string(0,4, " ", MENU_NORMAL);



lcd.LCD_write_string(0,4, "Bouton Droit", MENU_NORMAL);



}

if(IR_Recept == 1)
{
LCDSetCursorPos(1,0);
LCDWrite((const char*)" Temps Restant: ");
LCDSetCursorPos(2,0);
LCDWrite((const char*)" En cours!! ^^");
}
else{
LCDSetCursorPos(1,0);
LCDWrite((const char*)"En Attente D'activation");
}
}

void IR_Launch() // Fonction Signal IR lancement partie
{
if (irrecv.decode(&results)) // Un Signal a t'il était reçu ?
{
if (results.value == 0xFF00FF) // si le code IR reçu est celui qu'il faut (FF00FF) correspond boutons power sur télécommande
{
ETAT_LEDRouge = !ETAT_LEDRouge; // change etat LED Rouge
ETAT_LEDVerte = !ETAT_LEDVerte; // change etat LED Verte
IR_Recept = IR_Recept + 1;
for (int z=0; z<2; z++) // ignore 2nd et 3rd signal répétition >>> A VOIR c'est pour les télécommandes a protocole Sony.......
{
irrecv.resume(); // reçoit la prochaine valeur IR
}
}
}

}

A+