Un problème sur le site ?  Merci d'adresser un message à contact.aquagora@gmail.com, ou sur facebook, merci.

refonte technique amphioxus  (Lu 1378 fois)

j'ai refais mon 465l
en photos :

tout d'abords, les passe cloisons des aspirations des pompes, à travers le fond du bac, à partir de tubes à essais en verre trempé et meulés.





avec crépine spéciale...



refonte de l'hydraulique avec embout à joint gardena pour l'UV, le chauffage externe et le CO2. ainsi qu'un robinet de puisage



au final, voilà le résultat, tout equipement technique en place



concernant le contrôle de l'éclairage, de l'UV et de la pompe de brassage, voilà le détail du montage (pour ceux que ça intéresse et je sais qu'il y en a !) :

carte arduino UNO



ses shields connecteur, DS1307 et ecran à touches





détail assemblage




une fois en marche



avec ce programme :

// bibliotheques

#include "LiquidCrystal.h"
#include "EEPROM.h"
#include "Wire.h"
#include "RTClib.h"

// declaration variables

RTC_DS1307 RTC;

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

byte Canal1 = 9;
byte Canal2 = 10;
byte PWM1;
byte PWM2;
byte Sortie1 = 8;
byte Sortie2 = 11;
boolean S1 = LOW;
boolean S2 = LOW;
int AnaBtnIn = 0;
float Now = 0;
long Heure = 0;
int Minute = 0;
int Seconde = 0;
byte HeureSaisie = 0;
byte MinuteSaisie = 0;
byte ValSaisie = 0;
long TempoMenu = -7001;
boolean EcritureEEPROM = LOW;
long TempoS2 = -86401000;
boolean IndexSaisie = LOW;

word Slot [48];

int LcdBouton()
{
  AnaBtnIn = analogRead(0);
  if (AnaBtnIn > 1000) return 0;
  if (AnaBtnIn < 80) return 1;
  if (AnaBtnIn < 280) return 2;
  if (AnaBtnIn < 470) return 3;
  if (AnaBtnIn < 670) return 4;
  if (AnaBtnIn < 870) return 5;
  return 0;
}
byte BtnModeCompt = 1;
boolean BtnModeEtat = LOW;
boolean BtnModeEtatPrec = LOW;
byte BtnMenuCompt = 47;
boolean BtnMenuEtat = LOW;
boolean BtnMenuEtatPrec = LOW;
byte BtnManuelCompt = 1;
boolean BtnManuelEtat = LOW;
boolean BtnManuelEtatPrec = LOW;

void setup() {
 
  // initialisation horloge et ecran
 
  // Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  //RTC.adjust(DateTime(__DATE__, __TIME__));
  lcd.begin(16, 2);
 
  // initialisation sorties
 
  pinMode (Canal1, OUTPUT);
  pinMode (Canal2, OUTPUT);
  pinMode (Sortie1, OUTPUT);
  pinMode (Sortie2, OUTPUT);
 
  // appel des variables dans EEPROM
 
  for (int i = 0 ; i<48;i++){
    Slot [i] = EEPROM.read(i);
  }


}

void loop() {
 
  // collecte de l'heure
  // Serial.println (AnaBtnIn);
 
  DateTime now = RTC.now();
  Heure = now.hour(),DEC;
  Minute = now.minute(),DEC;
  Seconde = now.second(),DEC;
 
  Now = Heure * 3600 + Minute * 60 + Seconde;
 
  // ecriture des sorties
 
  analogWrite (Canal1, PWM1);
  analogWrite (Canal2, PWM2);
  digitalWrite (Sortie1, S1);
  digitalWrite (Sortie2, S2);
 
  // fonctionnement du bouton 1 de mode
 
if (LcdBouton() == 1){
    BtnModeEtat = HIGH;
}
else BtnModeEtat = LOW;

 
if (BtnModeEtat != BtnModeEtatPrec){
  if (BtnModeEtat == HIGH){
    BtnModeCompt++;
    if (BtnModeCompt > 3) BtnModeCompt =1;
  }
}
BtnModeEtatPrec = BtnModeEtat;
 
  // fonctionnement du bouton 2 de menu
 
if (LcdBouton() == 2){
  BtnMenuEtat = HIGH;
  TempoMenu = millis();
}
else BtnMenuEtat = LOW;
 
if (BtnMenuEtat != BtnMenuEtatPrec){
  if (BtnMenuEtat == HIGH){
   BtnMenuCompt++;
     if (BtnMenuCompt > 47) BtnMenuCompt = 0;
  }
}
BtnMenuEtatPrec = BtnMenuEtat;

  // bloc temporisé de saisie des 48 slots

if (millis() - TempoMenu < 7000){
  lcd.setCursor (0,0);
  if (BtnMenuCompt < 16){
    if (BtnMenuCompt % 2 == 0){
      IndexSaisie = LOW;
      lcd.print ("cA Plot ");
      lcd.print ((BtnMenuCompt/2)+1);
      lcd.print (" ");
      lcd.print (Slot [BtnMenuCompt] /10);
      lcd.print("H");
      lcd.print ((Slot [BtnMenuCompt] -((Slot [BtnMenuCompt] /10) *10))*6);
      lcd.print ("   ");
    }
    else {
      IndexSaisie = HIGH;
      lcd.print ("cA  Val ");
      lcd.print ((BtnMenuCompt/2)+1);
      lcd.print (" ");
      lcd.print (map (Slot [BtnMenuCompt],0,255,0,99));
      lcd.print ("%        ");
    }
  }
  if (BtnMenuCompt >= 16 && BtnMenuCompt < 32){
   if (BtnMenuCompt % 2 == 0){
    IndexSaisie = LOW;
    lcd.print ("cB Plot ");
    lcd.print ((BtnMenuCompt/2) - 7);
    lcd.print (" ");
    lcd.print (Slot [BtnMenuCompt] /10);
    lcd.print("H");
    lcd.print ((Slot [BtnMenuCompt] -((Slot [BtnMenuCompt] /10) *10))*6);
    lcd.print ("   ");
   }
  else {
    IndexSaisie = HIGH;
    lcd.print ("cB  Val ");
    lcd.print ((BtnMenuCompt/2)-7);
    lcd.print (" ");
    lcd.print (map (Slot [BtnMenuCompt],0,255,0,99));
    lcd.print ("%        ");
  }
  }
  if (BtnMenuCompt >= 32 && BtnMenuCompt < 40){
    if (BtnMenuCompt % 2 == 0){
    IndexSaisie = LOW;
    lcd.print ("S1 ");
    lcd.print ((BtnMenuCompt) - 31);
    lcd.print (" ");
    lcd.print (Slot [BtnMenuCompt] /10);
    lcd.print("H");
    lcd.print ((Slot [BtnMenuCompt] -((Slot [BtnMenuCompt] /10) *10))*6);
    lcd.print (" M   ");
    }
    else {
      IndexSaisie = LOW;
    lcd.print ("S1 ");
    lcd.print (BtnMenuCompt - 31);
    lcd.print (" ");
    lcd.print (Slot [BtnMenuCompt] /10);
    lcd.print("H");
    lcd.print ((Slot [BtnMenuCompt] -((Slot [BtnMenuCompt] /10) *10))*6);
    lcd.print (" A   ");
    }
  }
  if (BtnMenuCompt >= 40){
    if (BtnMenuCompt % 2 == 0){
    IndexSaisie = LOW;
    lcd.print ("S2 ");
    lcd.print ((BtnMenuCompt) - 39);
    lcd.print (" ");
    lcd.print (Slot [BtnMenuCompt] /10);
    lcd.print("H");
    lcd.print ((Slot [BtnMenuCompt] -((Slot [BtnMenuCompt] /10) *10))*6);
    lcd.print (" M   ");
    }
    else {
      IndexSaisie = LOW;
    lcd.print ("S2 ");
    lcd.print (BtnMenuCompt - 39);
    lcd.print (" ");
    lcd.print (Slot [BtnMenuCompt] /10);
    lcd.print("H");
    lcd.print ((Slot [BtnMenuCompt] -((Slot [BtnMenuCompt] /10) *10))*6);
    lcd.print (" A   ");
    }
  }
     
   
  if (IndexSaisie == LOW){   
    if (LcdBouton() == 3){
      delay (200);
      HeureSaisie++;
      if (HeureSaisie > 23) HeureSaisie = 0;
      TempoMenu = millis();
     
    }
    if (LcdBouton() == 4){
      delay(200);
      MinuteSaisie += 6;
      if (MinuteSaisie > 54) MinuteSaisie = 0;
      TempoMenu = millis();
     
    }
    if (LcdBouton() == 5){
      Slot [BtnMenuCompt] = (HeureSaisie * 10) + (MinuteSaisie / 6);
      EcritureEEPROM = HIGH;
    }
    lcd.setCursor (0,1);
    lcd.print ("Saisie ");
    lcd.print (HeureSaisie);
    lcd.print ("H");
    lcd.print (MinuteSaisie);
    lcd.print ("      ");
   
  }
  if (IndexSaisie == HIGH){   
    if (LcdBouton() == 3){
      delay (150);
      ValSaisie--;
      if (ValSaisie > 255) ValSaisie = 0;
      TempoMenu = millis();
   }
    if (LcdBouton() == 4){
      delay (150);
      ValSaisie++;
      if (ValSaisie < 0) ValSaisie = 255;
      TempoMenu = millis();
    }
    if (LcdBouton() == 5){
     Slot [BtnMenuCompt] = ValSaisie;
     EcritureEEPROM = HIGH;
    }
    lcd.setCursor (0,1);
    lcd.print ("Saisie ");
    lcd.print (ValSaisie);
    lcd.print (" byte   ");
   
   
  }
 
  // bloc d'écriture de l'EEPROM si changement des slots
 
}
else if (EcritureEEPROM == HIGH){
  while (EcritureEEPROM == HIGH){
     lcd.setCursor (0,0);
     lcd.print ("Ecraser EEPROM ?");
     lcd.setCursor (0,1);
     lcd.print ("  oui  non      ");
       if (LcdBouton() == 4){
         for (int i = 0; i < 48; i++){
           if (EEPROM.read(i) != Slot[i]) EEPROM.write (i,Slot[i]);
         }
         lcd.setCursor (0,0);
         lcd.print ("  Transfert OK  ");
         lcd.setCursor (0,1);
         lcd.print ("                ");
         delay (1000);
         EcritureEEPROM = LOW;
       }
       if (LcdBouton() == 5) EcritureEEPROM = LOW;
}
}

  // bloc de fonctionnement des 3 modes auto, manu et off

switch (BtnModeCompt){
 
  // Mode AUTO
  case 1:
   if (Now / 2 >= Slot[0]*180 && Now / 2 < Slot[2]*180) PWM1 = map (Now/2, Slot[0]*180, Slot[2]*180, Slot[1], Slot[3]);
   else if (Now / 2 >= Slot[2]*180 && Now / 2 < Slot[4]*180) PWM1 = map (Now/2, Slot[2]*180, Slot[4]*180, Slot[3], Slot[5]);
   else if (Now / 2 >= Slot[4]*180 && Now / 2 < Slot[6]*180) PWM1 = map (Now/2, Slot[4]*180, Slot[6]*180, Slot[5], Slot[7]);
   else if (Now / 2 >= Slot[6]*180 && Now / 2 < Slot[8]*180) PWM1 = map (Now/2, Slot[6]*180, Slot[8]*180, Slot[7], Slot[9]);
   else if (Now / 2 >= Slot[8]*180 && Now / 2 < Slot[10]*180) PWM1 = map (Now/2, Slot[8]*180, Slot[10]*180, Slot[9], Slot[11]);
   else if (Now / 2 >= Slot[10]*180 && Now / 2 < Slot[12]*180) PWM1 = map (Now/2, Slot[10]*180, Slot[12]*180, Slot[11], Slot[13]);
   else if (Now / 2 >= Slot[12]*180 && Now / 2 < Slot[14]*180) PWM1 = map (Now/2, Slot[12]*180, Slot[14]*180, Slot[13], Slot[15]);
   else PWM1 = 0;
   
   if (Now / 2 >= Slot[16]*180 && Now / 2 < Slot[18]*180) PWM2 = map (Now/2, Slot[16]*180, Slot[18]*180, Slot[17], Slot[19]);
   else if (Now / 2 >= Slot[18]*180 && Now / 2 < Slot[20]*180) PWM2 = map (Now/2, Slot[18]*180, Slot[20]*180, Slot[19], Slot[21]);
   else if (Now / 2 >= Slot[20]*180 && Now / 2 < Slot[22]*180) PWM2 = map (Now/2, Slot[20]*180, Slot[22]*180, Slot[21], Slot[23]);
   else if (Now / 2 >= Slot[22]*180 && Now / 2 < Slot[24]*180) PWM2 = map (Now/2, Slot[22]*180, Slot[24]*180, Slot[23], Slot[25]);
   else if (Now / 2 >= Slot[24]*180 && Now / 2 < Slot[26]*180) PWM2 = map (Now/2, Slot[24]*180, Slot[26]*180, Slot[25], Slot[27]);
   else if (Now / 2 >= Slot[26]*180 && Now / 2 < Slot[28]*180) PWM2 = map (Now/2, Slot[26]*180, Slot[28]*180, Slot[27], Slot[29]);
   else if (Now / 2 >= Slot[28]*180 && Now / 2 < Slot[30]*180) PWM2 = map (Now/2, Slot[28]*180, Slot[30]*180, Slot[29], Slot[31]);
   else PWM2 = 0;
   
   if (Now / 2 >= Slot[32]*180 && Now / 2 < Slot[33]*180) S1 = HIGH;
   else if (Now / 2 >= Slot[33]*180 && Now / 2 < Slot[34]*180) S1 = LOW;
   else if (Now / 2 >= Slot[34]*180 && Now / 2 < Slot[35]*180) S1 = HIGH;
   else if (Now / 2 >= Slot[35]*180 && Now / 2 < Slot[36]*180) S1 = LOW;
   else if (Now / 2 >= Slot[36]*180 && Now / 2 < Slot[37]*180) S1 = HIGH;
   else if (Now / 2 >= Slot[37]*180 && Now / 2 < Slot[38]*180) S1 = LOW;
   else if (Now / 2 >= Slot[38]*180 && Now / 2 < Slot[39]*180) S1 = HIGH;
   else S1 = LOW;
   
   if (millis() - TempoS2 < 86400000) S2 = HIGH;
   else if (Now / 2 >= Slot[40]*180 && Now / 2 < Slot[41]*180) S2 = HIGH;
   else if (Now / 2 >= Slot[41]*180 && Now / 2 < Slot[42]*180) S2 = LOW;
   else if (Now / 2 >= Slot[42]*180 && Now / 2 < Slot[43]*180) S2 = HIGH;
   else if (Now / 2 >= Slot[43]*180 && Now / 2 < Slot[44]*180) S2 = LOW;
   else if (Now / 2 >= Slot[44]*180 && Now / 2 < Slot[45]*180) S2 = HIGH;
   else if (Now / 2 >= Slot[45]*180 && Now / 2 < Slot[46]*180) S2 = LOW;
   else if (Now / 2 >= Slot[46]*180 && Now / 2 < Slot[47]*180) S2 = HIGH;
   else S2 = LOW;
   
   if (LcdBouton() == 3 && millis() - TempoMenu >= 7000){
        while (LcdBouton() != 4 && LcdBouton() !=5){
        lcd.setCursor (0,0);
        lcd.print ("Forcer S2 24h ? ");
        lcd.setCursor (0,1);
        lcd.print ("  oui  non      ");
        if (LcdBouton() == 4)TempoS2 = millis();
        if (LcdBouton() == 5)TempoS2 = -86401000;
        }
   }
  break;
   
   // Mode MANUEL
  case 2:
  if (LcdBouton() == 3){
    BtnManuelEtat = HIGH;
  }
  else BtnManuelEtat = LOW;
  if (BtnManuelEtat != BtnManuelEtatPrec){
    if (BtnManuelEtat == HIGH){
      BtnManuelCompt++;
      if (BtnManuelCompt > 4) BtnManuelCompt =1;
    }
  }
  BtnManuelEtatPrec = BtnManuelEtat;
  switch (BtnManuelCompt){
    case 1:
      if (LcdBouton() == 4 && PWM1 > 0) PWM1--;
      if (LcdBouton() == 5 && PWM1 < 255) PWM1++;
      delay (50);
    break;
   
    case 2 :
      if (LcdBouton() == 4 && PWM2 > 0) PWM2--;
      if (LcdBouton() == 5 && PWM2 < 255) PWM2++;
      delay (50);
    break;
   
    case 3 :
      if (LcdBouton() == 4) S1 = LOW;
      if (LcdBouton() == 5) S1 = HIGH;
    break;
   
    case 4 :
      if (LcdBouton() == 4) S2 = LOW;
      if (LcdBouton() == 5) S2 = HIGH;
    break;
  }
     
  break;
 
    // Mode OFF
  case 3:
  S1 = LOW;
  S2 = LOW;
  PWM1 = 0;
  PWM2 = 0;
  BtnManuelCompt = 1;
  break;
}
 
   // affichage courant des trois modes
 
  if (millis() - TempoMenu >= 7000){
    BtnMenuCompt = 47;
      lcd.setCursor (0,0);
      if (Minute >= 15 && Minute < 45) lcd.print(" ");
      if (BtnModeCompt == 1) lcd.print ("AUTO   ");
      if (BtnModeCompt == 2) lcd.print ("MANU   ");
      if (BtnModeCompt == 3) lcd.print ("OFF    ");
      if (Heure <10)lcd.print("0");
      lcd.print(Heure);
      lcd.print(':');
      if (Minute <10)lcd.print("0");
      lcd.print(Minute);
      lcd.print(':');
      if (Seconde <10)lcd.print("0");
      lcd.print(Seconde);
      lcd.print ("  ");
      lcd.setCursor (0,1);
      if (Minute >= 15 && Minute < 45) lcd.print(" ");
      if (BtnModeCompt == 2 && BtnManuelCompt == 1) lcd.print (">");
      else {
      lcd.print("A");
      }
      if (map(PWM1,0,255,0,99) <10)lcd.print("0");
      lcd.print(map(PWM1,0,255,0,99));
      lcd.print ("%");
      if (BtnModeCompt == 2 && BtnManuelCompt == 2) lcd.print (" >");
      else {
      lcd.print(" B");
      }
      if (map(PWM2,0,255,0,99) <10)lcd.print("0");
      lcd.print(map(PWM2,0,255,0,99));
      lcd.print ("%");
      if (BtnModeCompt == 2 && BtnManuelCompt == 3) lcd.print (">");
      else lcd.print (" ");
      if (digitalRead(Sortie1) == HIGH)lcd.print("S1");
      else (lcd.print("s1"));
      if (BtnModeCompt == 2 && BtnManuelCompt == 4) lcd.print (">");
      else lcd.print (" ");
      if ( millis() - TempoS2 < 86400000) lcd.print("F2 ");
      else if (digitalRead(Sortie2) == HIGH) lcd.print("S2 ");
      else (lcd.print("s2 "));
     
  }


}

et ce schema d'interface



qui peut être réalisé à partir de ce typon



ce qui donne :



soit, le local technique complet :

  • Animateur
Hello,

Très belle installation, bravo ;-)

Mais, personnellement, je ne pourrais pas dormir tranquille avec des passes-cloisons en verre !  :peur:  En plus, ils sont sur le fond de l'aquarium: s'il l'un deux casse, tu as 460 litres d'eau dans ton salon... En plus, je ne vois pas trop l'intérêt d'utiliser du verre pour ça.

Laurent
salut,

oui j'ai déjà eu plein de témoignages de crainte sur ce choix. j'en ai eu au début aussi !

mes percages sont trop petits (18mm) pour permettre le montage en passe-cloisons en PVC par exemple.

par ailleurs, cela fait des années qu'il fonctionne comme ça.

là, le changement par rapport à avant, c'est qu'au lieu d'utiliser du tube standard, j'ai choisi des tubes PYREX en 16mm extérieur.
avant de les casser, il faut y aller tout de même. même au marteau !

question arrachement, c'est simplement impossible (collage verre sur verre). pour oter les anciens tubes, j'en ai ch.... comme pas permis.

et pour l'étanchéité avec les tubes souples, ceux d'entre nous qui utilisent des lily pipes, savent ce qu'il en retourne !

bref, j'ai confiance !
Superbe installation, belle technique.

Pressé de voir l'évolution de ton aqua  :timide:
oui alors, pour l'évolution, je ferais un autre post dédié.