@Maikesteps

Програмирования arduino (RF пульт, RF приёмник, LED ленты, RCSwitch). Почему медленно переключается с циклов?

Здравствуйте. Есть такой код (там есть немного лишнего, но сейчас нету особой надобности убирать):
UPD: время от времени редактирую код (делаю "красивим" и "покороче", убираю лишнее)
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
const int kod1 = 5592323; //коди клавиш
const int kod2 = 5592332;
const int kod3 = 5592335;
const int kod4 = 5592368;
const int kod5 = 5592371;
const int kod6 = 5592380;
const int kod7 = 5592383;
const int kod8 = 5592512;
const int kod9 = 5592515;
const int kod10 = 5592524;
const int kod11 = 5592527;
const int kod12 = 5592560;
const int red = 12; //виходи на ленту
const int green = 11;
const int blue = 10;
int kod;
int i;

void setup() {
pinMode(2, OUTPUT);
pinMode(5, OUTPUT);
digitalWrite(2, 1);
digitalWrite(5, 0);
Serial.begin(9600);
mySwitch.enableReceive(1); // приемник на пин2
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(blue, OUTPUT);
}

void loop() {
  kod = mySwitch.getReceivedValue();
if (kod == kod1) {
analogWrite(red, 20);
analogWrite(green, 0);
analogWrite(blue, 0);
}
else if (kod == kod2) {
analogWrite(red, 0);
analogWrite(green, 20);
analogWrite(blue, 0);
}
else if (kod == kod3) {
analogWrite(red, 0);
analogWrite(green, 0);
analogWrite(blue, 20);
}
else if (kod == kod4) {
analogWrite(green, 0);
for (i = 0; i < 30; i++)
{
analogWrite(red, 30);
analogWrite(blue, i);
delay(30);
}
analogWrite(blue, 30);
analogWrite(red, 30);
delay(300);
for (i = 30; i > 0; i--)
{
analogWrite(blue, 30);
analogWrite(red, i);
delay(30);
}
analogWrite(blue, 30);
delay(300);
for (i = 0; i < 30; i++)
{
analogWrite(blue, 30);
analogWrite(green, i);
delay(30);
}
analogWrite(green, 30);
analogWrite(blue, 30);
delay(300);
for (i = 30; i > 0; i--)
{
analogWrite(green, 30);
analogWrite(blue, i);
delay(30);
}
analogWrite(green, 30);
delay(300);
for (i = 0; i < 30; i++)
{
analogWrite(green, 30);
analogWrite(red, i);
delay(30);
}
analogWrite(green, 30);
analogWrite(red, 30);
delay(300);
for (i = 30; i > 0; i--)
{
analogWrite(red, 30);
analogWrite(green, i);
delay(30);
}
analogWrite(red, 30);
delay(300);
}
else if (kod == kod5) {
for (i = 1; i < 40; i++) {
analogWrite(red, 50);
analogWrite(green, 0);
analogWrite(blue, 10 + i);
delay(40);
}
analogWrite(red, 50);
analogWrite(green, 0);
analogWrite(blue, 49);
delay(150);
for (i = 40; i > 1; i--) {
analogWrite(red, 50);
analogWrite(green, 0);
analogWrite(blue, 10 + i);
delay(40);
}
analogWrite(red, 50);
analogWrite(green, 0);
analogWrite(blue, 11);
delay(150);
}
else if ((kod == kod6) || (kod == kod7) || (kod == kod8) || (kod == kod9)
|| (kod == kod10) || (kod == kod11) || (kod == kod12)) {
analogWrite(red, 0);
analogWrite(green, 0);
analogWrite(blue, 0);
}
}


Суть: по нажатию кнопки на пульте менять режим свечение RGB ленты.
Если запущен режим типа "хамелеон" то выход с него не моментальный, а пока не пройдет весь "цикл цветов".

Как сделать моментальным?
Пока единственная идея добавить еще одну ардуину (самую простую). И что бы она при приходе кода пульта отличного от того, который пришел до нее ранее, она выдавала единичку на свой выход, который соединён с прерыванием основной ардуини (или с reset что бы наверняка).

Может есть другие варианты?

Видео работы сейчас:

1 - красный (переключается моментально)
2 - зеленый (переключается моментально)
3 - синий (переключается моментально)
4 - хамелеон (с него очень долго переключается )
5 - вариации розового (с него переключается быстрее, но всё равно долго)

Вот такой длинновопрос =)
Спасибо!

P.S. в сети много уроков как сделать ардуину пультом, но нету как сделать ардуино исполнительным устройством (ну вы поняли). Есть смысл расписать в песочнице как это сделать?
  • Вопрос задан
  • 919 просмотров
Решения вопроса 1
А что происходит при отсутствии сигнала?

Как вариант примерно следующее:
Добавить внутрь цикла проверку условия. Алгоритм примерно такой:
Перед запуском цикла фиксируем код, по которому попали на условие.
В цикле периодически читаем код с приемника (например каждые 10 проходов цикла).
Если новый считанный код отличен от того, по которому попали в цикл (а также от того, что возвращается при отсутствии сигнала), то делаем break для досрочного выхода из цикла.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@magazovski
там есть немного лишнего, но сейчас нету особой надобности убирать

У вас daeay стоит в цикле. Это вешает ваш контроллер. Вам надо освоить таймер.

В целом вам надо одновременно, а вы все последовательно напихали.
Самое простое, в функции loop вы должны читать кнопку и запускать один шаг цикла переключения. То есть сделать один внешний for, и уже внутри делать логику.
Ответ написан
@vanyamba-electronics
Попробуйте использовать leOS — многозадачное ядро для Arduino.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы