Ciclo Alba-Tramonto con led RGB

Ciao a tutti! Come da titolo vorrei realizzare un ciclo di colori (alba-tramonto) per il mio acquario... Avavo pensato di usare un RTC e per ogni fascia oraria aumentare o diminuire l'ammontamento dei vari colori (rosso,verde e blu). Ma come fare?! Sono riuscito a capire qualcosa dall'esempio dell'ide (Fading) ma come posso integrare il RTC? Grazie in anticipo! :) :)

Fai partire il fading a una certa ora. Ciao Uwe

Potresti farmi un esempio non sono molto pratico (ho comprato il rtc ieri!!) Grazie :) :) :P

Nessuno che mi aiuta? :(

La prima risorsa è Google.

Prendi il nome del tuo RTC, ci aggiungi la voce Arduino e fai una ricerca. Esempio, se hai comprato un DS1307, cerca "DS1307 Arduino". Una volta trovato gli esempi di codice ed i collegamenti, replichi tutto.

Poi aggiungi il cambio di luminosità del led in base all'ora, che leggi dall'RTC.

Usa una libreria per quel RTC. Non so consigliarti nessuna perché non hai scritto quale RTC hai preso.

Converti i secondi, minuti e ore in secondi e poi confronti i secondi passati nel giorno se sono maggiore del numero di secondi per far partire il fade. Se son maggiori fai partire il fade e setti una variabile di stato per far partire solo una volta il fade. La stessa cosa la fai per lo spegnimento.

Ciao Uwe

Guarda anche il progetto di riciweb: Ardu Aquarium Controller --> http://arduino.cc/forum/index.php/topic,141419.0.html

Grazie a tutti!!! :D :D Domani proverò ...

Allora, sono riuscito (in parte) a fare quello che volevo:

//includo la libreria per la
//comunicazione su bus I2C
#include <Wire.h>
void setup()
{
  pinMode(9, OUTPUT);
  //inizializzo la seriale
  Serial.begin(9600);
  //inizializzo la libreria
  Wire.begin();
  Wire.beginTransmission(0x68);
  //il primo byte stabilisce il registro
  //iniziale da scivere
  Wire.write((byte)0x00);
  //specifico il tempo e la data
  Wire.write((byte)0x30); //1° byte SECONDI da 0x00 a 0x59
  Wire.write((byte)0x59); //2° byte MINUTI da 0x00 a 0x59
  Wire.write((byte)0x80 | 0x18); //3° byte ORE da 0x00 a 0x24
  Wire.write((byte)0x01); //4° byte GIORNO della settimana da 0x01 a 0x07
  Wire.write((byte)0x21); //5° byte GIORNO del mese da 0x00 a 0x31
  Wire.write((byte)0x03); //6° byte MESE da 0x00 a 0x12
  Wire.write((byte)0x12); //7° byte ANNO 0x00 a 0x99
  Wire.endTransmission();
}




void loop()
{
  //inizzializza la trasmissione partendo
  //dall'indirizzo 0x00
  Wire.beginTransmission(0x68);
  Wire.write((byte)0x00);
  Wire.endTransmission();

  //richiedo 7 byte dal dispositivo con
  //indirizzo 0x68
  Wire.requestFrom(0x68, 7);
  //regupero i 7 byte relativi ai
  //corrispondenti registri
  byte secondi = Wire.read();
  byte minuti = Wire.read();
  byte ora = Wire.read();
  byte giorno_sett = Wire.read();
  byte giorno_mese = Wire.read();
  byte mese = Wire.read();
  byte anno = Wire.read();

  if (ora == 0x19) { 

    for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
      // sets the value (range from 0 to 255):
      analogWrite(9, fadeValue);         
      // wait for 30 milliseconds to see the dimming effect    
      delay(3000);                            
    } 
  }

}

Il problema è che questo codice riesce a gestire un solo pin…
Come posso fare per gestirne 3? :roll_eyes:

In che senso? Basta triplicare le righe relative al pin.

nella setup:

pinMode(9, OUTPUT);     //1°pin
pinMode(10, OUTPUT);   //2°pin
pinMode(11, OUTPUT);   //3°pin

e poi nel ciclo for:

  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) 
  { // sets the value (range from 0 to 255):
    analogWrite(9, fadeValue);    // 1° pin
    analogWrite(10, fadeValue);  // 2° pin
    analogWrite(11, fadeValue);  // 3° pin
    // wait for 30 milliseconds to see the dimming effect    
    delay(3000);                            
  }

Naturalmente usi il pin 9 e io suggerisco il 10 e 11, ma scegli altri 2 pin che siano liberi (10 e 11 oppure dipende da te)

Si ma io vorrei dargli valori diversi... Es il 9 ammonta di 5 alla volta il 10 di 7 e l'11 di 10

  fade2=0;
  fade3=0;
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) 
  { // sets the value (range from 0 to 255):
    analogWrite(9, fadeValue);    // 1° pin
    analogWrite(10, fade2);  // 2° pin
    analogWrite(11, fade3);  // 3° pin
    // wait for 30 milliseconds to see the dimming effect    
    delay(3000);                            
    fade2=fade2+7;
    if(fade2>255) fade2=255;
    fade3=fade3+10;
    if(fade3>255) fade3=255;
  }

dovrai dichiarare in cima al programma anche le 2 variabili fade2 e fade3

http://arduino.cc/forum/index.php/topic,156215.0.html prova a guardare qui se la funzione map può esserti d'aiuto.

Scusate ho dato un'occhiata ma non ho capito molto.. :blush: Potreste spiegarmi questa funzione map? Grazie ;)

Guarda dentro qui. cerca la funzione map poi confrontala con gli ultimi sketch del link che ti ho dato prima.
prova a vedere se può esserti utile…

ProgrammareArduino.pdf (540 KB)

Scusate ma sono proprio testa dura.. :D Potreste farmi un esempio con la funzione map o altre :* Grazie

void loop()
{
    for (int i=1; i < 50; i++){ // da 1 a 750 (50 step per 15 combinazioni)
    	analogWrite(R, (map (i, 1, 50,128,255) )); //primi 50 step
        analogWrite(G, (map (i, 1, 50,255,255) )); //primi 50 step
        analogWrite(B, (map (i, 1, 50,255,0) )); //primi 50 step
    	analogWrite(R, (map (i, 51, 100,255,180) )); //dal 51° al 100° step
        analogWrite(G, (map (i, 51, 100,255,60) )); //dal 51° al 100° step
        analogWrite(B, (map (i, 51, 100,0,40) )); //dal 51° al 100° step
    
    
             //qui metti tutti gli step che vuoi
             // int i per te è il tuo clock    
    
    
    delay(timeb);