Catégories
Arduino électronique Projets Arduino Projets électroniques

Projet Data logger avec Arduino – Datation des données

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

Laisser un commentaire