HM-LC-DW-WM und Farbmischverhalten

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

Antworten
Horbi
Beiträge: 199
Registriert: 29.05.2019, 12:51
Hat sich bedankt: 19 Mal
Danksagung erhalten: 65 Mal

HM-LC-DW-WM und Farbmischverhalten

Beitrag von Horbi » 03.03.2021, 19:28

Hallo Zusammen, ich bin gerade dabei die Dimmersteuerung ein wenig zu erweitern und hänge gerade am Farbmischverhalten.
Die CCU bietet ja folgende Einstellungen an:
Bild3.png
Crossfade ist ziemlich klar -
Bild4.png
Bild4.png (25.26 KiB) 313 mal betrachtet

Code: Alles auswählen

        pwmCold = uint32_t(bright * charLevelLimit * adjust) / 200;
        pwmWarm = uint32_t(bright * charLevelLimit * (200 - adjust)) / 200;
Bei Dim2Warm und Dim2Hot brauche ich bitte Hilfe
Bild5.png
Bild5.png (26.35 KiB) 313 mal betrachtet
Ich kann mir das Regelverhalten nicht wirklich vorstellen. Was passiert wenn bright 100 ist und adjust 0, 100 oder 200, was passiert bei bright 200 und adjust 0, 100 oder 200 - hat jemand so ein Device im Original und kann das mal beschreiben?

Horbi
Beiträge: 199
Registriert: 29.05.2019, 12:51
Hat sich bedankt: 19 Mal
Danksagung erhalten: 65 Mal

Re: HM-LC-DW-WM und Farbmischverhalten

Beitrag von Horbi » 05.03.2021, 15:04

Ich denke ich habe es selbst rausgefunden. Ich lade es mal in dem trilu-branch hoch, falls jemand testen möchte.

Code: Alles auswählen

      if (charBaseType == 0) {      // CHARACTERISTIC_CROSSFADE
        pwmCold = uint32_t((bright * charLevelLimit * adjust) / 200);
        pwmWarm = uint32_t((bright * charLevelLimit * (200 - adjust)) / 200);
        //DPRINT("cf  c: "); DPRINT(pwmCold); DPRINT(", w: "); DPRINTLN(pwmWarm);
      }
      else if (charBaseType == 1) { // CHARACTERISTIC_DIM2WARM
        pwmCold = uint32_t((bright * adjust * adjust) / 40000);
        uint8_t t_adj = 200 - adjust;
        if (charLevelLimit == 1) {
          t_adj = (adjust > 100) ? adjust - 100 : 100 - adjust;
          t_adj *= 2;
        }
        pwmWarm = int32_t((-1 * bright * t_adj * t_adj) / 40000) + bright;
        //DPRINT("d2w b: "); DPRINT(bright); DPRINT(", c: "); DPRINT(pwmCold); DPRINT(", w: "); DPRINTLN(pwmWarm);
      }
      else if (charBaseType == 2) { // CHARACTERISTIC_DIM2HOT
        uint8_t t_adj = (adjust < 100) ? 0 : adjust - 100;
        pwmCold = uint32_t((bright * t_adj) / 100);
        t_adj = adjust;
        if (charLevelLimit == 1) {
          t_adj = (adjust > 100) ? 200 - adjust : adjust;
          t_adj /= 2;
        }
        pwmWarm = uint32_t((bright * t_adj) / 100);
        //DPRINT("d2h b: "); DPRINT(bright); DPRINT(", c: "); DPRINT(pwmCold); DPRINT(", w: "); DPRINTLN(pwmWarm);
      }

      if (pwmCold > 200) pwmCold = 200;
      if (pwmWarm > 200) pwmWarm = 200;

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“