В детскую часы на 2812 8х8 и пульт

+100500! :slight_smile:

1 лайк

Вооще не понимаю смех. Пульт и с телевизором и то не на каждое нажатие работает, а тут пульт - платка, бумажка и крышечка и ого - го-го!
Плюс приёмник к пинам просто подключён. Плюс задержка с делеями. Плюс безбиблиотечный вариант. Плюс функция с разомкнутым миром.

я хоть и не программист, но даже мне сложно…

1 лайк

Структуру кода в лооп взял из своего варианта безбиблиотечного управления умными пикселями (донимал народ года два назад вроде как). А там нет буфера для хранения включенных пикселей и приходилось эффект в таком виде писать.

И конечно прерывания. Если в библиотеке снять запрет на прерывания пульт начинает работать без сбоев, но начинает пестрить лента. Поэтому надо писать чтение ИК приёмника без прерываний :slight_smile:

У меня есть самогонный код для лент, по возможностям сильно (вообще несоизмеримо) беднее фастледа, но там точно то, что мне нужно и ничего лишнего, потому пользую постоянно.

Так в этом коде я аккуратно открываю прерывания когда они не критичны для ленты и закрываю, когда критичны. Т.е. что-то там постоянно выполняется в прерываниях но тогда, когда ленте не мешает.

Если интересно попробовать, могу поделиться кодом.

братишь, в данном конкретном случае ты говно слепил, безбиблиотечное оно, или библиотечное. не имеет значения)

Они плохо совместимы эти библиотеки. Но не настолько, чтоб попасть в ранг говно. Исправить можно радикально, уже делал - просто ик приёмник на отдельной про мини, т.е. аппаратное разделение библиотек.

Поделитесь, пожалуйста. За эти годы просто интересно стало как их совместить правильно - умные пиксели и ИК приёмник. Все вариации так или иначе сбоят при нажатии кнопок.

я не про библиотеки, я про результат, который, по твоему собственному описанию - говно.

Да что библиотеки ! Говно расплывчатое весьма. Скажем если в поделке пиксели обновляются редко - делей от 70 и выше, то пульт работает адекватно. При меньше 50 хоть занажимайся на кнопки. Если кнопки посылают серии кодов, а не единичный, то пульт прорывается сквозь пиксели. Так что говно пограничное :slight_smile:

Щас, минимальный пример подготовлю и выложу.

согласен.
спасибо за адекватную реакцию.

Держите – lilik.zip - Google Диск

Всё это для Uno/Nano c ATmega328P, делалось для себя и “под себя”, поэтому где-то торчат ошмётки моей “экосистемы разработки”, уж извините.

Возьмите архив и распакуйте его в папку скетчей. Появится папка lilik с некоторым содержимым. Давайте пройдёмся по содержимому:

  1. в файле Constants.h укажите пин, к которому подключена лента, и количество светодиодов в ней;
  2. в файле rgbLED.h в строках №№ 7-12 укажите порядок следования цветов в Вашей ленте. Ленты разные бывают, сейчас установлен порядок: GRB – это порядок ленты на которой я проверял. Не забывайте, что true должно быть только в одной из строк 7-12;
  3. файл NamedColors.h менять никак не нужно, это просто поименованные цвета (как в Web). Ссылка на таблицу цветов, чтобы “видеть глазами”, в комментарии в самом начале файла;
  4. файл FeedTape.S менять тоже не нужно, если у Вас стандартная 16МГц ардуино. Частота указана в строке №58;
  5. в файле 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;
   }  
 }
//////////////////////////////////////////////

Плохо, что в таблице цветов нет переменной для регулировки их яркости, хотя ясно, что связано это с искажениями цветов.
…А так всё очень в коде красиво, хотя мне мало понятно :slight_smile:

Так делеи же будут мешать Вашему пульту! Делайте с микросом! Т .е. я разрешил прерывания во время кормёжки ленты, но не более того.

Кстати, рад, что у Вас заработало.

Что касается

Есть метод у класса, но про это потом, давайте пока про пульт разберёмся.

Честно говоря я думал прерывания работают во время делеев…и вообще работают параллельно программе, пока в ней не запретят их работу.

это невозможно на одном ядре. при синхронном выполнении кода. delay() в ардуино - системная синхронная функция, состоящая из nop, это ж не пентиум)

Почитал забавность прошлых лет:

…как вообще тогда пульт в моих скетчах работает? Для прерываний нет места :slight_smile:

ардуино - это экосистема для создания простейших прототипов, и обнаружения интереса у малышни к электронике. За этими пределами начинаются глюки, и перебор версий всяких фуфельных библиотек. Зачем все это в продакшен тащить - я не понимаю. Но кого это остановит и кто я такой, чтобы учить?)