arduino et aquaponie

Bonjour je suis passionné par l’arduino mais je suis encore débutant je souhaiterais utiliser cet outil pour la fabrication de meubles aquaponie haut game, un mix de pisciculture et hydroponique

j'ai écrit un programme mais il fonctionne pas à cause de petite erreur d'écriture de code
je rencontre 2 problème:
-Le premier j'ai du mal à temporiser l'action de mes pompes

  • le deuxième je n'arrive pas à programmer des plages horaires pour l'allumage de mes LED d'éclairage de culture

Voici le code avec commentaire d'explication

#include <Wire.h>
#include "RTClib.h" //librairie horloge rtc

RTC_DS1307 rtc; // module rtc  ds1302

/////////////////////////////////////apparaillage////////////////////////////////////
int ecl_veg = 2;

int bulleur = 6;

const int pompe  = 7;
const int  vanne = 8;

const int flotbasPin = 53;
const int flothautPin = 52;

int etatflothaut = 0;
int etatflotbas = 0;

enum { bac_tempo, maree_basse, bac_se_remplie, maree_haute, bac_se_vide } etatbac; // etat du bac culture aquaponique

// État d'activation de la tempo
int tempoActive = 0;

// Temps à l'activation de la tempo
unsigned long tempoDepart = 0;

//////////////////////////////////////////////////// setup/////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////

void setup()
{
  ////////////////////horloge////////////////
  Serial.begin(115200);

  if (! rtc.begin()) //probleme
  {
    Serial.println("Horloge RTC non trouvé");
    while (1);
  }
  if (! rtc.isrunning())
  {
    Serial.println("RTC non initialisé");
    //Paramètre le temps à l'envoi du code
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // rtc.adjust(DateTime(2019, 4, 7, 6, 23, 0));
  }
  pinMode( ecl_veg, OUTPUT); // eclairage led
  pinMode(pompe, OUTPUT); // pompe a eau
  pinMode(vanne, OUTPUT); // vanne de drainnage
  pinMode(bulleur, OUTPUT); // pompe a aire
  pinMode(flotbasPin, INPUT); // capteur  niveau eau flotteur bas
  pinMode(flothautPin, INPUT); // capteur niveau eau flotteur  haut
}

void loop()
{
 ////////////////////////////////////programe irrigation ///////////////////////////////////////////////
  switch (etatbac) 
  {
    case  bac_tempo : // etat de repos du bac de culture totalement vide
      if ((digitalRead(flotbasPin) == LOW) && (digitalRead(flothautPin) == LOW)) // niveau de l'eau dans le bac bas
      {
        digitalWrite(pompe,  HIGH); //repos
        digitalWrite(vanne, HIGH); // repos
        tempoActive = 1; //depart de la temporisation (repos) PROBLEME
        tempoDepart = millis();
      }
      if ( tempoActive )
      {
        if ( ( millis() - tempoDepart ) >= 3000 ) // PROBLEME
        {
          tempoActive = 0; // fin de la temporisation (repos)
          etatbac =  maree_basse; // passage de l'etat de repos a maree basse
        }
      }
      break;

    case maree_basse : // maree bass envoi de l'eau
      if ((digitalRead(flotbasPin) == LOW) && (digitalRead(flothautPin) == LOW))
      {
        digitalWrite(pompe, LOW); //pompe a eau actif
        digitalWrite(vanne, HIGH);
        etatbac = bac_se_remplie; // apres flotteur bas enclancher ont passe a l'etat bac se remplit
      }
      break;

    case bac_se_remplie :   // le bac de culture est a moitier remplis D'eau
      if ((digitalRead(flotbasPin) == HIGH) && (digitalRead(flothautPin) == LOW))
      {
        digitalWrite(vanne, HIGH); // on continue a envoyer de l'eau j'usqua atteindre la maree haute
        digitalWrite(pompe, LOW);
        etatbac = maree_haute; // une foi que le flotteur bas et haut sont eclancher on passe a l'etat maree haut
      }
      break;

    case  maree_haute : // le bac de culture est totalement remplit eau
      if  ((digitalRead(flotbasPin) == HIGH) && (digitalRead(flothautPin) == HIGH))
      {
        tempoActive = 1; // depart de la 2e temporisation ( actif ) PROBLEME
        tempoDepart = millis();
        digitalWrite(vanne, HIGH);
        digitalWrite(pompe, HIGH); // pompe etteint car bac rempli
        digitalWrite(bulleur, LOW); //oxigenation des racine pendant la temporisation actif
      }
      if ( tempoActive )
      {
        if ( ( millis() - tempoDepart ) >= 3000 ) // fin de la temporisation (actif) PROBLEME
        {
          digitalWrite(vanne, LOW); //ouverture de la vanne de drainnage pour retirer l'eau de bac vers l'aquariume
          digitalWrite(pompe, HIGH);
          digitalWrite(bulleur, HIGH);
          tempoActive = 0;
          etatbac =  bac_se_vide; // l'eau se retire et le flotteur haut se declanche alors on passe a l'etat bac se vide
        }
      }
      break;

    case  bac_se_vide : //le bac de culture est a moitier vide
      if ((digitalRead(flotbasPin) == HIGH) && (digitalRead(flothautPin) == LOW))
      {
        digitalWrite(pompe, HIGH);
        digitalWrite(vanne, LOW); // on continue a vider le bac
        etatbac = bac_tempo; // une foi  que le bac redevient vide et que flotteur bas et le flotteur haut son declancher on passe a l'etat bac de repos
      }
      break;
  }

  /////////////////////////////////programe eclairage//////////////////////////////////////
  if ((now.hour() >= 21) && (now.hour() <= 15)) //programateur horair pour elairage led  PROBLEME "NOW" NON RECONUE PAR LE COMPILATEUR 
  {
    digitalWrite(ecl_veg, LOW);
  }
  else
  {
    digitalWrite(ecl_veg, HIGH);
  }
}

Le problème est que la tempo est réarmée à chaque passage dans le test.
Si elles est déjà armée, ne pas le faire :

      if ((digitalRead(flotbasPin) == LOW) && (digitalRead(flothautPin) == LOW)) // niveau de l'eau dans le bac bas
      {
        if (!tempoActive) {
          Serial.println("activation tempo");
          digitalWrite(pompe,  HIGH); //repos
          digitalWrite(vanne, HIGH); // repos
          tempoActive = 1; //depart de la temporisation (repos) PROBLEME
          tempoDepart = millis();
        }
      }

Une bonne habitude à prendre est d'afficher les actions réalisées : Serial.println("activation tempo");

Je suppose qu'il y a d'autre cas, mais l'idée est là.