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.