// Entrée de synchronisation 1PPS / INT4 pinMode(PinINT4, INPUT);
// Activation de l'interruption globale (registre SREG) SREG|=0x80; //SREG|=0x80 // Activation //SREG&=0x7f // Désactivation //Ou bien //sei(): Set interrupt - Activation //cli(): clear interrup - Désactivation (masquer)
// Validation de l'interruption INT4 (Registre EIMSK) EIMSK|=0x10; // INT4
// Choix du mode de détection: Front montant dans INT4 EICRB|=0x03; //EICRB|=0x00; //niveau bas '0' dans INTn //EICRB|=0x01; //front montant ou descendant dans INTn //EICRB|=0x02; //Front descendant dans INTn //EICRB|=0x03; //Front montant dans INTn
La fonction d’initialisation du module RTC
void InitRTC(void) { if (! rtc.begin()) { Serial.println("Le module RTC non disponible"); while (1); // Attente RESET } else { Serial.println("Le module RTC est OK"); rtc.writeSqwPinMode(DS1307_SquareWave1HZ); //DS1307_SquareWave1HZ = 0x10, // 1Hz square wave //DS1307_SquareWave4kHz = 0x11, // 4kHz square wave //DS1307_SquareWave8kHz = 0x12, // 8kHz square wave //DS1307_SquareWave32kHz = 0x13 // 32kHz square wave rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Date du PC
//rtc.adjust(DateTime(2020,1,24,10,10,10)); // Ajustement manuel // Ex: 10 Janvier 2020 à 10:00:00: // rtc.adjust(DateTime(2020, 1, 10, 10, 0, 0)); } }
La fonction de lecture du module RTC
void GetDateHeure(word *DateHeure) { // Lecture du module RTC DateTime now = rtc.now();
// Récupération de la date DateHeure[5]=now.year(); // Années DateHeure[4]=now.month(); // Mois DateHeure[3]=now.day(); // Jours
// Récupérration de l'heure DateHeure[2]=now.hour(); DateHeure[1]=now.minute(); DateHeure[0]=now.second(); }
La fonction ISR() de l’interruption externe
ISR(INT4_vect) //ISR(_VECTOR(5)) {
// Compteur des échantillons static word count=0;
// Désactivation de l'interruption globale cli();
// Lecture du capteur A0_val=analogRead(A0);
// Conversion en volt [0,1023]=>[0, 5V] V0=(double)A0_val*V/1023.00;
// Calcul de la résistance en Ohm R_l=((V/V0)-1.0)*R;
// Stockage local des données Data[count]=R_l;
// Affichage des données: 1 Affichage / seconde Serial.print("Count="); Serial.print(count); Serial.print(", R_l="); Serial.print(Data[count]); Serial.print(", à "); Serial.print(DateHeure[2]);Serial.print(":"); Serial.print(DateHeure[1]);Serial.print(":"); Serial.println(DateHeure[0]);
// Activation de l'interruption globale sei();
// Mise à jour du compteur count++; count=count%N; }
Le programme complet
/* * Projet Data logger: Datation des données 2/4 * wwww.Electronique-Mixte.fr
Objectifs 1. Savoir utiliser le module RTC 2. Savoir synchroniser le module RTC avec la carte Arduino 3. Savoir utiliser une interruption externe pour l’acquisition des données 4. Savoir utiliser la mémoire locale de la carte Arduino 5. Les 3 erreurs à éviter pour rendre son program fonctionnel 6. Etc. */
#include <Wire.h> #include "RTClib.h" #define V 5.00 #define R 10000.0 #define N 1200 // 60*20=1200 - Taille SRAM #define PinINT4 2 // PE4 - PIN 2
RTC_DS1307 rtc; word DateHeure[6]={0,0,0,0,0}; word A0_val; double V0, R_l=0.0; double Data[N];
// Activation de l'interruption globale (registre SREG) SREG|=0x80; //SREG|=0x80 // Activation //SREG&=0x7f // Désactivation //Ou bien //sei(): Set interrupt - Activation //cli(): clear interrup - Désactivation (masquer)
// Validation de l'interruption INT4 (Registre EIMSK) EIMSK|=0x10; // INT4
// Choix du mode de détection: Front montant dans INT4 EICRB|=0x03; //EICRB|=0x00; //niveau bas '0' dans INTn //EICRB|=0x01; //front montant ou descendant dans INTn //EICRB|=0x02; //Front descendant dans INTn //EICRB|=0x03; //Front montant dans INTn
// Initialisation du port série: Affichage locale des données Serial.begin(9600);
// Initialisation du Module RTC (Heure de l'ordinateur) InitRTC(); }
void loop() { // Lecture du module RTC GetDateHeure(DateHeure); }
ISR(INT4_vect) //ISR(_VECTOR(5)) {
// Compteur des échantillons static word count=0;
// Désactivation de l'interruption globale cli();
// Lecture du capteur A0_val=analogRead(A0);
// Conversion en volt [0,1023]=>[0, 5V] V0=(double)A0_val*V/1023.00;
// Calcul de la résistance en Ohm R_l=((V/V0)-1.0)*R;
// Stockage local des données Data[count]=R_l;
// Affichage des données: 1 Affichage / seconde Serial.print("Count="); Serial.print(count); Serial.print(", R_l="); Serial.print(Data[count]); Serial.print(", à "); Serial.print(DateHeure[2]);Serial.print(":"); Serial.print(DateHeure[1]);Serial.print(":"); Serial.println(DateHeure[0]);
// Activation de l'interruption globale sei();
// Mise à jour du compteur count++; count=count%N; }
void GetDateHeure(word *DateHeure) { // Lecture du module RTC DateTime now = rtc.now();
// Récupération de la date DateHeure[5]=now.year(); // Années DateHeure[4]=now.month(); // Mois DateHeure[3]=now.day(); // Jours
// Récupérration de l'heure DateHeure[2]=now.hour(); DateHeure[1]=now.minute(); DateHeure[0]=now.second(); }
void InitRTC(void) { if (! rtc.begin()) { Serial.println("Le module RTC non disponible"); while (1); // Attente RESET } else { Serial.println("Le module RTC est OK"); rtc.writeSqwPinMode(DS1307_SquareWave1HZ); //DS1307_SquareWave1HZ = 0x10, // 1Hz square wave //DS1307_SquareWave4kHz = 0x11, // 4kHz square wave //DS1307_SquareWave8kHz = 0x12, // 8kHz square wave //DS1307_SquareWave32kHz = 0x13 // 32kHz square wave rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Date du PC
//rtc.adjust(DateTime(2020,1,24,10,10,10)); // Ajustement manuel // Ex: 10 Janvier 2020 à 10:00:00: // rtc.adjust(DateTime(2020, 1, 10, 10, 0, 0)); } }