Плавное переключение цветов
- Войдите на сайт для отправки комментариев
Втр, 06/03/2018 - 16:51
Доброго времени суток!
Есть помещение в котором наклеена RGB-лента, а также имеется датчик температуры и влажности. В нашем случае испольщуется только температура. Набросал код на арудино, но не знаю, как лучше реализовать смену цветов в момент смены температуры.
Прошу вашей помощи, друзья!
#include <DHT.h> #define DHTPIN A0 DHT dht(DHTPIN, DHT11); int r=9, g=8, b=10, temp; void setup() { // temp max = 32 //temp min = 29 pinMode(r, OUTPUT); pinMode(g, OUTPUT); pinMode(b, OUTPUT); digitalWrite(r,LOW); digitalWrite(g,LOW); digitalWrite(b,LOW); Serial.begin(9600); dht.begin(); } void loop() { int temp = dht.readTemperature(); switch (temp) { case 29: analogWrite(b,255); analogWrite(g,0); analogWrite(r,0); break; case 30: analogWrite(b,170); analogWrite(g,230); analogWrite(r,0); break; case 31: analogWrite(b,0); analogWrite(g,55); analogWrite(r,200); break; case 32: analogWrite(b,0); analogWrite(g,0); analogWrite(r,255); break; } Serial.print(temp); Serial.println(""); delay(500); }
но не знаю, как лучше реализовать смену цветов в момент смены температуры.
Ну, Вы не знаете как лучше, а мы не знаем как Вам нужно ... беда.
Опишите поподробней что именно Вы хотите получить в итоге и в тогда (возможно) Вам помогут. А перебирать варианты того, что может получиться, никто не захочет, их очень и очень много.
Пояснил предыдущий ответ...
Я логически не понимаю, как реализовать.
Допустим температура 29 градусов, по условию загорается синий цвет. Через некоторое время температура становится 30 градусов загорается смесь синего и зеленегого, и так делее. Как сделать плавным переход от синего к сине-зеленому, а не просто, чтобы он резко включался, как это реализовано сейчас. Как плавно перейти от b(255)-b(170), g(0)-g(255)?
Я думал в case делать просто присвоение значений переменным r,g,b, а уже после него в конце делать циклы с присвоением i-го значения до границы переменных r,g,b. Но так и не пришел ни к чему. Поэтому и привел основной, простой код
Если у Вас диапазон температуры мал, то для плавности Вам нужно измерять температуру точнее - не надо округлять её до целого. Switch - Case уже не будет. Значения R,G,B надо считать. Выберите G для минимальной температуры, G для максимальной температуры. И считайте пропорционально значение G для Вашей температуры. И так все три цвета (или пару хотя бы, а один постоянный). Наверное не самый лучший алгоритм, но плавность будет. Для начала так попробуйте.
Я логически не понимаю, как реализовать.
Допустим температура 29 градусов, по условию загорается синий цвет. Через некоторое время температура становится 30 градусов загорается смесь синего и зеленегого, и так делее.
Вы логически не понимаете не "как реализовать", а как Вам надо, чтобы она работала.
Сначала сядьте и выпишите (письменно!!! не думайте, что он у Вас в голове - нету там в голове ни хрена, не Вы первый - не Вы последний - только письменно!). Что Вам надо. При этом не используйте никаких слов типа case, хренейс и т.п. - только в терминах сутевой задачи.
При этом Вы должны получить полное решение. Т.е. не бред типа "допустим 29, а не допустим, так 30", а точное описание из которого Вы или любой другой должен пониямать что должно быть при 29, что при 30, а что при 29,4!!!)
Вот только тогда, когда у Вас это будет написано, причём написано так, чтобы кроме Вас понимал кто-то ещё, только тогда можно начинать думать о программировании.
Невозможно сделать "не знаю что".
Кстати, заранее может дать почитать человеку статью про нелинейность цветового восприятия? Чтобы добить...
Дайте
kalapanga, благодарю за идею!
Уважаемые ЕвгенийП и sadman41, если у Вас нет желания помочь, а есть только желание съясвзить и поставить себя выше остальных, то зачем Вы тогда обитаете на этом форуме? Сходите на другие площадки, и там "помогите".
Уважаемый, bpirozhok,
1
я Вам посветовал самое правильное поведение в этой ситуации. То, что я написал, это самое правильное, что Вам сейчас надо делать. Ничего лучше Вам посветовать нельзя - это я Вам говорю, как программист с 39-летнм стажем.
2.
sadman41 написал абсолютно правильную вещь, т.к. следующим Вашим вопросом будет: "а почему я увеличиваю скважность ШИМ, но после 130 ничего не меняется, как сделать, чтобы менялось до 255?". 100% новичков на этом форуме, которые задают вопросы, как Ваш первый, приходят и со вторым - 100%. Человек Вам сразу посоветовал прочитать про нелинейность восприятия и увеличивать скважность не линейно, а по степнному закону. Это очень дельная подсказка.
Я считаю, что мы Вам реально серьёзно помогли, но Вы этого не поняли в силу отсутствия необходимых знаний. И потому решили, в благодарность за помощь (хотя бы за попытку), нам нахамить. Спасибо Вам огромное!
А по-поводу Ваших советов, как нам здесь себя вести, что писать, а что - нет, сравните даты регистрации свою и мою или sadman41 - мы здесь больше лет, чем Вы дней! Потому, попрошу Вас быть немного скромнее с советами. Пока что мы здесь хозяева, а Вы - гость.
Уважаемые ЕвгенийП и sadman41, если у Вас нет желания помочь, а есть только желание съясвзить и поставить себя выше остальных, то зачем Вы тогда обитаете на этом форуме? Сходите на другие площадки, и там "помогите".
1. Вам как раз пытаются помочь. Если Вы этого не видите, это говорит лишь о Вашей неспособности принять помощь.
2. А вообще, мне кажется, что пора предложить Вам "сходить" куда-нибудь.