Плавное переключение цветов

bpirozhok
Offline
Зарегистрирован: 06.03.2018

Доброго времени суток!
Есть помещение в котором наклеена 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);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bpirozhok пишет:

 но не знаю, как лучше реализовать смену цветов в момент смены температуры.

Ну, Вы не знаете как лучше, а мы не знаем как Вам нужно ... беда.

Иван_123
Offline
Зарегистрирован: 17.01.2018

Опишите поподробней что именно Вы хотите получить в итоге и в тогда (возможно) Вам помогут. А перебирать варианты того, что может получиться, никто не захочет, их очень и очень много.

Пояснил предыдущий ответ...

bpirozhok
Offline
Зарегистрирован: 06.03.2018

Я логически не понимаю, как реализовать.
Допустим температура 29 градусов, по условию загорается синий цвет. Через некоторое время температура становится 30 градусов загорается смесь синего и зеленегого, и так делее. Как сделать плавным переход от синего к сине-зеленому, а не просто, чтобы он резко включался, как это реализовано сейчас. Как плавно перейти от b(255)-b(170), g(0)-g(255)?

Я думал в case делать просто присвоение значений переменным r,g,b, а уже после него в конце делать циклы с присвоением i-го значения до границы переменных r,g,b. Но так и не пришел ни к чему. Поэтому и привел основной, простой код

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Если у Вас диапазон температуры мал, то для плавности Вам нужно измерять температуру точнее - не надо округлять её до целого. Switch - Case уже не будет. Значения R,G,B надо считать. Выберите G для минимальной температуры, G для максимальной температуры. И считайте пропорционально значение G для Вашей температуры. И так все три цвета (или пару хотя бы, а один постоянный). Наверное не самый лучший алгоритм, но плавность будет. Для начала так попробуйте.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bpirozhok пишет:

Я логически не понимаю, как реализовать.
Допустим температура 29 градусов, по условию загорается синий цвет. Через некоторое время температура становится 30 градусов загорается смесь синего и зеленегого, и так делее. 

Вы логически не понимаете не "как реализовать", а как Вам надо, чтобы она работала.

Сначала сядьте и выпишите (письменно!!! не думайте, что он у Вас в голове - нету там в голове ни хрена, не Вы первый - не Вы последний - только письменно!). Что Вам надо. При этом не используйте никаких слов типа case, хренейс и т.п. - только в терминах сутевой задачи.

При этом Вы должны получить полное решение. Т.е. не бред типа "допустим 29, а не допустим, так 30", а точное описание из которого Вы или любой другой должен пониямать что должно быть при 29, что при 30, а что при 29,4!!!)

Вот только тогда, когда у Вас это будет написано, причём написано так, чтобы кроме Вас понимал кто-то ещё, только тогда можно начинать думать о программировании.

Невозможно сделать "не знаю что".

sadman41
Offline
Зарегистрирован: 19.10.2016

Кстати, заранее может дать почитать человеку статью про нелинейность цветового восприятия? Чтобы добить...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дайте

bpirozhok
Offline
Зарегистрирован: 06.03.2018

kalapanga, благодарю за идею!

bpirozhok
Offline
Зарегистрирован: 06.03.2018

Уважаемые ЕвгенийП и sadman41, если у Вас нет желания помочь, а есть только желание съясвзить и поставить себя выше остальных, то зачем Вы тогда обитаете на этом форуме? Сходите на другие площадки, и там "помогите".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Уважаемый, bpirozhok,

1
я Вам посветовал самое правильное поведение в этой ситуации. То, что я написал, это самое правильное, что Вам сейчас надо делать. Ничего лучше Вам посветовать нельзя - это я Вам говорю, как программист с 39-летнм стажем.

2.
sadman41 написал абсолютно правильную вещь, т.к. следующим Вашим вопросом будет: "а почему я увеличиваю скважность ШИМ, но после 130 ничего не меняется, как сделать, чтобы менялось до 255?". 100% новичков на этом форуме, которые задают вопросы, как Ваш первый, приходят и со вторым - 100%. Человек Вам сразу посоветовал прочитать про нелинейность восприятия и увеличивать скважность не линейно, а по степнному закону. Это очень дельная подсказка.

Я считаю, что мы Вам реально серьёзно помогли, но Вы этого не поняли в силу отсутствия необходимых знаний. И потому решили, в благодарность за помощь (хотя бы за попытку), нам нахамить. Спасибо Вам огромное!

А по-поводу Ваших советов, как нам здесь себя вести, что писать, а что - нет, сравните даты регистрации свою и мою или sadman41 - мы здесь больше лет, чем Вы дней! Потому, попрошу Вас быть немного скромнее с советами. Пока что мы здесь хозяева, а Вы - гость.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

bpirozhok пишет:

Уважаемые ЕвгенийП и sadman41, если у Вас нет желания помочь, а есть только желание съясвзить и поставить себя выше остальных, то зачем Вы тогда обитаете на этом форуме? Сходите на другие площадки, и там "помогите".

1. Вам как раз пытаются помочь. Если Вы этого не видите, это говорит лишь о Вашей неспособности принять помощь.

2. А вообще, мне кажется, что пора предложить Вам "сходить" куда-нибудь.