Découvrez notre nouvelle Chaîne YouTube "Ingénierie & Bourse"

Objectifs de la vidéo

  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.

Projets connexes

Programme Arduino

La fonction de l’interruption externe INT4

  // 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];


void setup() 
{  
  // 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 

  // 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));
  }
}
Accueil des Projets Arduino

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Anti-Robot *

You have successfully subscribed to the newsletter

There was an error while trying to send your request. Please try again.

FPGA | Arduino | Matlab | Cours will use the information you provide on this form to be in touch with you and to provide updates and marketing.