Я управляю ШИМ двумя блоками CC-PS, каждый из которых управляет одним светодиодом (один теплый CCT, один холодный CCT) в диапазоне от 16 до 240, используя джойстик в качестве пользовательского интерфейса.Когда свет включается или выключается, а затем снова включается, значение ШИМ по умолчанию для обоих равно 128. Генератором ШИМ является Adafruit Metro Mini (Arduino), но это скорее проблема логики кода.
Что работает с кодом ниже, так это смешивание между теплым (слева) и холодным (справа) или между ярким (вверх) и темным (вниз), если джойстик наклонен строго влево/ вправо (х) или строго вверх / вниз (у).В этих двух случаях значения ШИМ не переворачиваются согласно операторам if, даже если джойстик остается наклоненным.Он действует как «+» - переключатель, если бы он был механически ограничен.Пока все хорошо.
Однако, если кто-то, например, наклонил джойстик влево для слегка более теплого света (ШИМ 176/80), а затем хочет от него ярче и наклонил джойстик вверх (и удерживает егоэто наклонено), значения ШИМ не «останавливаются» на 240/144 (они должны).То же самое относится и к любому другому квадранту.
Как бы мне пришлось усилить / изменить операторы if, чтобы "остановить" значения ШИМ от увеличения / уменьшения по желанию?
Я надеюсь, что ШИМПриведенная ниже матрица значений визуализирует проблему лучше, чем я могу ее объяснить в устной форме.
void changeBrightness()
{
if (lightOn)
{
readJoystick();
if (joyX < triggerLow) // Joystick tilted left
{
if ((leftPWM < 240) || (rightPWM > 16))
{
leftPWM += deltaPWM;
rightPWM -= deltaPWM;
setPWM(leftPWM, rightPWM);
}
}
if (joyX > triggerHigh) // Joystick tilted right
{
if ((leftPWM > 16) || (rightPWM < 240))
{
leftPWM -= deltaPWM;
rightPWM += deltaPWM;
setPWM(leftPWM, rightPWM);
}
}
if (joyY > triggerHigh) // Joystick tilted up
{
if ((leftPWM < 240) || (rightPWM < 240))
{
leftPWM += deltaPWM;
rightPWM += deltaPWM;
setPWM(leftPWM, rightPWM);
}
}
if (joyY < triggerLow) // Joystick tilted down
{
if ((leftPWM > 16) || (rightPWM > 16))
{
leftPWM -= deltaPWM;
rightPWM -= deltaPWM;
setPWM(leftPWM, rightPWM);
}
}
}
else
{
setPWM(0, 0); // Turn the light off
}
}