+100500!
Вооще не понимаю смех. Пульт и с телевизором и то не на каждое нажатие работает, а тут пульт - платка, бумажка и крышечка и ого - го-го!
Плюс приёмник к пинам просто подключён. Плюс задержка с делеями. Плюс безбиблиотечный вариант. Плюс функция с разомкнутым миром.
я хоть и не программист, но даже мне сложно…
Структуру кода в лооп взял из своего варианта безбиблиотечного управления умными пикселями (донимал народ года два назад вроде как). А там нет буфера для хранения включенных пикселей и приходилось эффект в таком виде писать.
И конечно прерывания. Если в библиотеке снять запрет на прерывания пульт начинает работать без сбоев, но начинает пестрить лента. Поэтому надо писать чтение ИК приёмника без прерываний
У меня есть самогонный код для лент, по возможностям сильно (вообще несоизмеримо) беднее фастледа, но там точно то, что мне нужно и ничего лишнего, потому пользую постоянно.
Так в этом коде я аккуратно открываю прерывания когда они не критичны для ленты и закрываю, когда критичны. Т.е. что-то там постоянно выполняется в прерываниях но тогда, когда ленте не мешает.
Если интересно попробовать, могу поделиться кодом.
братишь, в данном конкретном случае ты говно слепил, безбиблиотечное оно, или библиотечное. не имеет значения)
Они плохо совместимы эти библиотеки. Но не настолько, чтоб попасть в ранг говно. Исправить можно радикально, уже делал - просто ик приёмник на отдельной про мини, т.е. аппаратное разделение библиотек.
Поделитесь, пожалуйста. За эти годы просто интересно стало как их совместить правильно - умные пиксели и ИК приёмник. Все вариации так или иначе сбоят при нажатии кнопок.
я не про библиотеки, я про результат, который, по твоему собственному описанию - говно.
Да что библиотеки ! Говно расплывчатое весьма. Скажем если в поделке пиксели обновляются редко - делей от 70 и выше, то пульт работает адекватно. При меньше 50 хоть занажимайся на кнопки. Если кнопки посылают серии кодов, а не единичный, то пульт прорывается сквозь пиксели. Так что говно пограничное
Щас, минимальный пример подготовлю и выложу.
согласен.
спасибо за адекватную реакцию.
Держите – lilik.zip - Google Диск
Всё это для Uno/Nano c ATmega328P, делалось для себя и “под себя”, поэтому где-то торчат ошмётки моей “экосистемы разработки”, уж извините.
Возьмите архив и распакуйте его в папку скетчей. Появится папка lilik
с некоторым содержимым. Давайте пройдёмся по содержимому:
- в файле
Constants.h
укажите пин, к которому подключена лента, и количество светодиодов в ней; - в файле
rgbLED.h
в строках №№ 7-12 укажите порядок следования цветов в Вашей ленте. Ленты разные бывают, сейчас установлен порядок:GRB
– это порядок ленты на которой я проверял. Не забывайте, чтоtrue
должно быть только в одной из строк 7-12; - файл
NamedColors.h
менять никак не нужно, это просто поименованные цвета (как в Web). Ссылка на таблицу цветов, чтобы “видеть глазами”, в комментарии в самом начале файла; - файл
FeedTape.S
менять тоже не нужно, если у Вас стандартная 16МГц ардуино. Частота указана в строке №58; - в файле
lilik.ino
реализован простенький эффект, разберётесь.
Когда будете экспериментировать, имейте в виду.
- функцию
feedTape()
нельзя вызывать слишком часто. Между вызовами должно пройти как минимум 50 микросекунд. Она сама этого не проверяет, надеется на вызывающего. Так сделано потому, что у меня она всегда вызывается из прерывания таймера и этой проблемы просто нет (я же для себя её писал); - прерывания во время “кормления” ленты допустимы, но там нельзя ковыряться долго. Обработка любого прерывания не должна превышать 40 микросекунд;
Попробуйте запустить, отпишитесь.
P.S. И да, кстати, моя внучка делала на основе этого кода гирлянду, управляемую с IR-пульта. Вроде, не жаловалась на пропуски, могу поискать её код.
Спасибо, попробую разобраться в применении.
Испытал на одной кнопке пульта - осечки не исчезли, но дистанция уверенного управления выросла практически в два раза. Гармонию изуродовал так ( делеи менял от 20 до 500):
Спойлер
#include "Constants.h"
#include "rgbLED.h"
#define plus 4 //
#define minus 3 //
int IK_PIN = 2; //Пин подключения выходного сигнала с ИК-приёмника
// Основные цвета эффекта
//
const RgbLED BasicColors [] = {
colorLime,
colorChocolate,
colorBlue,
colorRed,
colorYellow,
colorMagenta,
colorAquamarine,
colorDeepPink
};
static constexpr uint8_t totalColors = sizeof(BasicColors) / sizeof(BasicColors[0]);
volatile word keycode_ = 0;// переменная хранения кода кнопки
bool FL_=true;//
void setup(void) {
pinMode(PIN_TAPECONTROL, OUTPUT);
pinMode(plus,OUTPUT);//
digitalWrite(plus,HIGH);// плюс питания ик приёмника
pinMode(minus,OUTPUT);//
digitalWrite(minus,LOW);// минус питания ик приёмника
pinMode(IK_PIN, INPUT); // ir recv
attachInterrupt(0, irread, FALLING);
}
void loop(void) {
keypressed();
if(FL_){
for (uint8_t i = 0; i < TOTAL_LEDS; i++){theLEDs[i] = BasicColors[0];}
feedTape();
delay(20);
for (uint8_t i = 0; i < TOTAL_LEDS; i++){theLEDs[i] = BasicColors[1];}
feedTape();
delay(20);
}
else{
for (uint8_t i = 0; i < TOTAL_LEDS; i++){theLEDs[i] = BasicColors[2];}
feedTape();
delay(20);
for (uint8_t i = 0; i < TOTAL_LEDS; i++){theLEDs[i] = BasicColors[3];}
feedTape();
delay(20);
}
}
/////////////////////////////////////////////
void irread() {
volatile static byte n = 0;
volatile static word keycode = 0;
volatile static unsigned long tm = 0;
volatile static unsigned long last = 0;
tm = micros() - last;
last = micros();
n += 1;
if (tm > 3000) {
keycode = 0;
n = 0;
}
if (n >8&&n<=32) {
if (tm > 1500) {keycode += 1;}
keycode = keycode << 1;
}
if(n==32){keycode_ = keycode;keycode = 0;n=0;}
}
//////////////////////////////////////////
void keypressed() {
if(keycode_!=0){
Serial.println(keycode_, HEX);// печатаем код кнопки
//код по обработке значений keycode_
switch (keycode_) {
case 0x906E:
break;
case 0x51AE:
break;
case 0x50AE:
break;
case 0xD12E:
break;
case 0xC03E:
break;
case 0xA15E:
break;
case 0x817E:
FL_=! FL_;
break;
// default:
}
keycode_ = 0;
}
}
//////////////////////////////////////////////
Плохо, что в таблице цветов нет переменной для регулировки их яркости, хотя ясно, что связано это с искажениями цветов.
…А так всё очень в коде красиво, хотя мне мало понятно
Так делеи же будут мешать Вашему пульту! Делайте с микросом! Т .е. я разрешил прерывания во время кормёжки ленты, но не более того.
Кстати, рад, что у Вас заработало.
Что касается
Есть метод у класса, но про это потом, давайте пока про пульт разберёмся.
Честно говоря я думал прерывания работают во время делеев…и вообще работают параллельно программе, пока в ней не запретят их работу.
это невозможно на одном ядре. при синхронном выполнении кода. delay() в ардуино - системная синхронная функция, состоящая из nop, это ж не пентиум)
Почитал забавность прошлых лет:
…как вообще тогда пульт в моих скетчах работает? Для прерываний нет места
ардуино - это экосистема для создания простейших прототипов, и обнаружения интереса у малышни к электронике. За этими пределами начинаются глюки, и перебор версий всяких фуфельных библиотек. Зачем все это в продакшен тащить - я не понимаю. Но кого это остановит и кто я такой, чтобы учить?)