Ankündigung

Einklappen
Keine Ankündigung bisher.

Tageslichtsimulator

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] Tageslichtsimulator

    Hallo & frohes neues Jahr

    ich benötige eure Hilfe!

    Mein Aquarium bekommt eine neue LED Beleuchtung.
    RGB + W über Dali (KNX Gateway) angesteuert.

    Ich möchte nun eine Tageslichtsimulation mit dem EibPC programmieren.
    Nach langem Suchen habe ich nun eine Werteteabelle eines „Tageslicht-Controllers“ gefunden.
    Inhalt: Intensität der 4 Kanäle im 30 Minuten Intervall.

    Folgende Funktionen sollten mit dem EibPC Programm möglich sein:
    Auf die 4 bestehenden Gruppenadressen Helligkeitswerte schreiben (u08).
    Zeitlicher Ablauf soll sich an der EibPC Systemzeit orientieren. (damit nach einem PC Neustart die richtige Helligkeit eingestellt wird).
    24h Simulation sollte in wenigen Minuten möglich sein (~3 Minuten).
    Da ich erst testen muss ob die Werte in der Tabelle auch zu meinen LED streifen passen müssen die Werte „einfach“ editierbar sein.

    Kann mir ein Experte hier was zaubern?
    Oder zumindest Tipps geben wie ich beginnen soll?

    Tausend DANK!
    You do not have permission to view this gallery.
    This gallery has 1 photos.

    #2
    Das ist einfach:
    Code:
    SimStart="GA-Simstart-1/2/3"
    if chtime(09,00,00) and SimStart then {
        write(GA_CH1, 20%);
        write(GA_CH2, 30%);
        write(GA_CH3, 10%);
        write(GA_CH4, 50%);
    } endif
    usw. für jeden Zeitpunkt entsprechend Deiner Tabelle. Mit "GA-Simstart-1/2/3" kannst Du dies starten oder stoppen.
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      richtig, dies ist die einfache Lösung.

      in diesem Fall ändert sich die Helligkeit jedes Kanals in Bruchteilen einer Sekunde auf den vorgegebenen Wert.

      ich hätte aber gerne einen gleichmäßigen Anstieg der Werte bis zum nächsten Zeitpunkt.
      also z.B. von 9:00(erster Index) bis 9:30 (zweiter Index) einen Anstieg von 25% auf 50%

      Kommentar


        #4
        Zitat von meinHaus Beitrag anzeigen
        ich hätte aber gerne einen gleichmäßigen Anstieg der Werte bis zum nächsten Zeitpunkt.
        also z.B. von 9:00(erster Index) bis 9:30 (zweiter Index) einen Anstieg von 25% auf 50%
        Ungefähr so sollte das ganz gut funktionieren. Die Werte werden hier in 4 Variablen als String festgelegt und sind so leicht editierbar. Ich habe den Code bei mir nicht direkt getestet. Es kann also sein, dass noch der eine oder andere Compilerfehler kommt. Im großen und ganzen sollte das so aber ganz gut funktionieren.

        Damit die Formatierung des Strings durch das Forum nicht zerstört wird, habe ich das ganze als Text-Datei angefügt.

        rgb.txt

        Kommentar


          #5
          DANKE für diese Idee!

          ich habe den Code etwas geändert damit die Datentypen passen.


          Code:
          pos1 = hour() * 2 + minute() / 30;
          pos = convert (pos1,0u16);
          
          rgbR_von = convert(split(rgbR, pos * 6u16, pos * 6u16 + 2u16), 0u16) * 255u16 / 100u16;
          rgbG_von = convert(split(rgbG, pos * 6u16, pos * 6u16 + 2u16), 0u16) * 255u16 / 100u16;
          rgbB_von = convert(split(rgbB, pos * 6u16, pos * 6u16 + 2u16), 0u16) * 255u16 / 100u16;
          rgbW_von = convert(split(rgbW, pos * 6u16, pos * 6u16 + 2u16), 0u16) * 255u16 / 100u16;
          
          rgbR_bis = convert(split(rgbR, (pos + 1u16) * 6u16, (pos + 1u16) * 6u16 + 2u16), 0u16) * 255u16 / 100u16;
          rgbG_bis = convert(split(rgbG, (pos + 1u16) * 6u16, (pos + 1u16) * 6u16 + 2u16), 0u16) * 255u16 / 100u16;
          rgbB_bis = convert(split(rgbB, (pos + 1u16) * 6u16, (pos + 1u16) * 6u16 + 2u16), 0u16) * 255u16 / 100u16;
          rgbW_bis = convert(split(rgbW, (pos + 1u16) * 6u16, (pos + 1u16) * 6u16 + 2u16), 0u16) * 255u16 / 100u16;
          
          rgbR_wert = convert((rgbR_von * convert(30 - mod(minute(), 30), 0u16) + rgbR_bis * convert(mod(minute(), 30), 0u16)) / 30u16, 0);
          rgbG_wert = convert((rgbG_von * convert(30 - mod(minute(), 30), 0u16) + rgbG_bis * convert(mod(minute(), 30), 0u16)) / 30u16, 0);
          rgbB_wert = convert((rgbB_von * convert(30 - mod(minute(), 30), 0u16) + rgbB_bis * convert(mod(minute(), 30), 0u16)) / 30u16, 0);
          rgbW_wert = convert((rgbW_von * convert(30 - mod(minute(), 30), 0u16) + rgbW_bis * convert(mod(minute(), 30), 0u16)) / 30u16, 0);
          
          if change (rgbR_wert or rgbG_wert or rgbB_wert or rgbW_wert) and  "Aquarium Tageslicht Simulation-1/7/3" == EIN then{
          write("Licht Dimmen Wohnzimmer R-1/3/1", rgbR_wert);
          write("Licht Dimmen Wohnzimmer G-1/3/2", rgbG_wert);
          write("Licht Dimmen Wohnzimmer B-1/3/3", rgbB_wert);
          write("Licht Dimmen Wohnzimmer WW-1/3/0", rgbW_wert);
          }endif

          noch eine Idee wie ich jetzt einen schnellen Durchlauf simuliere. Also 24 Stunden in z.B.: 4 Minuten durchlaufen?

          Kommentar


            #6
            Zitat von meinHaus Beitrag anzeigen
            noch eine Idee wie ich jetzt einen schnellen Durchlauf simuliere. Also 24 Stunden in z.B.: 4 Minuten durchlaufen?
            Am besten statt

            Code:
            pos = convert(hour() * 2 + minute() / 30, 0u16);
            irgendwas in dieser Form verwenden

            Code:
            pos = 0u16;
            if cylce(0, 5) and pos < 47u16 then {
               pos = pos +1u16;
            } endif
            Ergänzung: Funktioniert so leider doch nicht, weil ja bei der Berechnung der rgb-Werte auch die Minute mit einfließt. Du müsstest statt der minute() in der Formel also auch noch eine Variable definieren die periodisch hochgezählt wird.
            Zuletzt geändert von klaus; 07.01.2016, 08:28.

            Kommentar

            Lädt...
            X