RGB лента + ИК.

vovikon
Offline
Зарегистрирован: 15.02.2017

Прошу помощи. Ни как не могу заставить, мигать постоянно ленту из функции rgbrandom();. Промаргивает один раз и все.

 

#include <IRremote.h>
#include <IRremoteInt.h>

#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 9


IRrecv irrecv(10); // Указываем пин, к которому подключен приемник
decode_results results;

int r = 0;
int g = 0;
int b = 0;

void setup(void) 
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Запускаем прием
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
}

void loop(void) 
{
  if (irrecv.decode(&results)) 
    {

     switch (results.value)    
     {   
       case 0x2FD807F:
       rgbrandom();
       break;
     }
       

    }
    
   irrecv.resume();
   delay(500); 
}

void rgbrandom()
{ 
  r=random(0,255);
  g=random(0,255);
  b=random(0,255);
  analogWrite(REDPIN,r);
  analogWrite(BLUEPIN, b);
  analogWrite(GREENPIN, g);
  delay(700);
}

 

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

А самому поотлаживать никак не?

vovikon
Offline
Зарегистрирован: 15.02.2017

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

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

Ну, у Вас что написано? Приняли команду 0x2FD807F, вызвали Вашу функцию - она чего-то там зажгла. В следующий раз примете такую же команду, она ещё раз зажжёт уже по-другому. А чего надо-то? Что значит "постоянно". По команде? Так она у Вас мигает. Вы, потрудитесь толком свои хотелки излагать.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Где-то тут читал что правилом хорошего тона считается объявлять пользовательские функции до void loop() или даже до void setup(), потому что такие финты как у тебя с void rgbrandom() не всегда прокатывают. Именно для меня не особо принципиально где именно размещать собственные измышлизмы. Особенно если это избавляет от дополнительных случайностей...

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

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

Ну, у Вас что написано? Приняли команду 0x2FD807F, вызвали Вашу функцию - она чего-то там зажгла. В следующий раз примете такую же команду, она ещё раз зажжёт уже по-другому. А чего надо-то? Что значит "постоянно". По команде? Так она у Вас мигает. Вы, потрудитесь толком свои хотелки излагать.

Суда по алгоритму, мигать должно каждый раз по новому, но только в случае нажатия определенной (строка 29) кнопки на ДУ (строка 27). Беда в том что поток с пульта состоит из нескольких пакетов и я в своё время намучался с этим фактом.

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

Buzzer2010 пишет:

Суда по алгоритму, мигать должно каждый раз по новому, 

Ну, судя по тому, что написано в коде - мигать вовсе не должно. Должно однократно изменять цвет при нажатии кнопки. А вот чего ТС при этом типа-хотел, пусть сам толково объяснит, у шара ресурс ограниченный и зачем его на всякую фигню растрачивать.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

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

Buzzer2010 пишет:

Суда по алгоритму, мигать должно каждый раз по новому, 

Ну, судя по тому, что написано в коде - мигать вовсе не должно. Должно однократно изменять цвет при нажатии кнопки. А вот чего ТС при этом типа-хотел, пусть сам толково объяснит, у шара ресурс ограниченный и зачем его на всякую фигню растрачивать.

Отчего же? У него конкретно написано что кнопка должна быть какая-то определенная:

void loop(void)
	{
	  if (irrecv.decode(&results))          // Если пришла команда с пульта
	    {
	     switch (results.value)             // Начинаем ее обрабатывать
	     {  
	       case 0x2FD807F:                  // Если нажата кнопка, код которой 0x2FD807F
	       rgbrandom();                     // Запустить подпрограмму rgbrandom() 
	       break;                           // прекратить работу swith-case
	     }

 

22  

 

vovikon
Offline
Зарегистрирован: 15.02.2017

Извеняюсь, за непонятки. Мысли были такие, что бы при нажатии клавиши "0x2FD807F" RGB лента мигала разными цветами, пока не будет нажата другая кнопка: отключения, либо другого режима. 
Пытался вставить goto, но тогда цикл преврашается в бесконечный и пульт на нажатия кнопок не реагирует. Понимаю, что это нужно сделать через циклы, но ни как не могу понять какое условие должно быть.

 

void rgbrandom()

{

label:

  r=random(0,255);

  g=random(0,255);

  b=random(0,255);

  analogWrite(REDPIN,r);

  analogWrite(BLUEPIN, b);

  analogWrite(GREENPIN, g);

  delay(700);

goto label;

}

 

arduinec
Offline
Зарегистрирован: 01.09.2015

vovikon пишет:

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

При чём здесь циклы? Сам подход неверен!
Например, как Ардуина должна ловить сигнал с ИК-пульта во время delay(700) ?

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

Buzzer2010 пишет:

Отчего же? У него конкретно написано что кнопка должна быть какая-то определенная:

Ну, да, а чему это противоречит? Определённая кнопка - один раз влючили. Снова та же кнопка - включили другой цвет.

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

vovikon пишет:

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

Подходить нужно не от инструмента (goto или там ещё чего), а от задачи.

Для начала СЛОВАМИ, ПО РУССКИ но четко точно и однозначно опишите что Вы хотие сделать.

Потом уже заменяйте эти слова на операторы языка. На какие - а там видно будет по написанным словам.

Т.е. сейчас вам надо думать не о goto и циклах, а о чётком прописывании алгоритма словами.

vovikon
Offline
Зарегистрирован: 15.02.2017

Всем спасибо за "помощь", разобрался.
 

 

#include <IRremote.h>
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 9


int RECV_PIN = 10;
IRrecv irrecv(RECV_PIN);
decode_results results;
int r = 0;
int g = 0;
int b = 0;
boolean d = false;


void setup()
{
  irrecv.enableIRIn();
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
  
}

void loop()
{
  if (irrecv.decode(&results))
  {
    switch (results.value)
    {
    case 0x2FD807F:
    d = !d;
    break; 
    
    case 0x2FD40BF:
    d=false;
    r=255;
    g=0;
    b=0;
    analogWrite(REDPIN,r);
    analogWrite(BLUEPIN, b);
    analogWrite(GREENPIN, g);
    break;
    }
    irrecv.resume();
  }

  if (d == true)
  {
    int pause =random(100,500);     
    r=random(0,255);
    g=random(0,255);
    b=random(0,255);
    analogWrite(REDPIN,r);
    analogWrite(BLUEPIN, b);
    analogWrite(GREENPIN, g);
    delay(pause);
  }
 
}

 

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

Не раздражает, что от нажатия до срабатывания по полсекунды проходит? А то может сделать ещё шаи и от delay избавиться?

vovikon
Offline
Зарегистрирован: 15.02.2017

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

 шаи

 

???

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

шаг

vovikon
Offline
Зарегистрирован: 15.02.2017

Буду благодарен, если подскажите как это организовать.

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

Так пример "юлин без delay" вроде с сайта никто не убирал. Смотрите, изучайте.