Как да свържете RGB LED към Arduino. RGB Led лента, контролирана от Arduino Arduino код за преливане на различни цветове




Широтинно-импулсната модулация (PWM) е забавна и особено забавна за управление на сервоприводи, но днес ще я приложим към трицветен светодиод. Това ще ни позволи да контролираме цвета му и да получим някакво подобие на красота.

PWM

Гениалното определение за PWM е формулирано в Wikipedia, така че просто ще го копирам от там: "ШИМ - сближаване на желания сигнал (многостепенен или непрекъснат) до реални двоични сигнали (с две нива -вкл. изкл ), така че средно за определен период от време стойностите им са равни. <...> У IM е импулсен сигнал с постоянна честота и променливработен цикъл , тоест съотношението на периода на повторение на импулса към неговата продължителност. Чрез задаване на работния цикъл (продължителност на импулса)можете да промените средното напрежение на PWM изхода. "


Сега нека разберем какво означава това. Нека има такъв обикновен правоъгълен сигнал:




Има фиксирана честота и работен цикъл от 50%. Това означава, че половината от периода напрежението е максимално, а другата половина е нула. След като интегрираме този сигнал през периода, ще видим, че неговата енергия е равна на половината от максимума. Това ще бъде същото, както ако ние през цялото времеприложено половин напрежение.


Ако имаме максимално напрежение от 5 V, тогава напрежението, получено на изхода на PWM, е равно на работния цикъл, умножен по 5 V (и разделен на 100%, така че формалният нацист да не е обвързан):


Arduino ви позволява да запишете стойност от 0 до 255 на PWM изхода, което означава, че можем да получим напрежение с разделителна способност от около 20 mV.


Трицветен светодиод

Ето го, четириног красив мъж:


Най-дългият крак е общ анод, а всички останали са катоди, всеки отговаря за своя цвят: (вижте снимката) долният е червен, вторият отгоре е зелен, горният е син.

Ако приложите +5V към дългия крак и 0V към всички останали, ще получите бяла светлина (моля ви, пазете се - сложете ограничителни резистори!). Колко е бяло може да се прецени от следното видео:


Но получаването на бял цвят върху него просто не е интересно. Нека видим как да го накараме да блести с различни цветове.

PWM на Arduino

Честотата на PWM на Arduino е приблизително 490 Hz. На платката Arduino UNO щифтовете, които могат да се използват за PWM са 3,5,6, 9, 10 и 11. На платката има намек за това - има тилда или остър пред номерата на PWM изводи чрез копринено сито.

Нищо не е по-лесно от контролирането на PWM с Arduino! За това има само една функция. analogWrite(пин, стойност), където щифт- изходен номер и стойност- стойност от 0 до 255. В този случай не е необходимо да записвате нищо void setup()!

Можете да прочетете повече за това на английски и.

Работи доста

Нека направим светодиода да блести в различни цветове. Оставете единия цвят бавно да избледнее, докато другият свети. Ще сменим последователно няколко цвята и цветът ще върви в кръг от червено към зелено, от зелено към синьо, от синьо към червено.

Нека съберем проста схема:


И напишете прост код:

//извикване на изходи според цвета
int REDpin = 9;
int ЗЕЛЕН щифт = 10;
int СИН щифт = 11;

нищожен настройвам (){}

нищожен цикъл (){
for (int value = 0 ; стойност<= 255; value +=1) {
// яркостта на червеното намалява
analogWrite(REDpin, стойност);
// яркостта на зеленото се увеличава
analogWrite(GREENpin, 255-стойност);
// синьото е изключено
analogWrite(BLUEpin, 255);
// пауза
забавяне(30);
}

for (int value = 0 ; стойност<= 255; value +=1) {
// червеното е изключено
analogWrite(REDpin, 255);
// яркостта на зеленото намалява
analogWrite(GREENpin, стойност);
// яркостта на синьото се увеличава
analogWrite(BLUEpin, 255-стойност);
// пауза
забавяне(30);
}

for (int value = 0 ; стойност<= 255; value +=1) {
// яркостта на червеното се увеличава
analogWrite(REDpin, 255-стойност);
// зелено изключено
analogWrite(ЗЕЛЕН щифт, 255);
// яркостта на синьото намалява
analogWrite(BLUEpin, стойност);
// пауза
забавяне(30);
}
}

  • 3 резистора от 220 ома (ето отличен набор от резистори с най-често срещаните рейтинги);
  • свързващи проводници (препоръчвам този комплект);
  • макет (макет);
  • персонален компютър с Arduino IDE среда за разработка.
  • 1 Разликата между RGB светодиодитеобщ анод и общ катод

    RGB светодиодите се предлагат в два вида: с общ анод ("плюс")и общ катод ("минус"). Фигурата показва схемните схеми на тези два вида светодиоди. Дългият крак на светодиода винаги е общият захранващ щифт.Изходът на червения светодиод (R) е разположен отделно, зеленият (G) и синият (B) са разположени от другата страна на общия изход, както е показано на фигурата. В тази статия ще разгледаме свързването на RGB LED както с общ анод, така и с общ катод.

    2 Свързване на RGB LED с общ анодкъм Arduino

    Общ анод RGB LED схема на свързванепоказано на фигурата. Свързваме анода към "+5 V" на платката Arduino, останалите три изхода към произволни цифрови щифтове.


    Моля, имайте предвид, че ние свързваме всеки от светодиодите чрез собствен резистор, а не използваме един общ. Препоръчително е да направите точно това, защото всеки от светодиодите има своя собствена ефективност. И ако ги свържете всички през един резистор, светодиодите ще светят с различна яркост.

    За да изчислите бързо стойността на резистора, подходящ за избрания от вас светодиод, можете да използвате онлайн LED калкулатора.

    3 RGB LED управлениес помощта на Arduino

    Нека пренапишем класическата скица мига. Ще активираме и деактивираме всеки от трите цвята на свой ред. Моля, имайте предвид, че светодиодът светва, когато приложим ниско ниво (LOW) към съответния щифт на Arduino.

    // задаване на номера на щифтове: const int pinR = 12; const int pinG = 10; const int pinB = 9; void setup()(// задава присвояване на щифтове: pinMode(pinR, OUTPUT); pinMode(pinG, OUTPUT); pinMode(pinB, OUTPUT); } void loop() ( digitalWrite(pinR, LOW); // осветяване на канала Red delay(100); digitalWrite(pinR, HIGH); //изключете Red delay(200); digitalWrite(pinG, LOW); // осветяване на канала Green delay(100); digitalWrite(pinG, HIGH); // изключване на зеленото забавяне (200); digitalWrite(pinB, LOW); // осветяване на канала Blue delay(100); digitalWrite(pinB, HIGH); //изключете Blue delay(200); }

    4 Сглобете веригатана дъската

    Нека видим как RGB светодиодът мига в действие. Светодиодът свети червено, зелено и синьо на свой ред. Всеки цвят остава включен за 0,1 секунда и след това изгасва за 0,2 секунди и следващият се включва. Можете да осветите всеки канал поотделно, можете всички едновременно, тогава цветът на сиянието ще се промени.


    RGB LED, свързан към Arduino. Веригата е сглобена на макетна платка

    5 към Arduino

    Ако използвате RGB LED с общ катод, след което свържете дългия проводник на светодиода към GND Arduino платки и R, G и B канали към цифровите портове на Arduino. Трябва да се помни, че светодиодите светват, когато се прилага високо ниво (HIGH) към каналите R, G, B, за разлика от светодиод с общ анод.


    Схема на свързване за RGB LED с общ катод към Arduino

    Ако не промените горната скица, тогава всеки цвят на светодиода в този случай ще гори за 0,2 секунди, а паузата между тях ще бъде 0,1 секунда.

    Ако искате да контролирате яркостта на светодиод, свържете RGB LED към цифрови щифтове на Arduino, които имат PWM функция. Такива щифтове на платката Arduino обикновено са маркирани с тилда (вълнообразна линия), звездичка или оградени с кръг.

    Многоцветните светодиоди, или както ги наричат ​​още RGB, се използват за обозначаване и създаване на подсветка, която динамично променя цвета си. Всъщност в тях няма нищо особено, да видим как работят и какви са RGB светодиодите.

    Вътрешна организация

    Всъщност RGB LED е три едноцветни кристала, комбинирани в един пакет. Името RGB означава Червен - червен, Зелен - зелен, Син - син, според цветовете, които всеки от кристалите излъчва.

    Тези три цвята са основни и всеки цвят се образува чрез смесването им; тази технология отдавна се използва в телевизията и фотографията. На снимката по-горе можете да видите сиянието на всеки кристал поотделно.

    На тази снимка виждате принципа на смесване на цветовете, за да получите всички нюанси.

    Кристалите в RGB светодиодите могат да бъдат свързани по следния начин:

    С общ анод;

    С общ катод;

    Няма връзка.

    В първите две опции ще видите, че светодиодът има 4 щифта:

    Или 6 заключения във втория случай:

    На снимката можете да видите ясно видими три кристала под обектива.

    За такива светодиоди се продават специални монтажни подложки, те дори показват целта на заключенията.

    Човек не може да пренебрегне RGBW - светодиодите, тяхната разлика се крие във факта, че в техния случай има друг кристал, който излъчва бяла светлина.

    Естествено, не беше без ленти с такива светодиоди.

    Тази снимка показва лента с RGB светодиоди, сглобени по обща анодна схема, интензитетът на светене се регулира чрез контролиране на "-" (минус) на източника на захранване.

    За промяна на цвета на RGB лентата се използват специални RGB контролери - устройства за превключване на напрежението, подавано към лентата.

    Ето изводите RGB SMD5050:

    И няма ленти, няма специални функции за работа с RGB ленти, всичко остава същото като при монохромните модели.

    За тях има и конектори за свързване на LED лентата без запояване.

    Ето изводите за 5 мм RGB LED:

    Как се променя цветът на сиянието

    Регулирането на цвета се извършва чрез регулиране на яркостта на излъчването на всеки от кристалите. Вече разгледахме.

    RGB контролерът за лентата работи на същия принцип, той има микропроцесор, който управлява отрицателния изход на захранването - свързва го и го изключва от веригата на съответния цвят. Контролерът обикновено се доставя с дистанционно управление. Контролерите се предлагат с различен капацитет, размерът им зависи от това, като се започне от такъв миниатюрен.

    Да, толкова мощно устройство в калъф с размерите на захранване.

    Те са свързани към лентата по следната схема:

    Тъй като участъкът от пистите върху лентата не позволява свързването на следващата секция от лентата последователно с нея, ако дължината на първата надвишава 5 m, трябва да свържете втората секция с проводници директно от RGB контролера.

    Но можете да излезете от ситуацията и да не дърпате допълнителни 4 проводника на 5 метра от контролера и да използвате RGB усилвател. За работата му трябва да опънете само 2 проводника (плюс и минус 12V) или да захранвате друго захранване от най-близкия източник на 220V, както и 4 "информационни" проводника от предишния сегмент (R, G и B), които са необходими да получава команди от контролера, така че цялата структура да свети по същия начин.

    И следващият сегмент вече е свързан към усилвателя, т.е. използва сигнала от предишното парче лента. Тоест, можете да захранвате лентата от усилвател, който ще бъде разположен непосредствено до нея, като по този начин спестявате пари и време за полагане на проводници от основния RGB контролер.

    Ние настройваме RGB-LED със собствените си ръце

    И така, има две опции за управление на RGB светодиодите:

    Ето вариант на схемата без използването на arduin и други микроконтролери, използващи три CAT4101 драйвера, способни да доставят ток до 1A.

    Сега обаче контролерите са доста евтини и ако трябва да регулирате LED лентата, тогава е по-добре да закупите готова версия. Схемите с arduino са много по-прости, особено след като можете да напишете скица, с която или ръчно да зададете цвета, или изборът на цветове ще бъде автоматичен в съответствие с посочения алгоритъм.

    Заключение

    RGB-LED ви позволяват да направите интересни светлинни ефекти, използвани в интериорния дизайн, като подсветка за домакински уреди, за ефекта на разширяване на телевизионния екран. Няма специални разлики при работа с тях от обикновените светодиоди.

    За управление на тези устройства се използва RGB контролер. Но освен него през последните години се използва и платката Arduino.

    Arduino - принципът на действие

    arduino дъска

    Платката Arduino е устройство, на което е инсталиран програмируем микроконтролер. Към него са свързани различни сензори, контроли или енкодери и според дадена скица (програма) платката управлява двигатели, светодиоди и други задвижващи механизми, включително други платки Arduino, използвайки протокола SPI. Устройството може да се управлява чрез дистанционно управление, Bluetooth модул, HC-06, Wi-Fi, ESP или интернет и бутони. Някои от най-популярните платки са Arduino Nano и Arduino Uno, както и Arduino Pro Mini, устройство, базирано на микроконтролера ATmega 328.


    Външен вид Arduino Pro Mini
    Външен вид Arduino Uno
    Външен вид Arduino micro

    Програмирането се извършва в среда с отворен код Arduino, инсталирана на обикновен компютър. Програмите се изтеглят чрез USB.

    Принципът на управление на натоварването чрез Arduino


    Arduino управление

    Платката има много изходи, както цифрови, с две състояния - включено и изключено, така и аналогови, управлявани чрез PWM контролер с честота 500 Hz.

    Но изходите са проектирани за ток от 20 - 40 mA с напрежение 5 V. Това е достатъчно за захранване на индикатор RGB LED или 32x32 mm LED матричен модул. За по-мощен товар това не е достатъчно.

    За да разрешите този проблем в много проекти, трябва да свържете допълнителни устройства:

    • Реле. В допълнение към отделни релета със захранващо напрежение 5V има цели възли с различен брой контакти, както и с вградени стартери.
    • Усилватели на биполярни транзистори. Мощността на такива устройства е ограничена от управляващия ток, но можете да сглобите верига от няколко елемента или да използвате транзисторен монтаж.
    • Полеви или MOSFET транзистори. Могат да управляват товари с токове от няколко ампера и напрежения до 40 - 50 V. При свързване на mosfet към PWM и двигател или друг индуктивен товар е необходим защитен диод. Когато е свързан към светодиоди или LED лампи, това не е необходимо.
    • Разширителни платки.

    Свързване на LED лента към Arduino


    свързване на LED лента към arduino

    Експертно мнение

    Алексей Бартош

    Специалист по ремонт, поддръжка на електрическо оборудване и индустриална електроника.

    Попитайте експерт

    Arduino Nano може да управлява повече от просто електрически двигатели. Използват се и за LED ленти. Но тъй като изходният ток и напрежението на платката не са достатъчни за директно свързване на лента със светодиоди към нея, трябва да се монтират допълнителни устройства между контролера и LED лентата.

    чрез реле


    Свързване чрез реле

    Релето е свързано към устройството към цифров изход. Управляваната с нейна помощ лента има само две състояния - включено и изключено. Необходими са три релета за управление на червено-синьо-зелената лента. Токът, който такова устройство може да контролира, е ограничен от мощността на бобината (намотка с ниска мощност не е в състояние да затвори големи контакти). За свързване на повече мощност се използват релейни възли.

    С биполярен транзистор


    Свързване с транзистор

    Биполярен транзистор може да се използва за усилване на изходния ток и напрежение. Избира се според тока и напрежението на товара. Управляващият ток не трябва да бъде по-висок от 20 mA, поради което се захранва чрез токоограничаващо съпротивление от 1 - 10 kOhm.

    По-добре е да се използва транзисторът n-p-nс общ емитер. За по-голямо усилване се използва схема с няколко елемента или транзисторен модул (чип на усилвателя).

    С полеви транзистор

    В допълнение към биполярните, за управление на лентите се използват полеви транзистори. Друго име на тези устройства е MOS или MOSFET-транзистор.

    Такъв елемент, за разлика от биполярния, се управлява не от ток, а от напрежение на портата. Това позволява на малък ток на порта да задвижва големи токове на натоварване - до десетки ампера.

    Елементът е свързан чрез токоограничаващо съпротивление. В допълнение, той е чувствителен към смущения, така че изходът на контролера трябва да бъде свързан към земята с резистор 10 kΩ.

    С разширителни платки


    Свързване на Arduino с разширителни платки

    В допълнение към релета и транзистори се използват готови блокове и разширителни платки.

    Това може да бъде Wi-Fi или Bluetooth, драйвер за управление на двигателя като модула L298N или еквалайзер. Предназначени са за управление на товари с различна мощност и напрежение. Такива устройства са едноканални - те могат да управляват само монохромна лента и многоканални - предназначени за RGB и RGBW устройства, както и ленти с WS 2812 LED.

    Пример за програма


    Arduino и LED лента

    Платките Arduino могат да управляват LED структури според предварително зададени програми. Техните библиотеки могат да бъдат изтеглени от официалния сайт, намерени в Интернет или сами да напишете нова скица (код). Можете да сглобите такова устройство със собствените си ръце.

    Ето някои опции за използване на такива системи:

    • Контрол на осветлението. С помощта на светлинен сензор светлината в стаята се включва както веднага, така и с постепенно увеличаване на яркостта със залеза на слънцето. Включването може да стане и чрез wi-fi, с интегриране в системата "умен дом" или телефонна връзка.
    • Включване на светлината на стълбите или в дълъг коридор. LED осветлението на всяка стъпка поотделно изглежда много хубаво. Когато сензор за движение е свързан към платката, неговата работа ще доведе до последователно, със закъснение, осветлението на стъпките или коридора ще се включи, а деактивирането на този елемент ще доведе до обратен процес.
    • Цветна музика. Чрез прилагане на аудио сигнал към аналоговите входове през филтрите, изходът ще бъде цветно-музикална инсталация.
    • Компютърно модиране. С помощта на подходящи сензори и програми цветът на светодиодите може да зависи от температурата или натоварването на процесора или RAM. Такова устройство работи според протокола dmx 512.
    • Контролиране на скоростта на светлините с енкодер. Подобни инсталации са сглобени на чипове WS 2811, WS 2812 и WS 2812B.

    Видео инструкция

    Наскоро си купих 2 ролки rgb светодиодна лента 5 метра и веднага реши да експериментира с него. Комплектът включваше блок за управление на лентата, но програмите ми се сториха безинтересни и Tinyos Uno беше под ръка (пълен китайски аналог Arduino UNO). Предвид факта, че arduinoработи с максимум 5v на изход, а по-често 3.3v, тогава трябваше да се намери решение. Тази статия показва как да свържете 12 волтова LED лента към arduinoс отделно подаване за лентата и контрол с arduinoизползване на MOSFETs за управление на канала RGB ленти.

    Нека започнем със стандартната спецификация на аналоговата LED лента, която според мен е най-често срещаната.

    • 10,5 мм (0,41") широк, 3 мм (0,12") дебел, 100 мм (3,95") дълъг на сегмент
    • Той е водоустойчив ( Водоустойчив) и без защита ( неводоустойчиви)
    • Има лепяща лента на гърба за закрепване на лентата
    • Максимално напрежение 12V и 60mA на сегмент
    • 3 общи анодни светодиода на сегмент
    • Дължина на вълната на светодиода: 630nm/530nm/475nm
    • Без микроконтролер или контролер чип (чисто аналогово управление)

    Преди да започнете работа с Arduinoи напрежение по-високо от 5 волта, силно ви съветвам да прочетете за, за да не си изгорите Arduino. Описва добре как се използва MOSFETsс Arduino. Ако вече сте чели тази статия, тогава нека продължим.
    За работа с LED лентата ни трябва:

    1. MOSFETтранзистори, които могат да бъдат намерени в същия EBay
    2. Резистори за 10k?
    3. Платка без спойка ( макет)
    4. Окабеляване за свързване arduinoс макет (мъжки-мъжки)
    5. LED лента (взех aliexpressтази лента и смятам да поръчам още няколко от същия продавач)

    Сега да преминем към диаграмата на свързване, от която основната част на тази статия ще стане ясна:

    Сега нека се обърнем към Arduino IDE, в който ще напишем скица за управление на нашата емисия:

    // Обърнете внимание, че тук е останал някакъв наследен код, който изглежда не прави нищо // но не би трябвало да навреди ... // не се занимавайте с тези незаконни суми по-късно #define RED 9// щифт за червения светодиод #define GREEN 10 // щифт за зелено - никога не е посочено изрично #define BLUE 11 // щифт за синьо - никога не е посочено изрично #define SIZE 255 #define DELAY 20 #define HUE_MAX 6.0 #define HUE_DELTA 0.01 (//дълъг делта, 5 делта 6, 7); дълъг rgb; дълъг rgbval; // по неизвестни причини, ако стойността е !=0, светодиодът не свети. Хм... // и наситеността изглежда е обърната float hue=0.0, saturation=1, value=1; /* избран LED SparkFun sku : COM-09264 има максимална яркост (RGB): (2800, 6500, 1200) mcd, така че ние ги нормализираме до 1200 mcd - R 250/600 = 107/256 G 250/950 = 67/256 B 25 /256 */ дълго ярко = ( 107, 67, 256); //дълго ярко = ( 256, 256, 256); дълго k, temp_value; void setup () ( randomSeed(analogRead(4)); for (k= 0; к<3; k++) { pinMode(RED + k, OUTPUT); rgb[k]=0; analogWrite(RED + k, rgb[k] * bright[k]/256); } } void loop() { hue += HUE_DELTA; if (hue >HUE_MAX) (hue=0.0; ) rgbval=HSV_to_RGB(оттенък, наситеност, стойност); rgb = (rgbval & 0x00FF0000) >> 16; // трябва да има по-добри начини rgb = (rgbval & 0x0000FF00) >><3; k++) { // for all three colours analogWrite(RED + k, rgb[k] * bright[k]/256); } delay(DELAY); } long HSV_to_RGB(float h, float s, float v) { // H is given on . S and V are given on . // RGB is returned as a 24-bit long #rrggbb int i; float m, n, f; // not very elegant way of dealing with out of range: return black if ((s<0.0) || (s>1.0) || (v<1.0) || (v> < 0.0) || (h >6.0)) ( return long(v * 255) + long(v * 255) * 256 + long(v * 255) * 65536; ) i = floor(h); f = h - i; if (!(i&1)) ( f = 1 - f; // ако i е четно ) m = v * (1 - s); n = v * (1 - s * f); превключвател (i) ( случай 6: случай 0: връщане long(v * 255) * 65536 + long(n * 255) * 256 + long(m * 255); случай 1: връщане long(n * 255) * 65536 + long(v * 255) * 256 + long(m * 255); случай 2: връщане long(m * 255) * 65536 + long(v * 255) * 256 + long(n * 255); случай 3: връщане long (m * 255) * 65536 + long(n * 255) * 256 + long(v * 255); случай 4: връщане long(n * 255) * 65536 + long(m * 255) * 256 + long(v * 255); случай 5: връщане long(v * 255) * 65536 + long(m * 255) * 256 + long(n * 255); ) )

    Качете скицата в arduino и се наслаждавайте.
    Има и опция за използване на температурен сензор DS18B20който работи според протокола 1 тел.

    Идеята е, че " студена температура,обикновено синьо и гореща температура" ще стане червено. Ако погледнете колелото HSV, което използвахме в първата скица (вижте wiki за цветно колело), ​​цветът ще премине от 240°, когато е студен, до 0°, когато е горещ, като се движи по посока на часовниковата стрелка (преминавайки синьо, зелено и жълто ).

    студена температурав този случай имаме предвид 18 ° C и горещоозначава 30 ° C. Температурите под прага на студено ще се считат за студени, над прага за горене ще се считат за горещи. Окончателният код всъщност е доста прост, след като имате готов HSV код:

    // HSV избледняване/скачане за Arduino // Имайте предвид, че тук е останал някакъв наследен код, който изглежда не прави нищо // но не би трябвало да навреди ... #include "OneWire.h" //#include "Streaming. h" const int DS18S20_Pin = 2; //DS18S20 Сигнален щифт на цифров 2 #define MIN_TEMP 18 #define MAX_TEMP 30 //Температурен чип i/o OneWire ds(DS18S20_Pin); // на цифров щифт 2 // на цифров пин 2 // тези, незаконни суми по-късно #define RED 9// щифт за червен LED #define GREEN 10 // щифт за зелено - никога не е посочено изрично #define BLUE 11 // щифт за синьо - никога не е посочено изрично #define SIZE 255 #define DELAY 0 # define HUE_MAX 6.0 #define HUE_DELTA 0.01 //дълги делти = (5, 6, 7); дълъг rgb; дълъг rgbval; // по неизвестни причини, ако стойността е !=0, светодиодът не свети. Хм... // и наситеността изглежда е обърната float hue=0.0, saturation=1, value=1; /* избран LED SparkFun sku : COM-09264 има максимална яркост (RGB): (2800, 6500, 1200)mcd, така че ние ги нормализираме до 1200 mcd - R 250/600 = 107/256 G 250/950 = 67/2056 B 25 /256 */ long bright = ( 107, 67, 256); //long bright = ( 256, 256, 256); long k, temp_value; void setup () ( randomSeed(analogRead(4)); Serial.begin( 57600); за (k=0; k<3; k++) { pinMode(RED + k, OUTPUT); rgb[k]=0; analogWrite(RED + k, rgb[k] * bright[k]/256); } } void loop() { float temperature = constrain(getTemp(), MIN_TEMP, MAX_TEMP); float deltaTemp = (MAX_TEMP - MIN_TEMP); float deltaHue = 4 - 0; hue = map((temperature - MIN_TEMP) * 100, 0, deltaTemp * 100, deltaHue * 100, 0) / 100.0; //Serial << "Temperature: " << temperature << endl; //Serial << "HUE: " << hue << endl; rgbval=HSV_to_RGB(hue, saturation, value); rgb = (rgbval & 0x00FF0000) >> 16; // трябва да има по-добри начини rgb = (rgbval & 0x0000FF00) >> 8; rgb=rgbval&0x000000FF; за (k=0; k<3; k++) { // for all three colours analogWrite(RED + k, rgb[k] * bright[k]/256); } //delay(DELAY); } float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data; byte addr; if (!ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC is not valid!"); return -1000; } if (addr != 0x10 && addr != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data; byte LSB = data; float tempRead = ((MSB << 8) | LSB); //using two"s compliment float TemperatureSum = tempRead / 16; return TemperatureSum; } long HSV_to_RGB(float h, float s, float v) { // H is given on . S and V are given on . // RGB is returned as a 24-bit long #rrggbb int i; float m, n, f; // not very elegant way of dealing with out of range: return black if ((s<0.0) || (s>1.0) || (v<1.0) || (v>1.0)) ( връщане на 0L; ) ако ((h< 0.0) || (h >6.0)) ( return long(v * 255) + long(v * 255) * 256 + long(v * 255) * 65536; ) i = floor(h); f = h - i; if (!(i&1)) ( f = 1 - f; // ако i е четно ) m = v * (1 - s); n = v * (1 - s * f); превключвател (i) ( случай 6: случай 0: връщане long(v * 255) * 65536 + long(n * 255) * 256 + long(m * 255); случай 1: връщане long(n * 255) * 65536 + long(v * 255) * 256 + long(m * 255); случай 2: връщане long(m * 255) * 65536 + long(v * 255) * 256 + long(n * 255); случай 3: връщане long (m * 255) * 65536 + long(n * 255) * 256 + long(v * 255); случай 4: връщане long(n * 255) * 65536 + long(m * 255) * 256 + long(v * 255); случай 5: връщане long(v * 255) * 65536 + long(m * 255) * 256 + long(n * 255); ) )