Цвета 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);
}
@Sudras Elagor, 👍-1
Обсуждение1 ответ
Лучший ответ:
Я предполагаю, что вы можете исправить любые ошибки в своем коде, и я хочу получить предложение о возможно лучшем подходе к тому, что, как я думаю, вы пытаетесь сделать.
Когда вы устанавливаете «цвет», вы устанавливаете яркость каждого из светодиодов; R, G, B, или, по крайней мере, вы пытаетесь это сделать, когда генерируете случайный ШИМ с помощью AnalogWrite https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/.
Затем вы пытаетесь снова установить яркость, предположительно на основе значения окружающего освещения из LDR, И оно установлено для комбинированного выхода трех светодиодов, которые, вероятно, имеют разные значения интенсивности. , так как интенсивность была выбрана случайно. Проблема в том, как идеально масштабировать значения, чтобы получить тот же цвет, но с меньшей интенсивностью? Я думаю, что это намного сложнее, чем вы думаете... по целому ряду причин.
Я бы посоветовал вам попробовать что-то в этом роде, но воздерживаться от некоторых ожиданий...
Используйте переменную с именем maxb, которая изменяет максимально возможное значение, используемое в значениях AnalogWrite(), чтобы оно не всегда равнялось 255. Вы можете настроить это значение на основе чтения LDR. . Вам придется немного поэкспериментировать и не ожидать большого диапазона значений. Теперь ваш цвет по-прежнему будет выбираться случайным образом, но с поправкой на интенсивность.
Вы "должны" попробовать использовать резисторы на каждом из RGB-светодиодов, которые будут давать что-то близкое к эквивалентной яркости. Это будет несколько различаться между светодиодами RGB. Ниже приведен график того, где я смотрел на это для проекта цветового фейдера много лет назад. Я использовал старый датчик внешней освещенности BH1750, чтобы получить значения в люксах. Эта пунктирная линия соответствует эквивалентной яркости отдельных светодиодов по номиналу резистора (Ом) [220-красный, 750-зеленый, 470-синий]. Это не идеальный способ, но он простой.
- Это может приблизить вас к тому, чего вы хотите, но для "дополнительной оценки" обратите внимание, что масштабирование яркости не является равноинтервальной шкалой. Таким образом, значение ШИМ 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.
- Я не знаю, как яркость представлена в вашем LDR, и вы должны учитывать, что при определении значений интенсивности окружающего света — в идеале вам нужно 13 одинаковых значений интенсивности из вашего LDR — верно? Я предполагаю, что что-то об этом, вероятно, есть в техпаспорте.
Я бы так и сделал в любом случае :)
Спасибо! это очень помогает! Я не думал, что это будет легко с самого начала, но это помогло мне понять, насколько это сложно. Я обязательно начну экспериментировать с кодом еще немного и, надеюсь, получу удовлетворительный результат!, @Sudras Elagor
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Реализовать связь Visible Light с помощью Arduino
- Как изменить яркость светодиодного освещения?
- Ошибка переменной does not name a type!
- 4-битный счетчик вверх и вниз
- Скетч мигания ESP8266 не мигает светодиодом
- TX,RX,ON,l светодиоды всегда были красными
- Акцептант векселей ИКТ
Если вы получаете ошибку во время компиляции, пожалуйста, включите полную информацию об ошибке (включая информацию о том, где произошла ошибка) в вопросе. Также: выполнение двух вызовов 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