fusion programme heure et réception 434Mhz

Bonjour,
Lycéen de 17 ans ayant un projet en électronique avec deux arduino et n'ayant pas beaucoup de temps pour approfondir le language arduino et pour finaliser la programmation de mon projet, je sollicite votre aide pour réussir a fusionner deux programmes assez différent.Un programme qui affiche l'heure, la date ainsi que le jour de la semaine sur un afficheur LCD (trouvé sur internet) et un programme qui reçoit un message envoyé par un émetteur 434Mhz sur un récepteur 434Mhz (Snootlab). J'aimerais modifié le programme pour qu'au moment ou il y a réception du message envoyé, on affiche l'heure et la date sur l'afficheur.

Voici le code pour afficher l'heure et la date, relié avec le fichier structure.h :

#include <Wire.h> // Inclusion de la librairie Wire pour la gestion de l'I2C qui nous permettra de communiquer avec le DS1307
#include "structure.h" // Inclusion de notre fichier de structure qui définit le type "Date"
#include <avr/pgmspace.h> // Inclusion de la librairie PGMSPACE qui permet l'utilisation de PROGMEM
#include <LiquidCrystal.h> // Inclusion de la librairie LiquidCrystal qui permet de gérer un écran lcd (ici 2x16)
 
#define PSTR2(s) (__extension__({static unsigned char __c[] PROGMEM = (s); &__c[0];})) // Macro permettant de stocker facilement du texte en PROGMEM
#define DS1307_ADDRESS 0x68 // Adresse I2C du module DS1307
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Création de l'objet lcd, notre lcd sera câbler sur les broches D2~D5 (bus de données) D11 (ENABLE) et D12 (RS)
Date date; // Création de l'objet date qui contiendra les données sur la date/heure courante
 
// Fonction de convertion bcd -> décimal
byte bcd2dec(byte bcd) {
  return ((bcd / 16 * 10) + (bcd % 16)); 
}
 
// Fonction de convertion decimal -> bcd
byte dec2bcd(byte dec) {
  return ((dec / 10 * 16) + (dec % 10));
}
 
// Setup()
void setup() {
  lcd.begin(16, 2); // Initialisation du lcd
  Serial.begin(9600); // Initialisation du port série
  Wire.begin(); // Initialisation du bus I2C
  synchronisation(&date); // Tentative de synchronisation avec le pc
}
 
// loop()
void loop() {
  lire(&date);
  affichage(&date); // Affichage de l'heure
  delay(1000); // Rafraichissement de 1Hz

}
 
// Fonction configurant le DS1307 avec la date/heure fourni
void ecrire(Date *date) {
  Wire.beginTransmission(DS1307_ADDRESS); // Début de transaction I2C
  Wire.write(dec2bcd(date->secondes)); // Envoi des données
  Wire.write(dec2bcd(date->minutes));
  Wire.write(dec2bcd(date->heures));
  Wire.write(dec2bcd(date->jourDeLaSemaine));
  Wire.write(dec2bcd(date->jour));
  Wire.write(dec2bcd(date->mois));
  Wire.write(dec2bcd(date->annee));
  Wire.write(0); // Redémarre l'oscillateur du DS1307
  Wire.endTransmission(); // Fin de transaction I2C
}
 
// Fonction récupérant l'heure et la date courante à partir du DS1307
void lire(Date *date) {
  Wire.beginTransmission(DS1307_ADDRESS); // Début de transaction I2C
  Wire.write(0); // Demande les info à partir de l'adresse 0 (soit toutes les info)
  Wire.endTransmission(); // Fin de transaction I2C
 
  Wire.requestFrom(DS1307_ADDRESS, 7); // Récupère les info (7 octets = 7 valeurs correspondant à l'heure et à la date courante)
 
  date->secondes = bcd2dec(Wire.read()); // stockage et conversion des données reçu
  date->minutes = bcd2dec(Wire.read());
  date->heures = bcd2dec(Wire.read() & 0b111111);
  date->jourDeLaSemaine = bcd2dec(Wire.read());
  date->jour = bcd2dec(Wire.read());
  date->mois = bcd2dec(Wire.read());
  date->annee = bcd2dec(Wire.read());
}
 
// Fonction vérifiant la présence d'une demande de synchronisation en provenance du pc et récupérant les données de synchronisation ou à défaut récupérant la date et l'heure courante 
void synchronisation(Date *date) {
  Serial.print("SYNC"); // Envoi de la commande de synchronisation
  int i;
  for(i = 0 ; (Serial.available() < 3) && (i < 6) ; i++) // Attente de 3s max 
    delay(500);
  if(i != 6) { // Il n'y as pas eu de timeout
    if(Serial.read() == 'A') 
      if(Serial.read() == 'C')
        if(Serial.read() == 'K') { // Si le pc à répondu par une commande ACK c'est que la synchronisation peut commencer
          while(Serial.available() < 7); // Attente des 7 octets de configuration
          date->secondes = Serial.read(); // Réception et conversion des données reçu
          date->minutes = Serial.read();
          date->heures = Serial.read();
          date->jourDeLaSemaine = Serial.read();
          date->jour = Serial.read();
          date->mois = Serial.read();
          date->annee = Serial.read();
          ecrire(date); // Stockage dans le DS1307 des donnes reçu
        }
  } 
  else
    lire(date); // Si le pc n'as pas répondu à la demande de synchronisation la fonction ce content de lire les données courante du DS1307
}
 
// Fonction affichant au maximum une ligne de 16 caractéres depuis la PROGMEM sur l'écran lcd
void lcd_print(prog_uchar *data){
  char lcdBuf[17] = {0};
  byte c, i = 0;
  c = (char)pgm_read_byte(data);
  while(c != 0 && i < 17){
    lcdBuf[i++] = c;
    c =(char)(pgm_read_byte(++data));
  }
  lcd.print(lcdBuf);
}

 
// Fonction effacant l'écran à la ligne spécifié d'un point debut à un point fin inclut
void clear(byte ligne, byte debut, byte fin) {
  for(byte i = debut ; i <= fin ; i++){
    lcd.setCursor(i, ligne);
    lcd.print(' ');
  }
}
 
// Fonction affichant les données contenu dans la structure Date passé en référence
void affichage(Date *date) {

  lcd.print("Courrier recu le");
  lcd.setCursor(0, 1); // Place le curseur à (0,0)
  switch(date->jourDeLaSemaine) { // Affiche sur 3 lettres le jour en cours
  case 1:
    lcd_print(PSTR2("LU "));
    break;
 
  case 2:
    lcd_print(PSTR2("MA "));
    break;
 
  case 3:
    lcd_print(PSTR2("ME "));
    break;
 
  case 4:
    lcd_print(PSTR2("JE "));
    break;
 
  case 5:
    lcd_print(PSTR2("VE "));
    break;
 
  case 6:
    lcd_print(PSTR2("SA "));
    break;
 
  case 7:
    lcd_print(PSTR2("DI "));
    break;
  }
   
  lcd.setCursor(3, 1); // Place le curseur à (0,4) (juste aprés les 3 lettres du jour + espace)
  lcd.print(date->jour / 10, DEC);// Affichage du jour sur deux caractéres
  lcd.setCursor(4, 1);
  lcd.print(date->jour % 10, DEC);
  lcd.setCursor(5, 1);
  lcd.print("/");
  lcd.setCursor(6, 1);
  lcd.print(date->mois / 10, DEC);// Affichage du mois sur deux caractéres
  lcd.setCursor(7, 1);
  lcd.print(date->mois % 10, DEC);
  lcd.setCursor(9, 1);
  lcd.print("a");
   
 
  lcd.setCursor(11, 1); // Place le curseur en début de la 2eme ligne
  lcd.print(date->heures / 10, DEC); // Affichage de l'heure sur deux caractéres
  lcd.setCursor(12, 1);
  lcd.print(date->heures % 10, DEC);
  lcd.setCursor(13, 1);
  lcd.print("h");
  lcd.setCursor(14, 1);
  lcd.print(date->minutes / 10, DEC); // Affichage des minutes sur deux caractéres
  lcd.setCursor(15, 1);
  lcd.print(date->minutes % 10, DEC);
}

Et le programme de réception encore très basique:

#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !

void setup()
{
    Serial.begin(9600);    // On initialise "le serial monitor", j'ai laissé 9600 bauds ici car c'est la valeur par défaut mais vous pouvez la modifier. Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
    vw_setup(2000);                 // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
    vw_set_rx_pin(9);             // C'est sur cette broche que l'on reliera les broches DATA du récepteur, vous pouvez changez de broche si vous le désirez.
    vw_rx_start();                    // On démarre le récepteur.
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
    {
    int i;
     // Un message est reçu.

    for (i = 0; i < buflen; i++)
    {
        Serial.write(buf[i]);  
        }
    Serial.println(""); // On saute une ligne afin d'avoir plus de clarté.
     }
}

PS: le programme de l'horloge viens de ce site: [Tutoriel Arduino] Horloge RTC (DS1307) + librairie LiquidCrystal | Skyduino - Le DIY à la française mais je l'ai très légèrement modifié car il y avait des fonctions dont je n'avais pas besoin
PPS: Mon projet est la boîte aux lettres inteligente, c'est à dire au moment ou il y a une lettre dans la boite il doit y avoir un message sur un afficheur dans la maison qui indique a quel heure et date on a reçu du courrier.

Merci d'avance pour votre aide

Bonjour,

Franchement est-ce que tu as cherché avant de demander ?
Tu as trois ligne dans setup() et 1 ligne dans loop() à copier/coller :zipper_mouth_face:

Voila un exemple :

// ...
void setup() {
  lcd.begin(16, 2); // Initialisation du lcd
  Serial.begin(9600); // Initialisation du port série

  vw_setup(2000); 
  vw_set_rx_pin(9);
  vw_rx_start();  

  Wire.begin(); // Initialisation du bus I2C
  synchronisation(&date); // Tentative de synchronisation avec le pc
}
 
void loop() {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) {
    // Faire ce que tu veut avec le message recu
    lire(&date);
    affichage(&date); // Affichage de l'heure
    delay(1000); // Rafraichissement de 1Hz
  }
}

// ...

J'ai déjà essayé cela et il y avais des confusions, ça ne marchait pas... :~

Autan pour moi, j'ai fais l'erreur la plus stupide au monde, j'ai juste oublié d'inclure la librairie Virtualwire désolé de dérangement.. :sweat_smile:

ben57380:
Autan pour moi, j'ai fais l'erreur la plus stupide au monde, j'ai juste oublié d'inclure la librairie Virtualwire désolé de dérangement.. :sweat_smile:

Quand tu as un code qui ne marche pas le mieux c'est de l'ajouter dans le post pour montrer que tu as au moins essayé :wink:
Si tu savais le nombre de personne qui arrive sans avoir rien cherché et qui demande du tout cuit tu serait étonné.

ben57380:
Faut-il faire une autre fonction? Ou même une structure?

Déjà ce serait bien d'avoir le code en question ...

Désolé... :cold_sweat:
Le code en question est comme celui plus haut:
Même en laissant juste la modification du setup sans le loop, ça ne marche pas... :confused:

#include <Wire.h> // Inclusion de la librairie Wire pour la gestion de l'I2C qui nous permettra de communiquer avec le DS1307
#include "structure.h" // Inclusion de notre fichier de structure qui définit le type "Date"
#include <avr/pgmspace.h> // Inclusion de la librairie PGMSPACE qui permet l'utilisation de PROGMEM
#include <LiquidCrystal.h> // Inclusion de la librairie LiquidCrystal qui permet de gérer un écran lcd (ici 2x16)
#include <VirtualWire.h>
#define PSTR2(s) (__extension__({static unsigned char __c[] PROGMEM = (s); &__c[0];})) // Macro permettant de stocker facilement du texte en PROGMEM
#define DS1307_ADDRESS 0x68 // Adresse I2C du module DS1307
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Création de l'objet lcd, notre lcd sera câbler sur les broches D2~D5 (bus de données) D11 (ENABLE) et D12 (RS)
Date date; // Création de l'objet date qui contiendra les données sur la date/heure courante
 
// Fonction de convertion bcd -> décimal
byte bcd2dec(byte bcd) {
  return ((bcd / 16 * 10) + (bcd % 16)); 
}
 
// Fonction de convertion decimal -> bcd
byte dec2bcd(byte dec) {
  return ((dec / 10 * 16) + (dec % 10));
}


 
// Fonction configurant le DS1307 avec la date/heure fourni
void ecrire(Date *date) {
  Wire.beginTransmission(DS1307_ADDRESS); // Début de transaction I2C
  Wire.write(dec2bcd(date->secondes)); // Envoi des données
  Wire.write(dec2bcd(date->minutes));
  Wire.write(dec2bcd(date->heures));
  Wire.write(dec2bcd(date->jourDeLaSemaine));
  Wire.write(dec2bcd(date->jour));
  Wire.write(dec2bcd(date->mois));
  Wire.write(dec2bcd(date->annee));
  Wire.write(0); // Redémarre l'oscillateur du DS1307
  Wire.endTransmission(); // Fin de transaction I2C
}
 
// Fonction récupérant l'heure et la date courante à partir du DS1307
void lire(Date *date) {
  Wire.beginTransmission(DS1307_ADDRESS); // Début de transaction I2C
  Wire.write(0); // Demande les info à partir de l'adresse 0 (soit toutes les info)
  Wire.endTransmission(); // Fin de transaction I2C
 
  Wire.requestFrom(DS1307_ADDRESS, 7); // Récupère les info (7 octets = 7 valeurs correspondant à l'heure et à la date courante)
 
  date->secondes = bcd2dec(Wire.read()); // stockage et conversion des données reçu
  date->minutes = bcd2dec(Wire.read());
  date->heures = bcd2dec(Wire.read() & 0b111111);
  date->jourDeLaSemaine = bcd2dec(Wire.read());
  date->jour = bcd2dec(Wire.read());
  date->mois = bcd2dec(Wire.read());
  date->annee = bcd2dec(Wire.read());
}
 
// Fonction vérifiant la présence d'une demande de synchronisation en provenance du pc et récupérant les données de synchronisation ou à défaut récupérant la date et l'heure courante 
void synchronisation(Date *date) {
  Serial.print("SYNC"); // Envoi de la commande de synchronisation
  int i;
  for(i = 0 ; (Serial.available() < 3) && (i < 6) ; i++) // Attente de 3s max 
    delay(500);
  if(i != 6) { // Il n'y as pas eu de timeout
    if(Serial.read() == 'A') 
      if(Serial.read() == 'C')
        if(Serial.read() == 'K') { // Si le pc à répondu par une commande ACK c'est que la synchronisation peut commencer
          while(Serial.available() < 7); // Attente des 7 octets de configuration
          date->secondes = Serial.read(); // Réception et conversion des données reçu
          date->minutes = Serial.read();
          date->heures = Serial.read();
          date->jourDeLaSemaine = Serial.read();
          date->jour = Serial.read();
          date->mois = Serial.read();
          date->annee = Serial.read();
          ecrire(date); // Stockage dans le DS1307 des donnes reçu
        }
  } 
  else
    lire(date); // Si le pc n'as pas répondu à la demande de synchronisation la fonction ce content de lire les données courante du DS1307
}
 
// Fonction affichant au maximum une ligne de 16 caractéres depuis la PROGMEM sur l'écran lcd
void lcd_print(prog_uchar *data){
  char lcdBuf[17] = {0};
  byte c, i = 0;
  c = (char)pgm_read_byte(data);
  while(c != 0 && i < 17){
    lcdBuf[i++] = c;
    c =(char)(pgm_read_byte(++data));
  }
  lcd.print(lcdBuf);
}

 
// Fonction effacant l'écran à la ligne spécifié d'un point debut à un point fin inclut
void clear(byte ligne, byte debut, byte fin) {
  for(byte i = debut ; i <= fin ; i++){
    lcd.setCursor(i, ligne);
    lcd.print(' ');
  }
}
 
// Fonction affichant les données contenu dans la structure Date passé en référence
void affichage(Date *date) {

  lcd.print("Courrier recu le");
  lcd.setCursor(0, 1); // Place le curseur à (0,0)
  switch(date->jourDeLaSemaine) { // Affiche sur 3 lettres le jour en cours
  case 1:
    lcd_print(PSTR2("LU "));
    break;
 
  case 2:
    lcd_print(PSTR2("MA "));
    break;
 
  case 3:
    lcd_print(PSTR2("ME "));
    break;
 
  case 4:
    lcd_print(PSTR2("JE "));
    break;
 
  case 5:
    lcd_print(PSTR2("VE "));
    break;
 
  case 6:
    lcd_print(PSTR2("SA "));
    break;
 
  case 7:
    lcd_print(PSTR2("DI "));
    break;
  }
   
      lcd.setCursor(3, 1); // Place le curseur à (0,4) (juste aprés les 3 lettres du jour + espace)
  lcd.print(date->jour / 10, DEC);// Affichage du jour sur deux caractéres
  lcd.setCursor(4, 1);
  lcd.print(date->jour % 10, DEC);
  lcd.setCursor(5, 1);
  lcd.print("/");
  lcd.setCursor(6, 1);
  lcd.print(date->mois / 10, DEC);// Affichage du mois sur deux caractéres
  lcd.setCursor(7, 1);
  lcd.print(date->mois % 10, DEC);
  lcd.setCursor(9, 1);
  lcd.print("a");
   
 
  lcd.setCursor(11, 1); // Place le curseur en début de la 2eme ligne
  lcd.print(date->heures / 10, DEC); // Affichage de l'heure sur deux caractéres
  lcd.setCursor(12, 1);
  lcd.print(date->heures % 10, DEC);
  lcd.setCursor(13, 1);
  lcd.print("h");
  lcd.setCursor(14, 1);
  lcd.print(date->minutes / 10, DEC); // Affichage des minutes sur deux caractéres
  lcd.setCursor(15, 1);
  lcd.print(date->minutes % 10, DEC);
}

 void setup() {
  lcd.begin(16, 2); // Initialisation du lcd
  Serial.begin(9600); // Initialisation du port série
  vw_set_rx_pin(9);

  Wire.begin(); // Initialisation du bus I2C
  synchronisation(&date); // Tentative de synchronisation avec le pc
}

void loop() {

    // Faire ce que tu veut avec le message recu
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) {
    lire(&date);
    affichage(&date); // Affichage de l'heure
    delay(1000); // Rafraichissement de 1Hz
  }
    
}

Je fais un message assez hors sujet mais c'est juste parce que ton code n'est pas forcément très beau :roll_eyes:

En général en c++ ou dans tout les langages, dès qu'on est dans une condition on met une tabulation de plus et tout ce qui est dans la même condition on le met au même niveau (je pense à ta fonction loop()), c'est une très bonne habitude à prendre de garder son code propre comme cela car il est beaucoup plus facile à lire pour sois et pour les autres après.

Ensuite, les boucles for se rédigent comme ça :

for(initialisationDeLaVariable ; condition ; actionAChaqueFinDeBoucle)

donc par exemple :

for(int i = 0 ; (Serial.available() < 3) && (i < 6) ; i++) // Attente de 3s max

Ça a l'avantage de libérer de la mémoire la variable i dès que la boucle for est finie.

Ce ne sont que des détails, mais si tu commence à programmer avec arduino, autant prendre de bonnes habitudes dès le début !

Je programmerais plus en arduino mais je m'en souviendrais pour le java et le c++.
Personne peut m'aider pour mon problème?
Il me reste juste 2h pour finir ce programme et donc ma partie du projet :disappointed_relieved:

Le prof m'a dit que le code est juste mais je n'arrive pas à le faire marcher et je ne vois vraiment pas quoi essayer d'autres...

Je vois pas non plus d'erreur ...
Tu est sûr que ce n'est pas un problème dans ton montage ?

Il n'y a pas d'erreur dans mon montage étant donné que les deux programmes fonctionnent très bien séparément.
L'erreur reste inconnue, je ne peux plus continuer le projet, j'expliquerais que même en étant aidé c'était impossible de trouver l'erreur.
Merci tout de même pour ton aide ainsi que celle apporté sur ton site il y a deux mois.