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 :