RGB лента + ИК.
- Войдите на сайт для отправки комментариев
Ср, 01/03/2017 - 03:12
Прошу помощи. Ни как не могу заставить, мигать постоянно ленту из функции 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);
}
А самому поотлаживать никак не?
Уже третий день бьюсь. Понимаю, что нужно через циклы. Но ни как не могу написать реализацию. Как заклинило все равно.
Ну, у Вас что написано? Приняли команду 0x2FD807F, вызвали Вашу функцию - она чего-то там зажгла. В следующий раз примете такую же команду, она ещё раз зажжёт уже по-другому. А чего надо-то? Что значит "постоянно". По команде? Так она у Вас мигает. Вы, потрудитесь толком свои хотелки излагать.
Где-то тут читал что правилом хорошего тона считается объявлять пользовательские функции до void loop() или даже до void setup(), потому что такие финты как у тебя с void rgbrandom() не всегда прокатывают. Именно для меня не особо принципиально где именно размещать собственные измышлизмы. Особенно если это избавляет от дополнительных случайностей...
Ну, у Вас что написано? Приняли команду 0x2FD807F, вызвали Вашу функцию - она чего-то там зажгла. В следующий раз примете такую же команду, она ещё раз зажжёт уже по-другому. А чего надо-то? Что значит "постоянно". По команде? Так она у Вас мигает. Вы, потрудитесь толком свои хотелки излагать.
Суда по алгоритму, мигать должно каждый раз по новому, но только в случае нажатия определенной (строка 29) кнопки на ДУ (строка 27). Беда в том что поток с пульта состоит из нескольких пакетов и я в своё время намучался с этим фактом.
Суда по алгоритму, мигать должно каждый раз по новому,
Ну, судя по тому, что написано в коде - мигать вовсе не должно. Должно однократно изменять цвет при нажатии кнопки. А вот чего ТС при этом типа-хотел, пусть сам толково объяснит, у шара ресурс ограниченный и зачем его на всякую фигню растрачивать.
Суда по алгоритму, мигать должно каждый раз по новому,
Ну, судя по тому, что написано в коде - мигать вовсе не должно. Должно однократно изменять цвет при нажатии кнопки. А вот чего ТС при этом типа-хотел, пусть сам толково объяснит, у шара ресурс ограниченный и зачем его на всякую фигню растрачивать.
Отчего же? У него конкретно написано что кнопка должна быть какая-то определенная:
void loop(void) { if (irrecv.decode(&results)) // Если пришла команда с пульта { switch (results.value) // Начинаем ее обрабатывать { case 0x2FD807F: // Если нажата кнопка, код которой 0x2FD807F rgbrandom(); // Запустить подпрограмму rgbrandom() break; // прекратить работу swith-case }22Извеняюсь, за непонятки. Мысли были такие, что бы при нажатии клавиши "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; }Понимаю, что это нужно сделать через циклы, но ни как не могу понять какое условие должно быть.
При чём здесь циклы? Сам подход неверен!
Например, как Ардуина должна ловить сигнал с ИК-пульта во время delay(700) ?
Отчего же? У него конкретно написано что кнопка должна быть какая-то определенная:
Ну, да, а чему это противоречит? Определённая кнопка - один раз влючили. Снова та же кнопка - включили другой цвет.
Пытался вставить goto, но тогда цикл преврашается в бесконечный и пульт на нажатия кнопок не реагирует. Понимаю, что это нужно сделать через циклы,
Подходить нужно не от инструмента (goto или там ещё чего), а от задачи.
Для начала СЛОВАМИ, ПО РУССКИ но четко точно и однозначно опишите что Вы хотие сделать.
Потом уже заменяйте эти слова на операторы языка. На какие - а там видно будет по написанным словам.
Т.е. сейчас вам надо думать не о goto и циклах, а о чётком прописывании алгоритма словами.
Всем спасибо за "помощь", разобрался.
#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); } }Не раздражает, что от нажатия до срабатывания по полсекунды проходит? А то может сделать ещё шаи и от delay избавиться?
шаи
???
шаг
Буду благодарен, если подскажите как это организовать.
Так пример "юлин без delay" вроде с сайта никто не убирал. Смотрите, изучайте.