Lightcontrol - 16 Kanal LED-Controller

  • Hallo Nico,


    Der Controller hat 16 Kanäle die separat angesteuert werden können, von der Leistung und auch Start-/Endzeiten. Des weiteren

    verfügt der Controller über eine Temeratursteuerung mit Lüterregleung.

    Für den Anschluss der LEDs sind noch KSQ´s erforderlich, die Dimmbar sind, diese werden dann an den Controller angeschossen.

    Die Einstellungen und Zeiten zum Dimmen, Leistung der einzelne Kanäle müssen immer direkt im Code der Software geändert

    werden und per USB auf den Controller geladen.


    hier einige Infos zum Controller:


    - 16 Kanäle Regelbar

    - Arduino System (Software ist anpassbar )

    - Einstellungen direkt über die Software im Code, aber sehr einfach.

    - Lüfter Steuerung

    - Temperatur Steuerung

    - Mond Funktion

    - Sonnen auf und Untergang

    - Dimmen


    Platine ohne weitere Komponenten. 18,00 EUR zzgl. Versand.

    Platine mit allen Komponenten als Bausatz: 35,00 EUR zzgl. Versand.


    Der Bausatz mit allen Komponenten besitzt auch den erforderlichen Arduino Nano der bereit zum hochhalten der Software ist.


    lightcontroller-2017.jpg



    Gruß

    Marco

  • Hallo Marco!


    Nachdem meine selbstbau Refugiums Lampe mich mehr als überzeugt.

    Und Ich ursprünglich eine Beleuchtung für meinen Würfel warscheinlich nächstes Jahr mit einem bluetwilled bauen will, stellt sich mir die Frage ob nicht dein Controller dafür stattdessen verwendung findet.

    Ich muss dazu sagen das bezüglich der Einstellungen der Lampe und der Konfiguration Ich keinerlei Vorkenntnisse habe! Den Bau der Lampe stellt für mich kein Problem dar auch nicht die Verlötung. Einzig

    Wirklich die Schritte nach dem Bau der Lampe!

  • Was der Controller macht ist die KSQs zu steuern, also die Konstantstromquellen, welche die LEDs mit dem passenden Strom versorgen.


    Ich habe die Lampe meines Refugiums mit so einem Controller versehen, wobei der noch eine alte Version ist, die etwas weniger kann.

    2015-02-01-led-lampeasnodn.jpg


    Hier sieht man aber sehr genau, wie es funktioniert:

    von oben kommt das weiße Stromkabel vom Netzteil, dieses ist mit allen KSQs verbunden (die grünen Teile).

    Diese wiederum sind mit den LEDs verbunden und versorgen sie so mit Strom.

    Der Controller unten ist über den Dimm-Anschluß mit den KSQs verbunden und steuert diese gemäß seinem Programm.

    Außerdem braucht auch der Controller natürlich Strom und hat deshalb auch einen Anschluß zum Netzteil.


    Was Marco vielleicht noch erwähnen sollte ist, welche Spezifikationen die KSQs erfüllen sollten bezüglich der Dimmspannung. Wenn ich mich recht erinnere sollten die KSQs von 0-5V dimmen können und sauber mit dem Controller zu arbeiten.

    Außerdem hatte ich einen Spannungswandler noch eingebaut (das rote Teil auf dem Controller), um den Controller mit einem 24V-Netzteil betreiben zu können.


    Insgesamt ist der Aufbau aber sehr einfach wie man hier sieht, das ist keine Atomphysik, die dafür benötigt wird.

  • Ich danke dir mal wieder für deine ausführliche Erkältung. Aber das ist nicht das große Fragezeichen gewesen, sondern tatsächlich die Inbetriebnahme mit der Software sowie die Einstellungen damit die Lampe beispielsweise einen Tagesablauf bekommt oder gar ein Mondlicht!


    Oder stelle ich Mir das zu kompliziert vor und es ist selbsterklärend?

  • Es ist nicht ganz selbsterklärend, aber auch nicht so kompliziert. Im Code selbst sind auch Erklärungen, welche die Anpassung erläutern.


    Mein größtes Problem war am Anfang die passenden Treiber für die serielle Schnittstelle zu finden. Als ich den Microsoft-Treiber rausgeworfen und den mit der Arduino-IDE gekommenen Treiber eingebunden hatte, ging es endlich und ich konnte den Sketch auf den Controller spielen.


    Die Änderungen der Kanalsteuerung sind auch relativ einfach und tatsächlich selbsterklärend.


    Ich hatte nur noch ein paar Zeilen einfachen Code hinzugesetzt, um die Zeit über die Nacht für das Algenrefugium verwenden zu können.

    Den augenblicklichen Stand der Software kenne ich noch nicht, werde aber wohl den neuen Controller mal ausprobieren und mir die Software anschauen. Da man auch einen Lüfter anschließen kann wäre das perfekt für eine Kühlkörper-Lösung mit Rippen und fett Leistung.

  • Hi,


    bezüglich der Software müsst Ihr euch nicht so große sorgen machen. Ihr müsst euch von der Arduino Seite das "Arduino IDE 1.6" runter laden.

    Egal ob für Windows oder Mac. Nach dem Installieren muss eine Datei angepasst werden:


    Das könnt Ihr mit einen normalen Text-Editor machen

    Datei findest Ihr unter Ordner vom Programm\hardware\arduino\cores\arduino\wiring.c :

    Folgendes Zeile muss dabei angepasst werden (in rot):

    #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(1 * 510))


    Das ist erst mal alles gewesen. Anschliessend müsst Ihr euch die Software für den Controller downloaden:

    Link: ONESCAPE_UNIVERSAL_CONTROLLER_v1_0_1_2.zip


    Nach dem entpacken habt Ihr einen neuen Ordner "ONESCAPE_UNIVERSAL_CONTROLLER"

    Ihr ruft dann die Datei ONESCAPE_UNIVERSAL_CONTROLLER.ino auf und bekommt im

    Arduino IDE 1.6 das eigentliche Script angezeigt. In den obersten Zeilen sind dann die

    Einstellungen die Ihr nach euren Wünschen anpassen könnt, das schaut wie folgt aus;



    // ###################### DATE / TIME ###################

    #define TIME_HOUR 17

    #define TIME_MINUTE 48

    #define TIME_SECOND 00

    #define DATE_DAY 18

    #define DATE_MONTH 8

    #define DATE_YEAR 2017


    // ################# LIGHT CONFIGURATION ################

    // | SECONDS | PERCENT | RESOLUTION

    // ------------------------------------------------------

    // | START | STOP | DIMIN | DIMOUT | POWER | LAST |

    // ------------------------------------------------------

    #define LIGHT_CHANNELS 16 //COUNT OF USED LIGHT CHANNELS

    LIGHT gArrLightChannels[ LIGHT_CHANNELS ] = {

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 1

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 2

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 3

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 4

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 5

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 6

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 7

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 8

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 9

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 10

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 11

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 12

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 13

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 14

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 15

    { 46800, 82800, 3600, 3600, 80, 0 } // Kanal 16

    };


    // ##################### MOON CONFIGURATION ####################

    // | SECONDS | PERCENT | RESOLUTION | LIGHT CHANNEL

    // -----------------------------------------------------------------------

    // | START | STOP | DIMIN | DIMOUT | POWER | LAST | MOON CHANNEL |

    // ------------------------------------------------------ ----------------

    MOON gMoonChannel = { 32400, 75600, 900, 900, 100, 0, 0 };


    // ######## TEMPERTURE CONFIGURATION #########

    // | ALL VALUES ARE GRAD ° |

    // -------------------------------------------

    // | MIN | MAX | LAST VALUE |

    TEMP gObjTemp = { 25.00, 50.00, 0.00 };


    Die Angaben bei den Kanälen sind alle in Sec., dass müsst Ihr einmal umrechnen wenn ihr etwas an den Zeiten ändern möchtest.

    Der Rest sollte schon fast selbsterklärend sein und können wir euch auch gern erklären. Dann wird der Controller per USB an

    den Rechner angeschlossen und über die Software per Klick übertragen... das ist es dann gewesen.


    Wenn Ihr mir ein wenig Zeigt gebt, mach ich gern separates Youtube-Video für Windows und den Mac zur Installation und wie

    die Daten geändert werden.

  • Alles klar das hört sich gut an Marco!

    Das mit dem Video wäre natürlich eine feine Sache.


    @Sandy genau eine Rippenkühlkörper lampe mit lüfter war mein erster gedanke dazu :thumbsup:


    Da meine Lampe über dem refugium qwasi wie sandy's aufgebaut ist, nur weniger leds hat. Da ja kleinere Grundfläche! Spiele ich auch mit dem Gedanken hier einen Controller anzuschließen. Um dem ganzen den letzten schliff zu verleihen so könnte ich auch schonmal für mich testen bevor ich mit dem bau der eigentlichen Lampe beginne wie ich damit zurecht komme.

  • Hallo Marco,

    Ich habe mir gerade mal die Arduino software geladen und das Script versucht so zu ändern wie du es beschrieben hast.

    Dabei sind doch noch ein paar Fragen aufgetaucht:


    Ich verstehe nicht so ganz wie definiert wird wie lange das hoch und runter Dimmen dauert oder wo genau diese Einstellung rein muss?

    Und wofür steht der Punkt Last?

    Muss der Controller zwangsläufig gekühlt werden oder kann dieser auch außerhalb der Lampe ohne Kühlung angebracht werden?



    Ich habe mal ein Script bearbeitet und für mein eigenes Verständnis die Kanäle betitelt sowie die Zeiten dazu geschrieben.

    Zur Info, so würde es für meine Refugiumlampe eingesetzt werden.



    // ###################### DATE / TIME ###################

    #define TIME_HOUR 14

    #define TIME_MINUTE 45

    #define TIME_SECOND 00

    #define DATE_DAY 22

    #define DATE_MONTH 1

    #define DATE_YEAR 2018


    // ################# LIGHT CONFIGURATION ################

    // | SECONDS | PERCENT | RESOLUTION

    // ------------------------------------------------------

    // | START | STOP | DIMIN | DIMOUT | POWER | LAST |

    | 22:00 | 10:00| 1% | 1% |max 100% | ? |

    // ------------------------------------------------------

    #define LIGHT_CHANNELS 16 //COUNT OF USED LIGHT CHANNELS

    LIGHT gArrLightChannels[ LIGHT_CHANNELS ] = {

    { 79200, 36000, 3600, 3600, 80, 0 }, // Kanal 1 weiß

    { 79200, 36000, 3600, 3600, 80, 0 }, // Kanal 2 blau

    { 79200, 36000, 3600, 3600, 80, 0 }, // Kanal 3 royal blau

    { 79200, 36000, 3600, 3600, 80, 0 }, // Kanal 4 uv/cyan

    { 79200, 36000, 3600, 3600, 40, 0 }, // Kanal 5 rot

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 6

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 7

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 8

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 9

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 10

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 11

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 12

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 13

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 14

    { 46800, 82800, 3600, 3600, 80, 0 }, // Kanal 15

    { 46800, 82800, 3600, 3600, 80, 0 } // Kanal 16

    };


    // ##################### MOON CONFIGURATION ####################

    // | SECONDS | PERCENT | RESOLUTION | LIGHT CHANNEL

    // -----------------------------------------------------------------------

    // | START | STOP | DIMIN | DIMOUT | POWER | LAST | MOON CHANNEL |

    // 21:30 10:30 0,25% 0,25% 100% ? ?

    ------------------------------------------------------ ----------------

    MOON gMoonChannel = { 77400, 37800, 900, 900, 100, 0, 0 };


    // ######## TEMPERTURE CONFIGURATION #########

    // | ALL VALUES ARE GRAD ° |

    // -------------------------------------------

    // | MIN | MAX | LAST VALUE |

    TEMP gObjTemp = { 25.00, 50.00, 0.00 };

  • Hallo Ben,


    das funktioniert so leider nicht. Ich habe für meine Refugiumslampe ja auch diesen Controller verwendet und die Zeitfunktion etwas verändert, sonst klappt es nicht mit der Steuerung über den Tageswechsel hinaus.


    In der Datei licht.ino habe ich die Funktion deshalb etwas angepasst: der rote Test, wenn ich mich richtig erinnere.

    Leider funktioniert es nicht, den Text in Rot zu seitzen. Es sind die ersten paar Zeiten nach dem Kopf der Funktion.


    Meine Version scheint aber ziemlich alt zu sein, da musst Du noch schauen, ob das mit dem aktuellen Code auch noch hinkommt.

  • Habs doch noch gefunden,


    schaut bei mir anders aus:


    void vSetLight(){


    #ifdef DEBUG

    Serial.print( "vSetLight: LIGHT_CHANNELS=" );

    Serial.println( LIGHT_CHANNELS );

    #endif

    uint16_t lIntLightByTemp = 0;

    gObjTlc5940.clear();


    //LIGHT PWM CALCULATION

    for( uint8_t i = 0 ; i < LIGHT_CHANNELS ; i++ ){

    fGetPwm( gIntDaySecond ,

    gArrLightChannels[i].Start,

    gArrLightChannels[i].Stop,

    gArrLightChannels[i].DimIn,

    gArrLightChannels[i].DimOut,

    0, //Light Min

    gArrLightChannels[i].Max,

    gArrLightChannels[i].Last );

    }


    //MOON CHANNEL CALCULATION

    fGetPwm( gIntDaySecond ,

    gMoonChannel.Start,

    gMoonChannel.Stop,

    gMoonChannel.DimIn,

    gMoonChannel.DimOut,

    0, //Light Min

    gMoonChannel.Max,

    gMoonChannel.Last );

    if ( gMoonChannel.Last >= gArrLightChannels[gMoonChannel.Channel].Last ) {


    gArrLightChannels[gMoonChannel.Channel].Last = gMoonChannel.Last;

    #ifdef DIVIDE_MOON_10

    gArrLightChannels[gMoonChannel.Channel].Last /= 10;

    #endif


    #ifdef DEBUG

    Serial.print( "vSetLight: SET MOON VALUE FOR CHANNEL: " );

    Serial.print( gMoonChannel.Channel );

    Serial.print( " Start: " );

    Serial.print( gMoonChannel.Start );

    Serial.print( " Stop: " );

    Serial.print( gMoonChannel.Stop );

    Serial.print( " DimIn: " );

    Serial.print( gMoonChannel.DimIn );

    Serial.print( " DimOut: " );

    Serial.print( gMoonChannel.DimOut );

    Serial.print( " Max: " );

    Serial.print( gMoonChannel.Max );

    Serial.print( " Last: " );

    Serial.println( gMoonChannel.Last );

    #endif

    }

    for( uint8_t i=0;i < LIGHT_CHANNELS; i++){

    //SYSTEM OVERHEATING

    int16_t lIntTmp = constrain( gObjTemp.Last * 100 ,

    TEMP_CRIT * 100 ,

    ( TEMP_CRIT + 10 ) * 100

    );

    if( lIntTmp > TEMP_CRIT * 100 ) {

    lIntLightByTemp = map( lIntTmp,

    TEMP_CRIT * 100,

    ( TEMP_CRIT + 10 ) * 100,

    0,

    gArrLightChannels[i].Last );

    gArrLightChannels[i].Last = gArrLightChannels[i].Last - lIntLightByTemp;


    #ifdef DEBUG

    Serial.print( "vSetLight: !!!! OVERHEATING !!!!" );

    #endif

    }

    gObjTlc5940.set( i, PWM_MAX - gArrLightChannels[i].Last );