Projekt: Moodlight

Hi, Ich bin ein Beginner was den Arduino angeht, hab schon ein wenig mit rumgespielt und plane gerade mein erstes "ernsthaftes" Projekt.

Ich dachte mir dass ich mal beschreibe was ich vor habe damit ich nicht ewig rum hampele und es funktioniert garnicht...

RGB-LED, angesteuert mittels PWM (3 digitale out) 5 Programme, wählbar mittels drehschalter(5 digitale in) 3 Potis um eine konstante Farbe(Program 1) einzustellen(3 analog in)

Teile: 1x Arduino Duemilanove 1x RGB-LED Leiste (12V) 1x netzteil 12V 3x Transistoren 3x Poti 1x Drehschalter, 5 Pole

Was meint ihr? Gruß Andre

Willkommen ratcatcher

Kennst du folgende Seite schon ?

http://www.lochraster.org/fnordlicht/

Vor allem die dort gezeigten Schaltpläne können sehr hilfreich sein :)

Ich habe so etwas schon gemacht nur ohne wählbare Programme wenn du willst kann ich dir meinen Code zur Verfügung stellen. Hatte zuerst ein paar Probleme wenn ich den nebeneinadeliegende bzw Anaolgouts vom gleichen Timer genommen habe.

Zu Hardware ich würde anstatt der Transistoren Buz73A oder IRF540N N Kanal MosFet nehmen die haben "eignetlich" in so einer Anwendung nahzu keine Verluste und sind ohne schnickschnack anzusteuern (Basis wiederstand) einfach Gate an Arudino Source auf Masse und Drain an die Kathoder der LED´s. Oder mittels eines ULN2804A.

Am Ende bin ich jetzt bei einem Attiny25 (13er geht auch) mit Bascom Code gelandet da das nur ein kleiner 8Piner ist und man mit dem Bascom einen sehr guten Soft PWM realisieren konnte. Ich habe ein kleines Moodlight mit einer kleinen RGB LED und 3 BC548 Transen gebaut. Und ein großes ist auch im Bau mit 8 RGB LED und 3 BUZ73A als Treiber. Die Tiny sind dafür genau richtig der Code is ca 1kB groß in Bascom

Hier der Grund Code: EDIT: Achtung War auf einem Mega für 2k9 Board die Ausgänge 3,6,11

unsigned int Rval=255;
unsigned int Gval=0;
unsigned int Bval=0;
unsigned long interval=120;
unsigned long pMillis;
int T=0;

void setup (){
  //nothing for setup  
}

void loop(){
  if(millis()-pMillis > interval){
    pMillis=millis();
    if (T>=0 && T<=255){
      Rval=Rval-1;
      Gval=Gval+1;
      Bval=0;  
    }
    if (T>=255 && T<=510){
      Rval=0;
      Gval=Gval-1;
      Bval=Bval+1;
    }
    if (T>=510 && T<=765){
      Rval=Rval+1;
      Bval=Bval-1;
      Gval=0;
    }
    if (T>=765){
      T=0;  
      Bval=0;
      Gval=0;
      Rval=255;
    }
    T=T+1 ;  
  }
  analogWrite(2,Rval);
  analogWrite(7,Gval);
  analogWrite(12,Bval);
}

Super und danke euch beiden für die Tipps! Das mit den MosFETs klingt zb sehr gut. Ich probiere es jetzt einfach mal.. Werd dann posten wie es läuft(und ob ;) )

Oder mittels eines ULN2804A

Wäre auch mein Tipp. Soviel Strom braucht ein 5m-Streifen nicht. Falls man mal Relais ansteuern will,sind da auch "Freilaufdioden" drinne. Noch etwas kompatibler ist ULN2803. Kostet = 31 Cents.

Die Tiny sind dafür genau richtig der Code is ca 1kB groß in Bascom

seufz Ja, für die Kleinen ist Bascom echt gut....

Ich hab mal einen kleinen Regenbogenalgorithmus für ein Landkartenprojekt geschrieben, den könnte man für sowas vermutlich auch gut verwenden:

// Verwendete analoge ports
#define RD_PIN            3
#define GN_PIN            6
#define BL_PIN            9

// Die Anzahl der verwendeten RGB-Gruppen
#define COLORS_LEN      7
// Die verwendeten Farben in  Gruppen {Rot, Grue, Blau}. Die Liste kann erweitert
// oder gekuerzt werden, dann aber nicht vergessen, das COLORS_LEN anzupassen!
int COLORS[COLORS_LEN][3] = {
  {255, 0, 0}, {255, 255, 0}, {0, 255, 0}, {0, 255, 255}, {0, 0, 255}, {255, 0, 255},
  {255, 0, 0} // Die letzte Farbe muss auch die erste Farbe sein!
};

long MAX, val;

void setup () {
  // Nach 120 Sekunden von vorne anfangen, kann beliebig geaendert werden...
  MAX = 1000 * 120;
}

void loop () {
  val = millis() % MAX;
  double i = (double)((COLORS_LEN-1)*val)/MAX;
  analogWrite(RD_PIN,(int)(COLORS[(int)i][0]*(1-i+(int)i)+COLORS[(int)i+1][0]*(i-(int)i)));
  analogWrite(GN_PIN,(int)(COLORS[(int)i][1]*(1-i+(int)i)+COLORS[(int)i+1][1]*(i-(int)i)));
  analogWrite(BL_PIN,(int)(COLORS[(int)i][2]*(1-i+(int)i)+COLORS[(int)i+1][2]*(i-(int)i)));
}

Ich geb aber keine Garantie dafür, dass das ohne kleinere Anpassungen funktioniert, ich hab das grade eben auf die Schnelle von Java umgesetzt und keine Entwicklungsumgebung hier um es zu testen... ;)

Für weichere Übergänge könnte man die Hinterlegten Werte im Array doch in der Loop addieren bzw subtrieren dann hat man einen schönes Fading.

Ich bin nicht sicher was Du meinst…?

In deinem Code geht er doch nur durch das Array Colors und liest dann die Farben z.B. 255,255,0 und geht dann zur nächsten Farbe. Wenn man doch jetzt die einzelenen Werte im Array addieren z.B 1-255 und 255-1 dan hätte man doch einen schönen weichen übergang zwischen den Farben

Nein, der Code faded in der angegebene Zeit (hier 120 Sekunden) einmal komplett weich durch das Array und fängt dann wieder von vorne an.

Das Schöne daran ist, dass man nicht nur "0" oder "255" angeben kann, sondern auch jeden beliebigen Wert dazwischen. :)