potager connecté // gestion arrosage et lumiere avec ephemeris et RTC

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
    ...

:smiley:

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

}