Salut à tous,
Bon finalement sur les conseils de J-M-L, je me suis concentré sur quelque chose de plus simple pour l'instant.
- un arrosage declenché à 6h (avant l'allumage de la lampe).
- allumage de la lumiere de 7h à 19h puis extinction.
Le code est ci-dessous, si vous avez des remarques pour l'optimiser ou améliorer des choses, il a le merite de fonctionner mais pour vos yeux averti j'imagine que ca reste de la bidouille.
---amélioration envisagées :
- capteur de temperature
- ecran LCD pour indiquer la temperature et/ou le nombre de boucles d'arrosage dans la journée.
- possibilité de changer les parametres (horaires, temps d'arrosage) via internet ou un smartphone
- prise d'une photo par jour pour voir l'evolution des plantes en cas d'absence.
- possibilité de demultiplier les cultures (plusieurs capteurs d'humidité, arrosage geré separement...)
-capteur de niveau d'eau pour le reservoir
...
//time
/* Dépendances */
#include <Wire.h>
#include "DS1307.h"
/* Rétro-compatibilité avec Arduino 1.x et antérieur */
#if ARDUINO >= 100
#define Wire_write(x) Wire.write(x)
#define Wire_read() Wire.read()
#else
#define Wire_write(x) Wire.send(x)
#define Wire_read() Wire.receive()
#endif
/** Fonction de conversion BCD -> decimal */
byte bcd_to_decimal(byte bcd) {
return (bcd / 16 * 10) + (bcd % 16);
}
/** Fonction de conversion decimal -> BCD */
byte decimal_to_bcd(byte decimal) {
return (decimal / 10 * 16) + (decimal % 10);
}
/**
Fonction récupérant l'heure et la date courante à partir du module RTC.
Place les valeurs lues dans la structure passée en argument (par pointeur).
N.B. Retourne 1 si le module RTC est arrêté (plus de batterie, horloge arrêtée manuellement, etc.), 0 le reste du temps.
*/
byte read_current_datetime(DateTime_t *datetime) {
/* Début de la transaction I2C */
Wire.beginTransmission(DS1307_ADDRESS);
Wire_write((byte) 0); // Lecture mémoire à l'adresse 0x00
Wire.endTransmission(); // Fin de la transaction I2C
/* Lit 7 octets depuis la mémoire du module RTC */
Wire.requestFrom(DS1307_ADDRESS, (byte) 7);
byte raw_seconds = Wire_read();
datetime->seconds = bcd_to_decimal(raw_seconds);
datetime->minutes = bcd_to_decimal(Wire_read());
byte raw_hours = Wire_read();
if (raw_hours & 64) { // Format 12h
datetime->hours = bcd_to_decimal(raw_hours & 31);
datetime->is_pm = raw_hours & 32;
} else { // Format 24h
datetime->hours = bcd_to_decimal(raw_hours & 63);
datetime->is_pm = 0;
}
datetime->day_of_week = bcd_to_decimal(Wire_read());
datetime->days = bcd_to_decimal(Wire_read());
datetime->months = bcd_to_decimal(Wire_read());
datetime->year = bcd_to_decimal(Wire_read());
/* Si le bit 7 des secondes == 1 : le module RTC est arrêté */
return raw_seconds & 128;
}
/**
Fonction ajustant l'heure et la date courante du module RTC à partir des informations fournies.
N.B. Redémarre l'horloge du module RTC si nécessaire.
*/
void adjust_current_datetime(DateTime_t *datetime) {
/* Début de la transaction I2C */
Wire.beginTransmission(DS1307_ADDRESS);
Wire_write((byte) 0); // Ecriture mémoire à l'adresse 0x00
Wire_write(decimal_to_bcd(datetime->seconds) & 127); // CH = 0
Wire_write(decimal_to_bcd(datetime->minutes));
Wire_write(decimal_to_bcd(datetime->hours) & 63); // Mode 24h
Wire_write(decimal_to_bcd(datetime->day_of_week));
Wire_write(decimal_to_bcd(datetime->days));
Wire_write(decimal_to_bcd(datetime->months));
Wire_write(decimal_to_bcd(datetime->year));
Wire.endTransmission(); // Fin de transaction I2C
}
#include <Wire.h>
#include <RTClib.h>
//Variables mise à jour Horloge
byte TabMaH[6] = {17, 1, 1, 0, 0, 0};
byte MaH; int BpH; byte DrapH; byte SelH; byte ColH; byte MaxH; byte MinH; byte CurH; byte CurligH;
// Variables mise à jour de la plage horaire
int Bp; int MaJ; int Flag; int Vo; int Lig; int Sel; ; int Col; int Val; int Max; int Cur; int CurLig;
// Table Evénerments chaque ligne correspond à une voie. Sur la ligne, on trouve H départ, M Départ, H Arrêt, M Arrêt..
int TabEvt [6][4] =
{
{14, 0, 14, 1},
{14, 1, 14, 2},
{14, 2, 14, 3},
{14, 3, 14, 4},
{25, 0, 0, 0},
{25, 0, 0, 0}
};
byte PinSorties[6] = {17, 16, 11, 12, 2, 3};
//time
int PinHumidite = 0; // capteur d'humidité.
int humid; // variable humidité
int pinRelais = 4; //variable pour le pin qui commande le relais
void setup() {
//time
/* Initialise le port série */
Serial.begin(115200);
/* Initialise le port I2C */
Wire.begin();
/* Vérifie si le module RTC est initialisé */
DateTime_t now;
if (read_current_datetime(&now)) {
Serial.println(F("L'horloge du module RTC n'est pas active !"));
// Reconfiguration avec une date et heure en dure (pour l'exemple)
now.seconds = 0;
now.minutes = 0;
now.hours = 12; // 12h 0min 0sec
now.is_pm = 0;
now.day_of_week = 4;
now.days = 1;
now.months = 12;
now.year = 16; // 1 dec 2016
adjust_current_datetime(&now);
}
//time
pinMode(pinRelais, OUTPUT); //pin lampe en mode OUTPUT
digitalWrite(pinRelais, LOW); // lumiere off
Serial.begin(115200);
pinMode(PinHumidite, INPUT); // capteur
pinMode(2, OUTPUT); // relais
digitalWrite(2, LOW); // pompe off
}
void loop() {
//time
//Lit la date et heure courante
DateTime_t now;
if (read_current_datetime(&now)) {
Serial.println(F("L'horloge du module RTC n'est pas active !"));
}
//Affiche la date et heure courante
Serial.print(F("Date : "));
Serial.print(now.days);
Serial.print(F("/"));
Serial.print(now.months);
Serial.print(F("/"));
Serial.print(now.year + 2000);
Serial.print(F(" Heure : "));
Serial.print(now.hours);
Serial.print(F(":"));
Serial.print(now.minutes);
Serial.print(F(":"));
Serial.println(now.seconds);
//Rafraichissement une fois par seconde
delay(1000);
//time
// test arrosage
if (now.hours >= 6 && now.hours <= 7)
{
humid = analogRead(PinHumidite); // lecture capteur humidité
Serial.println(humid); //affichage humidité
if (humid < 800) // si sol sec (eau : 860, air : 0, terre "à arroser" : 840 terre seche : 185 )
{
digitalWrite(2, HIGH); // allumage pompe
Serial.println("pompe arrosage on");
delay(1000); // arrosage 10 secondes
digitalWrite(2, LOW); // arret pompe
Serial.println("pompe arrosage off");
}
}
//Serial.println("pause");
delay(1000); // pause 10mns le temps que l'eau se diffuse autour du capteur
//delay(1000); // pause
//test lampe
if (now.hours >= 7 && now.hours <= 19)
{
digitalWrite(pinRelais, HIGH); // on commande l'allumage
Serial.println("lumiere on");
}
else
{
digitalWrite(pinRelais, LOW); // on commande l'extinction
Serial.println("lumiere off");
}
delay(18000);
}