Управление RGB светодиодом

VisualKosmos
Offline
Зарегистрирован: 27.07.2018

Добрый день! 

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

Суть проекта:

Светильник на единичном мощном светодиоде rgb 3 вата (напряжение по цветам: красный - 2.4 в макс, синий, зеленый 3.4 в макс. спецификация светодиода: http://p.globalsources.com/IMAGES/PDT/SPEC/141/K1048855141.pdf), органы управления - кнопка физически обрубающая плюс, тактовая кнопка управления. Питание - аккумулятор 18650. Очень нужна помощь в создании скетча программы управляющей светом в двух режимах. //Комментами фиксирую идеал функционала, желательный но не обязательный.

Включение питания //опрос состояния батареи. Заряжена от 70 до 100% - быстрое мигание 3 вспышки зеленым цветом , от 40 до 70% - быстрое мигание 3 вспышки синим цветом, от 0 до 40%- быстрое мигание 3 вспышки красным цветом. Быстрое - задержка между вспышками 0,3 сек.

Одиночное нажатие тактовой кнопки активирует работу системы и переводит к режиму работы 1.

Режим 1: постоянное свечение заданным цветом. Единичное нажатие тактовой кнопки (задержка между нажатиями равно или более 1 секунды) производит смену цвета. Палитра из 5-6 заранее выбранных цветовых значений. При достижении последнего цвета в списке цикл выбора цвета начинается с первого из списка.

Двойное нажатие на тактовую кнопку (менее 1 секунды между нажатиями) переводит систему в режим работы 2.

Режим 2: переменное свечение - режим "радуга". Единичное нажатие на тактовую кнопку производит смену паттерна свечения. 2-3 сочетания мерцаний. Перелив по спектру - плавно разжигаем и гасим цвета. Мерцание - быстрые вспышки цветов поочередно.  При достижении последнего паттерна в списке цикл выбора паттерна начинается с первого из списка. Сочетания цветов совершенно не важны, править буду уже исходя из того как будет смотреться в интерьере.

Повторное двойное нажатие на тактовую кнопку (менее 1 секунды между нажатиями) переводит систему обратно в режим работы 1.

//При падении напряжения на аккумуляторе, заряд от 0 до 20% во время исполнения основного скрипта принудительно переводить в режим "Разряд" - 5 вспышек красным цветом, постоянное свечение красным цветом на 40% мощности.

Надеюсь достаточно подробно описал проект, буду рад если найду человека готового помочь и если не написать за меня, то проконсультировать как зашить во все это безобразие управление кнопкой на смену режимов. Сам пока написал (скопипастил) только скетч плавного перелива цвета. 

const byte rgbPins[3] = {3,5,6};
int dim = 1;

void setup() {
    for(byte i=0; i<3; i++){
        pinMode( rgbPins[i], OUTPUT );
    }
    // начальное состояние - горит красный цвет
    analogWrite(rgbPins[0], 122);
    analogWrite(rgbPins[1], 172);
    analogWrite(rgbPins[2], 172);
}

void loop() {
    // гасим красный, параллельно разжигаем зеленый
    for(int i=173; i>=0; i--){
        analogWrite( rgbPins[0], i/dim );
        analogWrite( rgbPins[1], (173-i)/dim );
        delay(1);
    }
    // гасим зеленый, параллельно разжигаем синий
    for(int i=173; i>=0; i--){
        analogWrite( rgbPins[1], i/dim );
        analogWrite( rgbPins[2], (173-i)/dim );
        delay(1);
    }
    // гасим синий, параллельно разжигаем красный
    for(int i=122; i>=0; i--){
        analogWrite( rgbPins[2], i/dim );
        analogWrite( rgbPins[0], (122-i)/dim );
        delay(1);
    }
}

Контакты для связи: телеграм @kosmos_visuals

VisualKosmos
Offline
Зарегистрирован: 27.07.2018

VisualKosmos пишет:

Включение питания //опрос состояния батареи. Заряжена от 70 до 100% - быстрое мигание 3 вспышки зеленым цветом , от 40 до 70% - быстрое мигание 3 вспышки синим цветом, от 0 до 40%- быстрое мигание 3 вспышки красным цветом. Быстрое - задержка между вспышками 0,3 сек.

Дополнение:

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

Это в идеале. Если собственными силами ардуинки замерить напряжение не получается, то просто ждем нажатия тактовой кнопки. Подозреваю что именно так и получится, т.к. батарея подключена через модуль повышающий 3,7 до 12 в. //Но если кинуть напрямую с батареи два провода на ардуинку и читать показания...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

1999 рублей. andycat2013@yandex.ru

а так вообще тут на форуме примеров по всем вашим вопросам полно.

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

Скетч arduino для определения уровня заряда аккумулятора
Чтобы установить опорное напряжение на аналоговых входах arduino на уровне 1.1В необходимо воспользоваться функцией analogReference и передать ей параметр INTERNAL. Работать с опорным напряжением 1.1В умеют микроконтроллеры ATmega168 и ATmega328, если будет использоваться ATmega8, то при вызове этой же функции, опорным напряжением будет 2.56В.
Для вывода уровня заряда аккумулятора будет использоваться 7-мегментный 4-х разрядный индикатор TM1637, как его использовать, можно почитать в более ранней статье: индикатор TM1637.
Ниже приведен код с подробными комментариями.

// подключение индикатора TM1637
#include <TM1637.h>
#define CLK 3
#define DIO 2 
TM1637 tm1637(CLK,DIO);
 
// пин для считывания напряжения
Int pin_read = A1;
// максимальный заряд аккумулятора
float max_v = 4.25; 
// минимальный заряд аккумулятора
float min_v = 2.75; 
 
void setup(){ 
  // установка опорного напряжения для аналоговых входов
  analogReference(INTERNAL);
  // вывод данных в монитор порта
  Serial.begin(9600);
  // инициализация индикатора
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);
}
  
void loop(){ 
  float Vbat = (analogRead(pin_read) * 1.1) / 1023;
  float del = 0.091; // R2/(R1+R2)  0.99кОм / (9.88кОм + 0.99кОм)
  float Vin = Vbat / del;
  // уровень заряда в процентах
  int proc = ((Vin - min_v) / (max_v - min_v)) * 100;
  // вывод данных в монитор порта
  Serial.println(Vin);
  Serial.println(proc);
  // вывод уровня заряда на индикатор
  tm1637.display(proc);
  delay(1000); 
}

поищите в инете, масса статей.

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

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

по нажатиям кнопки меняете номер режима, а потом через например switch case уже светите светодиодами как надо

Green
Offline
Зарегистрирован: 01.10.2015

Делал. htpicc@gmail.com

skif
skif аватар
Offline
Зарегистрирован: 24.03.2015

Да там ничего сложного. На час работы. 

karamzin01
Offline
Зарегистрирован: 08.03.2018

Здравствуйте, проект интересный, пишите - обсудим , вот почта maslachenko767@mail.ru На руках есть компонентов для отладки вашей задачи

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

Что может быть интересного в мигании тремя диодами?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

sadman41 пишет:

Что может быть интересного в мигании тремя диодами?


Студент или школьник - заказчик, круче моргающих светодиодов наверное ничего не видел (

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Мне больше интересно - Карамзина кто нибудь лично знает? Уж слишком одинаково он всегда отвечает.

Green
Offline
Зарегистрирован: 01.10.2015

Мне больше интересно - заказывает ли у Карамзина кто то? Уж слишком дебильно всё выглятит. Это ж каким лохом нужно быть...

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

andycat пишет:
sadman41 пишет:

Что может быть интересного в мигании тремя диодами?

Студент или школьник - заказчик, круче моргающих светодиодов наверное ничего не видел (

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

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andycat пишет:
Мне больше интересно - Карамзина кто нибудь лично знает? Уж слишком одинаково он всегда отвечает.

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

Так шта...

VisualKosmos
Offline
Зарегистрирован: 27.07.2018

Какой интерес к теме внезапно. 

andycat пишет:
а так вообще тут на форуме примеров по всем вашим вопросам полно.

Совершенно верно, вопрос времени/сил на изучение нового направления. Пожалуй это интересно и попробую разобраться сам.

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