Изменение цвета rgb светодиода с помощью millis()

Parzuval
Offline
Зарегистрирован: 08.08.2021

Приветствую всех! Хотел попробовать разобраться с rgb светодиодом. Нашел данный код для переключения цветов. Помогите переделать его по millis. Заранее благодарен за помощь)

#define RED 11  // присваиваем имя RED для пина 11
#define GRN 10 // присваиваем имя GRN для пина 10
#define BLU  9   // присваиваем имя BLU для пина 9
void setup() {
  pinMode(RED, OUTPUT);  // используем Pin11 для вывода
  pinMode(GRN, OUTPUT); // используем Pin10 для вывода
  pinMode(BLU, OUTPUT);  // используем Pin9 для вывода
}
void loop(){
// плавное включение красного и зеленого цвета
      for (int i = 0; i <= 255; i++) {
        analogWrite(RED, i);
        analogWrite(GRN, i);
        delay(10);
      }
      for (int i = 255; i >= 0; i--) {
        analogWrite(RED, i);
        analogWrite(GRN, i);
        delay(10);
      }

      // плавное включение красного и синего цвета
      for (int i = 0; i <= 255; i++) {
        analogWrite(RED, i);
        analogWrite(BLU, i);
        delay(10);
      }
      for (int i = 255; i >= 0; i--) {
        analogWrite(RED, i);
        analogWrite(BLU, i);
        delay(10);
      }
}
 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Parzuval пишет:

Нашел данный код для переключения цветов. Помогите переделать его по millis. 

А зачем? Из неприятия delay()?

Программа вполне неплохо написана и 100% выполняет свои функции.

Parzuval
Offline
Зарегистрирован: 08.08.2021

Нужно одновременно с этим опрашивать кнопку для изменения эффекта 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

500р

b707
Offline
Зарегистрирован: 26.05.2017

Parzuval пишет:

Нужно одновременно с этим опрашивать кнопку для изменения эффекта 

везде, где у тебя в коде делей - вставь опрос кнопки :) - и будет работать

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Parzuval пишет:

Нужно одновременно с этим опрашивать кнопку для изменения эффекта 

Так убрав delay() Вы все равно не опросите кнопку - for не даст.

Лучше воспользуйтесь советом #4 - 10мс погоды не сделают.

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

Parzuval пишет:

Нужно одновременно с этим опрашивать кнопку для изменения эффекта 


Какого эффекта? Или каких?

lilik
Offline
Зарегистрирован: 19.10.2017
// функция (вниз за loop()) временной задержки с проверкой поступающих данных вместо delay(T1);
void delay_(int T1)
{
long Y=millis();  
while(millis()-Y<T1){
//тут проверяем кнопку и делаем с этим что-то
}
}

Может поможет.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Тогда уж лучше использовать штатный yield()

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

mykaida пишет:

Лучше воспользуйтесь советом #4 

А ещё лучше - советом из #3

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

mykaida пишет:

Лучше воспользуйтесь советом #4 

А ещё лучше - советом из #3

поддерживаю

lilik
Offline
Зарегистрирован: 19.10.2017

DetSimen пишет:

Тогда уж лучше использовать штатный yield()

А как же это работает?.. Нашёл такой пример:

https://www.arduino.cc/en/Reference/SchedulerYield

...в явном виде, без библиотеки 

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

https://newbedev.com/what-is-the-secret-of-the-arduino-yield-function

yield is a "weak" function from Arduino core for AVR. I see one call for it inside wiring.c.

https://atadiat.com/en/e-yield-function-printable-class-mapping-arrays-u...

A useful usage of yield() is to be redefined in the main application code with some sensitive operation while the Arduino makes nothing except for waiting the delay to end, or even implementing some simple scheduler.

 

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

Да не просечёт это новичок. Проще завести отдельный delayKey(10), например, где выполнять delay(10), опрашивать свою кнопку и менять от неё переменную режима.

rkit
Offline
Зарегистрирован: 23.11.2016

Без setjmp/longjmp  выхода из цикла всё равно не будет. А с ними получится геморрой не лучше millis();

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

Так ведь неизвестно же когда ТС нужна смена режима. Если немедленно, то можно так: if (delayKey(10)) return; а в начале loop-а выбираешь режим.

lilik
Offline
Зарегистрирован: 19.10.2017

Для сравнения проверяю по кратким нажатиям кнопки, что лучше "миллис или уиелд"

//тест 
int t=500;// переменная хранения длительностей пауз между переключениями светодиода
bool flag=true;//
void setup()
{
 pinMode(13,OUTPUT);
 digitalWrite(13,LOW);
 pinMode(7, INPUT);//кнопку подключить
 digitalWrite(7, HIGH);// включить подтягивающий резистор к ней
 }

void loop()
{
digitalWrite(13,HIGH); 
delay(t);
//delay_(t);

digitalWrite(13,LOW); 
delay(t);
//delay_(t);
}
////////////////

void yield(){
if(digitalRead (7)==LOW){//если нажата кнопка 7 вывода
//delay(100);//эта строка подвешивает ардуино
if(digitalRead (7)==HIGH){// и отпущена быстро  
 flag=!flag;
 if(flag){t=500;}else{t=100;}//меняем интервал переключений светодиода 
 }
}
 }
 
///////////////
/*
void delay_(int T){
long Y=millis();
while(millis()-Y<T){
if(digitalRead (7)==LOW){//если нажата кнопка 7 вывода
delay(100);
if(digitalRead (7)==HIGH){// и отпущена быстро  
flag=!flag;
 if(flag){t=500;}else{t=100;}//меняем интервал переключений светодиода 
}
}
}
}
*/

И хоть Гайвер утверждает, что легко читать кнопку - на практике не очень.

https://alexgyver.ru/lessons/time/

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

lilik, вы такие шары красивые делаете, кино снимаете, но код у вас... "вырви глаз", ей богу.( Вы ж, вроде, не начинающий. Ну хотя бы ^T что ли в IDE сделайте. А потом сравните со своим.
Как delay() может быть в yield() - это ж вечный кайф получается.)

lilik
Offline
Зарегистрирован: 19.10.2017

Забыл автоформатирование нажать перед вставкой. Оно просто рассеивает скетч, я потом ход мыслей теряю :-)

С кайфом ясно, нарушил причинно-следственные связи. 

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

lilik пишет:

И хоть Гайвер утверждает, что легко читать кнопку - на практике не очень.

https://alexgyver.ru/lessons/time/

Он много чего утверждает. Даже прямо и в этой статье (особо не всматривался, но кое-что в глаза бросилось сразу).

Радует, что хоть библиотеку таймера после замечаний подправил, а то ведь вообще ж ужас был.

Logik
Offline
Зарегистрирован: 05.08.2014

Parzuval пишет:

Приветствую всех! Хотел попробовать разобраться с rgb светодиодом. Нашел данный код для переключения цветов. Помогите переделать его по millis. Заранее благодарен за помощь)

Держи камрад! 

А то эти пиз.оболы те только херни натыкают.

#define RED 11  // присваиваем имя RED для пина 11
#define GRN 10 // присваиваем имя GRN для пина 10
#define BLU  9   // присваиваем имя BLU для пина 9
void setup() {
  pinMode(RED, OUTPUT);  // используем Pin11 для вывода
  pinMode(GRN, OUTPUT); // используем Pin10 для вывода
  pinMode(BLU, OUTPUT);  // используем Pin9 для вывода
}

struct StructMode
{
  uint8_t Ch1;
  uint8_t Ch2;
  uint8_t On;
} ;

StructMode sm[]={
  {RED,GRN,true},
  {RED,GRN,false},
  {RED,BLU,true},
  {RED,BLU,false},
};
void loop(){
  static uint8_t mode = 0;
  static uint8_t i = 0;
  static uint8_t T;

  if((uint8_t)((uint8_t)millis()-T)>=10)
  {
    T+=10;
    analogWrite(sm[mode].Ch1, sm[mode].On?i:255-i);
    analogWrite(sm[mode].Ch2, sm[mode].On?i:255-i);
    if(i==255) mode=mode==3?0:mode+1;
    i++;
    
  }

}

Сам понимаешь, не проверено, ну нету у меня RGB светодиода.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Радует, что хоть библиотеку таймера после замечаний подправил, а то ведь вообще ж ужас был.

вот, а говорили, что безнадёжный, растёт однако )))

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

ua6em пишет:

вот, а говорили, что безнадёжный, растёт однако )))

Клевета! Я, наоборот, его хвалил за старание. Пруф.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

вот, а говорили, что безнадёжный, растёт однако )))

Клевета! Я, наоборот, его хвалил за старание. Пруф.

беру свои слова обратно, этот пост прошёл мимо меня )