Objectifs du projet
- Savoir utiliser le module RTC
- Savoir mettre à jour l’heure du module RTC
- Conception du Grafcet
- Introduction du système de l’arrosage
- Introduite le schéma synoptique avec Arduino
- Importance du système de l’arrosage
- Commande des électrovannes
- Programmation des heures de l’arrosage
- Etc.
Le tuto introduit le test du module RTC. Voir le tuto pour les détails techniques.
Architecture matérielle
Grafcet du Système
Programme du Module RTC
#include <Wire.h>
#include "RTClib.h"
#define pinLed 3
bool ledState=false;
// Variables globales RTC
RTC_DS1307 rtc;
word DateHeure[6]={0,0,0,0,0};
char JoursSem[7][12] = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi","Dimanche"};
/*
* DateHeure[0]: Secondes[0-59]
* DateHeure[1]: Minutes [0-59]
* DateHeure[2]: Heures [0-23]
* DateHeure[3]: Jours [1-31]
* DateHeure[4]: Mois [1-12]
* DateHeure[5]: Années
enum Ds1307SqwPinMode {
DS1307_OFF = 0x00, // Low
DS1307_ON = 0x80, // High
DS1307_SquareWave1HZ = 0x10, // 1Hz square wave
DS1307_SquareWave4kHz = 0x11, // 4kHz square wave
DS1307_SquareWave8kHz = 0x12, // 8kHz square wave
DS1307_SquareWave32kHz = 0x13 // 32kHz square wave
};
*/
void setup ()
{
// Init RTC
Serial.begin(115200);
while (!rtc.begin())
Serial.println("Le module RTC non disponible, Attente RESET");
if (rtc.begin()) {
Serial.println("Le module RTC est OK");
rtc.writeSqwPinMode(DS1307_ON);
}
//Update RTC (Manuel)
word dat_heur[6];
dat_heur[0]=0;
dat_heur[1]=0;
dat_heur[2]=0;
dat_heur[3]=0;
dat_heur[4]=4;
dat_heur[5]=2023;
//updateClock(rtc, 1, dat_heur);
//LED
pinMode(pinLed,OUTPUT);
digitalWrite(pinLed,LOW);
}
void loop ()
{
if ((millis()%2000)<100)
{
// Lecture du module RTC
readClock(rtc, DateHeure); delay(150);
// LED/Clock
if (!(DateHeure[1]%2) || !(DateHeure[1]%1))
{
// Affichage de la date
Serial.print(DateHeure[3],DEC);
Serial.print('/');
Serial.print(DateHeure[4],DEC);
Serial.print('/');
Serial.print(DateHeure[5],DEC);
// Le jour de la semaine
Serial.print(", "); Serial.print(JoursSem[getJour(DateHeure)]);Serial.print(" ");
// Affichage de l'heure
Serial.print(DateHeure[2]),DEC;
Serial.print(':');
Serial.print(DateHeure[1],DEC);
Serial.print(':');
Serial.print(DateHeure[0],DEC);
Serial.println();
//LED
digitalWrite(pinLed,ledState);
ledState=!ledState;
}
}
}
void readClock(RTC_DS1307 rtcc, word *datheur)
{
if (!rtcc.begin())Serial.println("Le module RTC non disponible");
else
{
// Lecture du module RTC
DateTime now = rtcc.now();
// Récupération de la date
datheur[5]=now.year(); // Années
datheur[4]=now.month(); // Mois
datheur[3]=now.day(); // Jours
// Récupération de l'heure
datheur[2]=now.hour(); // Heures
datheur[1]=now.minute(); // Minutes
datheur[0]=now.second(); // Secondes
}
}
void updateClock(RTC_DS1307 rtcc, int man_auto, word *datheur)
{
if (!rtcc.begin())Serial.println("Le module RTC non disponible");
else
{
if (man_auto==1) rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
else {
word Sec= datheur[0];
word Min= datheur[1];
word Heu= datheur[2];
word Jou= datheur[3];
word Moi= datheur[4];
word Ann= datheur[5];
rtcc.adjust(DateTime(Ann, Moi, Jou, Heu, Min, Sec));
Serial.println("Le module RTC est à jour");
}
}
}
word getJour(word *datheur)
{
/*
* 1: "Lundi"
* 2: "Mardi"
* 3: "Mercredi"
* 4: "Jeudi"
* 5: "Vendredi"
* 6: "Samedi"
* 7: "Dimanche"
*/
word J=((datheur[3] + 3)) % 7;
if(J==0)return 7;
else return J+1;
}