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

Сделал на миллис, осечки на кнопке исчезли.

Спойлер
#include "Constants.h"
#include "rgbLED.h"
#define plus 4 //
#define minus 3 //
int IK_PIN = 2;        //Пин подключения выходного сигнала с ИК-приёмника
long Y=0;//

//	Основные цвета эффекта
//
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;//
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(millis()-Y>20){
  Y=millis();fl_=!fl_;
 if(FL_){ 
 for (uint8_t i = 0; i < TOTAL_LEDS; i++){if(fl_){theLEDs[i] = BasicColors[0];}else{theLEDs[i] = BasicColors[1];}}
 feedTape();
 } 
 else{
 for (uint8_t i = 0; i < TOTAL_LEDS; i++){if(fl_){theLEDs[i] = BasicColors[2];}else{theLEDs[i] = BasicColors[3];}}
 feedTape(); 
 }
}
}
/////////////////////////////////////////////
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;
   }  
 }
//////////////////////////////////////////////

Для простой адаптации под мой скетч желательно иметь вывод пикселя в виде:

strip.setPixelColor(ni, R*M, B*M, G*M);

где аргументы от 0 до числа пикселей-1, 0-255, 0-255 ,0-255 т.е. адафрутовское восприятие умных пикселей.

Ну, и слава Богу.

А зачем

Что на Gnd его никак посадить нельзя?

Если будете пользоваться, там ничего не ограничивается “именованными цветами” – они просто для удобства. Вы можете задавать любой цвет, какой Вам нравится через R, G и B. Типа

uint8_t red = 212, green = 180, blue = 67;
RgbLED myColor(red, green, blue);

Цвета можно присваивать друг другу, складывать (смешивать), усиливать/ослаблять и т.п., посмотрите в rgbLED.h там все методы расписаны.

Ещё раз повторю, для данного функционала, не нужны никакие два ядра и прочие извороты.
Достаточно всего лишь вспомнить, что INT0 и INT1 имеют максимальный приоритет и имеют настраиваемые параметры прерывания, чего вполне хватает для детектирования сигналов пульта и игнорирования ленты на время приема.

Так проще сразу в платку тыкать.

Спасибо, попробую.

:slight_smile:
Как я вспомню, чего не знал?

Вот читаю Гайвера и не вижу как этот приоритет преодолевает noInterrupts() с которого начинается в библиотеке каждая отсылка данных на ленту.

Ничего не понял. По мне это бессмысленный набор слов.

Функция noInterrupts() запрещает любые прерывания. Ни одно не произойдёт до тех пор, пока запрет не будет отменён функцией interrupts(). Вот и всё. Никто никого не преодолевает.

Я про эту мысль. Как во время приёма ик сигнала игнорируется обновление ленты?

Это к автору, не знаю, что он имел в виду.

Всё равно недопонял. К примеру 244 пиксель в белый цвет будет так выводиться?

theLEDs[243] = RgbLED(255,255,255); 
 feedTape();

Ну, можно и так.

В библиотеке AdafruitNeopixel.h отключение прерывания предусмотрено для модулей типа NRF52 и esp32.
Nano/Uno работает без отключения прерываний.
Что там гивер наваял мне неведомо, я говно не ем.

Зачем человека оскорбляете!? Он ни при чём. Это я нашёл строки:

#if !(defined(NRF52) || defined(NRF52_SERIES) || defined(ESP32))
  noInterrupts(); // Need 100% focus on instruction timing
#endif

и понял их с точностью наоборот - запрет на прерывания всем кроме…
Тем более, что именно ESP32 пестрит на умных пикселях т.е. искажает данные в пакете и без ик управления. И именно если закомментить noInterrupts(); на уно также начинает пестрить лента. Вроде так быть не должно - верно? А оно есть. Может быть у Вас всё и работает с пультами, но у меня при разных вариациях реализаций всегда есть сбои на кнопках, кроме разделения ленты и ик управления по разным ядрам.
…и вообще… надо понимать… программирование вторично к результатам опытов в железе ибо от и до навыдумавыно человеком в отличии от железа, которое сделано им :slight_smile:
А Вы говорите - говно, говно. Оно вторично от человека…ферштейн?

В свою бытность, близко работая с учеными и пофессорами, которые всегда пытались теоретически обосновать любую хрень, появившуюся случайным образом в эксперементе. Это была для них неподкупная радость в моменте, которая в 99% случаях заканчивалась фиаско. У железа всегда есть переходные процессы, которые невозможно предвидеть и описать теоретическими формулами.

Попробовал ws2812b на есп32 с ик управлением. Не нужно разделений на ядра :slight_smile: Куда то пестрение исчезло. Видимо нет запрета на прерывания, осечек кнопок на пульте нет.

нет, это просто частота 240МГц + два ядра + RTOS с ее асинхронными тасками прощает некоторые глупости программиста.

:slight_smile:
Я всё равно не могу смириться. Мне интуитивно кажется, что записи имеют совершенно противоположный смысл.

#if !(defined(NRF52) || defined(NRF52_SERIES) || defined(ESP32))
  noInterrupts(); // Need 100% focus on instruction timing
#endif

уважаемый, ты осознаешь, что для корректной отработки сигнала с одного пина (с частотой сколько там у ИК 48КГц?) тебе требуется по сути полноценный персональный компьютер середины 90х годов, на базе селерона (пушто кеша нет) ? ты правда думаешь, что это не из-за того что ты чето не то делаешь?)
едит: двухпроцессороный ПК.

Не знаю, была цель сделать совместно-корректную работу ws2812b и ик приёмника на варианте функции ТС. Я это сделал на уно, RP2040, ЕСП32. Отрабатывал на ёлочке-гирлянде и пламени (матрица 8*32). Евгений П предложил свой внебиблиотечный вариант управления светодиодами. Пиксели весьма чувственны к прерываниям и пестрят с ними. Вот и всё о чём я думал и делал :slight_smile:

Не знаю какой смысл “противо-”, а какой “за-” “положный”, но если Вы про процитированный кусок кода, то смысл его предельно ясен: если не определена ни одна из трёх констант: NRF52, NRF52_SERIES и ESP32, то вставить вызов noInterrupt().

Никакого другого смысла там нет, ни “за-”, ни противоположного.