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 :