costruire centralina rgb
costruire centralina rgb
CIAO a tutti, sono nuovo e pochissimo pratico di elettronica, vorrei realizzare per il mio acquario una Centralina per fare alba/giorno/tramonto/notte con strisce Led RGB, tutto in due canali, 1 canale per led rgb 5050 5 metri 75 w (ma a me servono tre metri) e 1 canale striscia da 25 cm. led blu notturna. che permette di simulare in maniera dinamica sia i colori che le variazioni graduali dell'illuminazione
evitando lo stress di una luce improvvisa nell'acquario e donare un effetto
cromatico naturale all'intera vasca, di solito in un acquario mediamente
illuminato è sufficiente 1cm di striscia RGB ogni litro d'acqua.
Quindi
1 canale per tre metri di strisce rgb
1 canale per notturno
Io ho già fatto una centralina, mi ha aiutato gentilmente con molta pazienza daniele in un sito, ma ha solo 1 canale rgb quando faccio il notturno si accendono tre metri e sono troppi e lui8 non sapeva mettere il display che vorrei visualizzare, con lui non riesco ad avere più un contatto. Per questo mi serve n nuovo circuito.
Ho a disposizione Arduino duemilanove e un display. (link del display)
http://ecommerce.euroa.it/it/optoelettronica-led-e-display/331-lcd-shield-for-arduino-16x2-blue-led-backlight.html
acido, saldatore basetta, software arduino, alimentatore 8A e il codice che mi ha fatto , mi serve un circuito stampato, componenti da saldare e rettificare il programma per mettere il display.
Vi allego il sito di quello che ho fatto. GRIX.IT FORUM - costruire centralina rgb su Elettronica Generale
Qui è l’esempio
Esempio:
Le tre strisce insieme si accendono ( poi vediamo meglio gli orari) fanno alba/giorno/tramonto poi si dissolve e in sequenza parte la blu fino al giorno dopo che si dissolve, poi contemporaneamente si spegne e parte l’alba.
luna crescente ----> blu ----------------> in 20min --|
alba ----------------> celeste ------------> in 25min | 1:15h
\\mattina ----------> bianco ------------> in 30min --|
\\giorno -----------> bianco 100% ----> in 7h
\\tramonto --------> bianco ------------> in 30min --|
crepuscolo---------> rosso --------------> in 15min |1:15h
sera -----------------> magenta ----------> in 10min |
luna calante--------> blu ----------------> in 20min --|b
la funzione del display a 5 pulsanti e vorrei:
Attenzione non sono necessari alimentatori dimmerabili.
Il pulsante ha più funzioni:
- Scambia da automatico a manuale e viceversa
- Blocca la luminosità scelta una volta terminato il ciclo automatico
- Interrompe il ciclo automatico permettendo il controllo manuale rapido
(serve per lavorare a piena luminosità in caso di necessità immediata in pieno
ciclo automatico mentre alla pressione successiva riprende dal punto in cui è
stato interrotto.
vorrei sare i pulsanti del dislay.
La manopola permette la regolazione manuale della luminosità (RGB in
simultanea = BIANCA).
P.S. ricordate che mi dovete dire passo passo come i bambini.
// CENTRALINA RGB PER ACQUARIO
// DATA: 12/12/23
// AUTORE: Daniele Lombardi
//
// Collegando l'alimentazione l'orario viene impostato alle ore 00:00 e passa alla modalità automatico.
//
// Quando è spento:
// una pressione rapida accende le luci e passa alla modalità automatico.
//
// In modalità automatico:
// una pressione rapida passa alla modalità sempre acceso;
// una pressione di 3 secondi passa alla modalità programmazione;
// una pressione di 8 secondi spegne le luci.
//
// In modalità sempre acceso:
// una pressione rapida passa alla modalità automatico.
//
// In modalità programmazione:
// una pressione breve fa avanzare l'orario di 30 minuti;
// una pressione di 2 secondi fa retrocedere l'orario di 1 ora;
// una pressione di 5 secondi passa alla modalità automatico.
#define ROSSO 3
#define VERDE 5
#define BLU 6
#define POT 0
#define BUTTON 2
#define BREVE 80
#define SPENTO 0
#define AUTOMATICO 1
#define SEMPRE_ACCESO 2
#define PROGRAMMAZIONE 3
#define T_TIME unsigned long
#define MINUTE 60000
#define DAY 86400000
#define N_TRX 8
// trx bian trx gior trx bian trx nott
word ttime[] = { 800, 900, 1330, 1400, 1800, 1830, 2100, 2200};
byte rlum[] = { 9, 255, 255, 249, 249, 255, 255, 9};
byte glum[] = { 12, 140, 140, 251, 251, 140, 140, 12};
byte blum[] = { 75, 39, 39, 255, 255, 39, 39, 75};
// nott bian bian gior gior bian bian nott
byte mode = AUTOMATICO;
word lum = 0;
T_TIME lTime = 0;
T_TIME dTime = 0;
void aggiornaOrario() {
T_TIME cTime = millis();
T_TIME elapsed;
if (cTime > lTime) { //Verifica se c'è stato overflow
elapsed = cTime - lTime; //No overflow, il tempo trasccorso è uguale alla differenza
} else {
elapsed = (4294967295 - lTime) + 1 + cTime; //Overflow, aggiunge il conteggio perso
}
dTime = (dTime + elapsed) % DAY; //Ricalcola l'orario giornaliero
lTime = cTime; //Salva l'ultimo tempo di aggiornamento
}
byte interpola(T_TIME t1, byte v1, T_TIME t2, byte v2, T_TIME tx) {
double r = ((double)v1) + (((double)v2) - ((double)v1)) * (((double)tx) - ((double)t1)) / (((double)t2) - ((double)t1));
if (r < 0) return 0;
if (r > 255) return 255;
return (byte) r;
}
T_TIME wct2time(word wct) { //Converte un "word coded time" in millisecondi
return MINUTE * ((wct / 100) * 60 + wct % 100);
}
byte cercaFase(T_TIME t) { //Restituisce l'indice di inizio transiszione
byte i;
if (t < wct2time(ttime[0])) return N_TRX - 1;
for (i = 1; i < N_TRX; i++) {
if (t < wct2time(ttime[i])) return i - 1;
}
return N_TRX - 1;
}
void refresh() {
aggiornaOrario();
lum = analogRead(POT) >> 2; //Scala il range a 0-255
byte i1 = cercaFase(dTime); //Calcola l'indice di inizio transizione
byte i2 = (i1 + 1) % N_TRX; //Calcola l'indice di fine transizione
T_TIME t1 = wct2time(ttime[i1]);
T_TIME t2 = wct2time(ttime[i2]);
analogWrite(ROSSO, (lum * interpola(t1, rlum[i1], t2, rlum[i2], dTime)) >> 8);
analogWrite(VERDE, (lum * interpola(t1, glum[i1], t2, glum[i2], dTime)) >> 8);
analogWrite(BLU , (lum * interpola(t1, blum[i1], t2, blum[i2], dTime)) >> 8);
}
unsigned int readButton(int btn) {
T_TIME s = millis();
while (digitalRead(btn)) {}
return (unsigned int) (millis() - s);
}
void setup() {
pinMode(ROSSO, OUTPUT);
pinMode(VERDE, OUTPUT);
pinMode(BLU , OUTPUT);
pinMode(BUTTON, INPUT);
}
void loop() {
unsigned int pressione = readButton(BUTTON);
switch (mode) {
case SPENTO:
analogWrite(ROSSO, 0);
analogWrite(VERDE, 0);
analogWrite(BLU , 0);
if (pressione > BREVE) mode = AUTOMATICO;
break;
case AUTOMATICO:
refresh();
if (pressione > 6000) { //8 secondi
mode = SPENTO;
} else if (pressione > 1500) { //3 secondi
mode = PROGRAMMAZIONE;
} else if (pressione > BREVE) {
mode = SEMPRE_ACCESO;
}
break;
case SEMPRE_ACCESO:
lum = analogRead(POT) >> 2; //Scala il range a 0-255
analogWrite(ROSSO, lum);
analogWrite(VERDE, lum);
analogWrite(BLU , lum);
if (pressione > BREVE) mode = AUTOMATICO;
break;
case PROGRAMMAZIONE:
refresh();
if (pressione > 3000) { //5 secondi
mode = AUTOMATICO;
} else if (pressione > 900) { //2 secondi
dTime = dTime - 60 * MINUTE;
if (dTime > DAY) dTime = DAY - 60 * MINUTE; //Previeni overflow
} else if (pressione > BREVE) {
dTime = (dTime + 30 * MINUTE) % DAY;
}
break;
}
}
edit: per favore includi il codice usando gli appositi tag