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é.
}
}