Добрый день господа! Помогите пожалуйста с кодом. В том виде в котором код приведён ниже, без проблем читается информация с ИК пульта и caunter увеличивается или уменьшается, но стоит раскомментировать строку 60 и всё, приёмник перестаёт работать.
Я понимаю, что основное время программа “гуляет” в цикле RGBLoop() и поэтому сработки приёмника нет, но как победить эту задачу не знаю…
Буду благодарен если поможете.
// приёмник на D2
#define IR_1 0x50
#define IR_2 0x68
#include <NecDecoder.h>
NecDecoder ir;
byte counter;
//=============================
#include <Adafruit_NeoPixel.h>
#define PIN 5
#define NUM_LEDS 8
// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(9600);
attachInterrupt(0, irIsr, FALLING);
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void irIsr() {
ir.tick();
}
//=====================
void RGBLoop(){
for(int j = 0; j < 3; j++ ) {
// Fade IN
for(int k = 0; k < 256; k++) {
switch(j) {
case 0: setAll(k,0,0); break;
case 1: setAll(0,k,0); break;
case 2: setAll(0,0,k); break;
}
showStrip();
delay(3);
}
// Fade OUT
for(int k = 255; k >= 0; k--) {
switch(j) {
case 0: setAll(k,0,0); break;
case 1: setAll(0,k,0); break;
case 2: setAll(0,0,k); break;
}
showStrip();
delay(3);
}
}
}
//=====================
void loop() {
// RGBLoop();
if (ir.available()) {
switch (ir.readCommand()) {
case IR_1: {
Serial.println("Pressed UP");
counter++;
break;
}
case IR_2: {
Serial.println("Pressed DOWN");
counter--;
break;
}
}
}
}
void showStrip() {
strip.show();
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
strip.setPixelColor(Pixel, strip.Color(red, green, blue));
}
void setAll(byte red, byte green, byte blue) {
for(int i = 0; i < NUM_LEDS; i++ ) {
setPixel(i, red, green, blue);
}
showStrip();
}
Не совсем понимаю что должно измениться? Вы просто перенесли процедуру RGBLoop() в конец кода или я невнимателен?
Попробовал, поведение никак не изменилось.
Вынеси с 61 по 74 строки код в отдельную функцию и вызывай её в циклах в функции RGBLoop().
Не уверен, что это решит проблему 100%, но попробовать стОит…
Я не до конца понимаю, что там couter делает, ну икремент/декримень дальше не вижу щоб он использовался,может ослеп.
Чет прям хочется код считывать в irIsr()
Знаю что какашка но прям в лоб решения не вижу.
так вроде правильно, все эти блоки должны идти после loop…
но а вообще я упился энергетиками))) и не слушайте меня
так же возможно уменьшение задержки или вовсе отдать таймер для задач пульта или выбора цвета поможет решить проблему…
Спасибо, мне кажется я нечто подобное пытался городить, но все равно не получалось… Попробую ваш код завтра вечером.
По прерываниям, строки 23, 29…31 как бы на него намекают, вот только ума как ими воспользоваться не хватает…
При нажатии кнопки на пульте я при любом раскладе мгновенно попадаю вот сюда
Эх, чешется же мне в одном месте…
Быстренько включил комп перед выходом на работу, проверил. Ни код от уважаемого BOOMa ни код от уважаемого Дим-мыча не работают толком. Можно хоть обнажиматься на кнопку, происходит в начале одно-два совершенно случайных редких срабатывания но не более того, и то не всегда…