Цвета RGB LED рандомизируются, а LDR затухает одновременно

Я тоже пытаюсь сделать RGB-светодиод, который продолжает случайным образом менять цвет и заставлять яркость уменьшаться одновременно с LDR, но я продолжаю получать сообщение об ошибке, указывающее на слишком много аргументов для функций.

кто-нибудь может мне помочь?

ИЗМЕНИТЬ: (это правильный код, извините)

 const int LED_D_RGB_G_PIN = 11;
const int LED_D_RGB_B_PIN = 10;
const int LED_D_RGB_R_PIN = 9;
const int LDR = A1; 

int inputval=0; 
int outval =0; 

void setup() {
  pinMode(LED_D_RGB_R_PIN, OUTPUT);
  pinMode(LED_D_RGB_G_PIN, OUTPUT);
  pinMode(LED_D_RGB_B_PIN, OUTPUT);
  pinMode(LDR, INPUT);

}

void loop() {
    inputval = analogRead(LDR); 
    outval = map(inputval, 0, 380, 255, 0); 

    int lightval = constrain(outval, 0,255);

    analogWrite(LED_D_RGB_R_PIN, lightval, random(0,255));
    analogWrite(LED_D_RGB_G_PIN, lightval, random(0,255));
    analogWrite(LED_D_RGB_B_PIN, lightval, random(0,255)); 
    delay (50);
}

, 👍-1

Обсуждение

Если вы получаете ошибку во время компиляции, пожалуйста, включите полную информацию об ошибке (включая информацию о том, где произошла ошибка) в вопросе. Также: выполнение двух вызовов AnalogWrite на одних и тех же контактах сразу после другого не сработает. Только второй вызов для каждого вывода будет иметь какой-либо эффект., @chrisl

у вас есть логическая ошибка в вашем коде... вы хотите выбрать случайный цвет, а затем отрегулировать яркость этого цвета... это не то, что происходит в вашем коде... код устанавливает три светодиода на случайную яркость ... который одновременно устанавливает случайный цвет и случайную яркость ... вам нужно выбрать случайный цвет полной яркости, а затем отрегулировать яркость, не меняя цвет, @jsotola

Я хочу, чтобы он продолжал случайным образом менять цвета с помощью RGB, в то же время регулируя яркость с помощью LDR. Я просто не знаю, как заставить их делать это отдельно. также я случайно выгрузил неправильный код. извини. Код, с которым у меня возникла проблема, был с этим в конце: AnalogWrite (LED_D_RGB_R_PIN, lightval, random (0,255)); AnalogWrite (LED_D_RGB_G_PIN, lightval, random (0,255)); AnalogWrite (LED_D_RGB_B_PIN, lightval, random (0,255)); задержка (50); }, @Sudras Elagor

Вам нужно поместить этот код в свой вопрос, а не в комментарии, где мы не можем легко его прочитать. Так есть ли еще ошибка компиляции? Уточните свой вопрос, отредактировав его., @chrisl

analogWrite() принимает два аргумента... analogWrite(LED_D_RGB_R_PIN, lightval, random(0,255)); имеет три аргумента... вот почему вы получили сообщение об ошибке компилятора, @jsotola

как я уже сказал, выберите цвет... затем отрегулируйте яркость... затем выведите значение на аналоговые контакты... если вы установите цвет напрямую, как в analogWrite(LED_D_RGB_G_PIN, random(0,255)), тогда вам придется заменить 255 значением, зависящим от LDR., @jsotola


1 ответ


Лучший ответ:

1

Я предполагаю, что вы можете исправить любые ошибки в своем коде, и я хочу получить предложение о возможно лучшем подходе к тому, что, как я думаю, вы пытаетесь сделать.

Когда вы устанавливаете «цвет», вы устанавливаете яркость каждого из светодиодов; R, G, B, или, по крайней мере, вы пытаетесь это сделать, когда генерируете случайный ШИМ с помощью AnalogWrite https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/.

Затем вы пытаетесь снова установить яркость, предположительно на основе значения окружающего освещения из LDR, И оно установлено для комбинированного выхода трех светодиодов, которые, вероятно, имеют разные значения интенсивности. , так как интенсивность была выбрана случайно. Проблема в том, как идеально масштабировать значения, чтобы получить тот же цвет, но с меньшей интенсивностью? Я думаю, что это намного сложнее, чем вы думаете... по целому ряду причин.

Я бы посоветовал вам попробовать что-то в этом роде, но воздерживаться от некоторых ожиданий...

  1. Используйте переменную с именем maxb, которая изменяет максимально возможное значение, используемое в значениях AnalogWrite(), чтобы оно не всегда равнялось 255. Вы можете настроить это значение на основе чтения LDR. . Вам придется немного поэкспериментировать и не ожидать большого диапазона значений. Теперь ваш цвет по-прежнему будет выбираться случайным образом, но с поправкой на интенсивность.

  2. Вы "должны" попробовать использовать резисторы на каждом из RGB-светодиодов, которые будут давать что-то близкое к эквивалентной яркости. Это будет несколько различаться между светодиодами RGB. Ниже приведен график того, где я смотрел на это для проекта цветового фейдера много лет назад. Я использовал старый датчик внешней освещенности BH1750, чтобы получить значения в люксах. Эта пунктирная линия соответствует эквивалентной яркости отдельных светодиодов по номиналу резистора (Ом) [220-красный, 750-зеленый, 470-синий]. Это не идеальный способ, но он простой.

  1. Это может приблизить вас к тому, чего вы хотите, но для "дополнительной оценки" обратите внимание, что масштабирование яркости не является равноинтервальной шкалой. Таким образом, значение ШИМ 250 НЕ в 10 раз ярче, чем значение ШИМ 25. Яркость более или менее находится в экспоненциальной шкале, за исключением очень тусклых значений, которые, опять же, более или менее линейны. Посмотрите на формулу воспринимаемой легкости CIE 1931, Вебера, Стивенса и так далее. Поскольку это не лаборатория психофизики, позвольте мне перейти к делу. Массив ниже представляет шкалу интенсивности, как я описал, и включает значения 0 и 255 в соответствии с разрядностью 8 бит (именно это использует AnalogWrite). Вы можете использовать минимальное значение 4 или 8 вместо 0, если хотите каждый раз гарантировать видимый вывод. Проверьте это, но ради обсуждения предположим, что вы используете все значения в массиве.

А[13]{0,1,2,4,8,17,32,51,75,106,145,194,255};

Вы должны масштабировать диапазон LDR до 13 возможных значений (0–12), а затем получить максимальное значение для AnalogWrite из массива. Затем вы должны выбрать случайное значение от 0 до maxb для каждой из ваших аналоговых записей в RGB.

  1. Я не знаю, как яркость представлена в вашем LDR, и вы должны учитывать, что при определении значений интенсивности окружающего света — в идеале вам нужно 13 одинаковых значений интенсивности из вашего LDR — верно? Я предполагаю, что что-то об этом, вероятно, есть в техпаспорте.

Я бы так и сделал в любом случае :)

,

Спасибо! это очень помогает! Я не думал, что это будет легко с самого начала, но это помогло мне понять, насколько это сложно. Я обязательно начну экспериментировать с кодом еще немного и, надеюсь, получу удовлетворительный результат!, @Sudras Elagor