Например TDA7294

Форум РадиоКот • Просмотр темы - Interrupt для чайника
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн дек 15, 2025 00:14:24

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Interrupt для чайника
СообщениеДобавлено: Пн июн 12, 2023 10:11:54 
Родился

Зарегистрирован: Вт фев 21, 2023 08:01:54
Сообщений: 12
Рейтинг сообщения: 0
Помогите чайнику...

Вот код лампы на ARGB управляю через IR пульт.
Как только выполняю функцию SvetFire(); по прерыванию не могу сменить переменную comm
В чем моя ошибка ?
Спойлер
Код:
#include <NecDecoder.h>
NecDecoder ir;
volatile int comm;

#include "FastLED.h"
#include <FastLEDsupport.h>  // нужна для шума

#define PIN 13
#define WIDTH 11      // Светодиодов в кольце
#define HEIGHT 27     // Колец в лампе
#define NUM_LEDS 300  //300

CRGB leds[NUM_LEDS];
byte counter;
boolean Svet = false;
int br = 128;
int HE = 40;
byte baza = 0;  // изменение оттенка LED


void setup() {

  Serial.begin(115200);

  attachInterrupt(0, irIsr, FALLING);
  pinMode(PIN, OUTPUT);
  FastLED.addLeds<WS2811, PIN, RGB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);

  FastLED.setBrightness(255);
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].setHue(HE);
  }
  FastLED.setBrightness(0);
  FastLED.show();
}

// Функция вызываемая прерыванием
// в прерывании вызываем tick()
void irIsr() {
  ir.tick();
  if (ir.available()) {
    comm = ir.readCommand();
    Serial.println(comm);
  }
}

void loop() {  // ЦИКЛ по comm
               //  Serial.println(comm);
  switch (comm) {

    case 162:  // (1)
      SvetRED();
      break;

    case 98:  // (2)
      if (Svet) SvetGREEN();
      break;

    case 226:  // (3)
      if (Svet) SvetBLUE();
      break;

    case 34:  // (4)
      if (Svet) SvetYELLOW();
      break;

    case 2:  // (5)
      if (Svet) SvetWHITE();
      break;

    case 194:  // (6)
      if (Svet) SvetPURPUR();
      break;

    case 224:  // (7)
      SvetFire();
      break;

    case 168:  // (8)
      SvetFire2();
      break;

    case 144:  // (9)
      if (Svet) SvetKONFETI();
      break;

    case 104:  // (*)
      SvetYaMinus();
      comm = 0;
      break;

    case 152:  // (0)
      if (Svet) SvetYaAvr();
      break;

    case 176:  // (#)
      SvetYaPlus();
      SvetBLINK();
      comm = 0;
      break;

    case 24:  // (up) увеличить яркость
      br = FastLED.getBrightness();
      br += 4;
      FastLED.setBrightness(br);
      FastLED.show();
      comm = 0;
      break;

    case 16:  // (left)
      if (Svet) SvetColMINUS();
      comm = 0;
      break;

    case 56:  // (Ok) Включение и выключение света
      if (Svet) {
        SvetOFF();
      } else {
        HE = 64;
        SvetON();
      }
      Svet = !Svet;
      comm = 0;
      break;

    case 90:  // (rigth)
      if (Svet) SvetColPLUS();
      comm = 0;
      break;

    case 74:  // (doun) уменьшить яркость
      br = FastLED.getBrightness();
      br -= 4;
      FastLED.setBrightness(br);
      FastLED.show();
      comm = 0;
      break;
  }
}

/////////////////////////////////////////////////////////////////////////////////////////////
void SvetFire2() {

  FastLED.setBrightness(255);
  for (int ii = 0; ii < NUM_LEDS; ii++) {
    leds[ii] = CRGB(0, 0, 0);
    //Serial.println(ii);
  }
  FastLED.show();

  // Заполняем нижнее кольцо
  for (int y = 0; y < 256; y++) {
    for (int x = 0; x < 300; x++) {  //WIDTH

      //FastLED.setBrightness(random(40,65)); //Общая яркость
      //leds[i] = CHSV(random(10, 37), random(200, 255), random(40, 250));
      leds[x] = CHSV(inoise8(x * 50, y * 50, y * 50), 255, 255);
      // Serial.print(x);
      // Serial.print(" ");
      // Serial.println(inoise8(x * 20));
      if (comm != 168) break;
    }
    FastLED.show();
  }


  //Поднимаем кольца вверх
  for (int i = 1; i < HEIGHT; i++) {
    for (int j = 0; j < WIDTH; j++) {
      leds[i * WIDTH + j] = leds[(i - 1) * WIDTH + j];
      leds[i * WIDTH + j] -= CRGB(8, 8, 8);
    }
    FastLED.show();
  }

  delay(50);

  FastLED.show();
}

void SvetFire() {
  FastLED.setBrightness(128);

  // Заполняем нижнее кольцо
  for (int i = 0; i < WIDTH; i++) {
    //FastLED.setBrightness(random(40,65)); //Общая яркость
    leds[i] = CHSV(random(10, 37), random(200, 255), random(40, 250));
  }
  FastLED.show();
  // Поднимаем кольца вверх
  for (int i = 1; i < HEIGHT; i++) {
    for (int j = 0; j < WIDTH; j++) {
      leds[i * WIDTH + j] = leds[(i - 1) * WIDTH + j];
      leds[i * WIDTH + j] -= CRGB(8, 8, 8);
    }
    FastLED.show();
  }
  delay(50);
  comm = 0;
  // FastLED.show();
}
// убавить яркость до 1
void SvetYaMinus() {
  for (int i = br; i >= 4; i--) {
    FastLED.setBrightness(i);
    FastLED.show();
  }
  br = 4;
}
// увеличить яркость до 255
void SvetYaPlus() {
  for (int i = br; i < 256; i++) {
    FastLED.setBrightness(i);
    FastLED.show();
    //delay(40);
  }
  br = 255;
}
// Яркость по средине
void SvetYaAvr() {
  if (br < 128) {
    for (int i = br; i < 128; i++) {
      FastLED.setBrightness(i);
      FastLED.show();
    }
  } else {
    for (int i = br; i >= 128; i--) {
      FastLED.setBrightness(i);
      FastLED.show();
    }
  }
  br = 128;
}
//*** ON Включение света
void SvetON() {
  SvetYELLOW();
  for (int i = 0; i < br; i++) {
    FastLED.setBrightness(i);
    FastLED.show();
    //delay(50);
  }
  //SvetBLINK();
}
// OFF Выключение света
void SvetOFF() {
  for (int i = br; i >= 0; i--) {
    FastLED.setBrightness(i);
    FastLED.show();
  }
  HE = 40;
  br = 128;
  baza = 0;
}
// Моргнуть яркостью
void SvetBLINK() {
  FastLED.setBrightness(br - br / 4);
  FastLED.show();
  delay(100);
  FastLED.setBrightness(br);
  FastLED.show();
}
// ФОКУС
void SvetFOCUS() {
  for (int ii = 0; ii < NUM_LEDS; ii++) {
    fadeToBlackBy(leds, NUM_LEDS, 2);
    for (int i = 0; i < 8; i++) {
      leds[beatsin16(i + 7, 0, NUM_LEDS - 1)] |= CHSV(baza += 16, 200, 255);
    }
  }
  FastLED.setBrightness(br);
  FastLED.show();
  //delay(20);
}
// ЦИКЛОН
void SvetCICLON() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].nscale8(250);
  }
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = CHSV(baza++, 255, 255);
    FastLED.setBrightness(br);
    FastLED.show();
    //delay(20);
  }
}
// Радуга
void SvetRADUGA() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = CHSV(baza + i * 5, 255, 255);
  }
  baza++;
  FastLED.setBrightness(br);
  FastLED.show();
}
// Конфети
void SvetKONFETI() {
  for (int i = 0; i < NUM_LEDS; i++) {
    for (int j = 0; j < 4; j++) {
      fadeToBlackBy(leds, NUM_LEDS, 2);
      int pos = random16(NUM_LEDS);
      leds[pos] += CHSV(baza++ + random8(64), 200, 255);
      FastLED.setBrightness(br);
      FastLED.show();
    }
  }
}
// Раскраска RGB очередность
void SvetRGB() {
  for (int i = 0; i < NUM_LEDS / 3; i++) {
    leds[i * 3].setHue(1);
    leds[i * 3 + 1].setHue(95);
    leds[i * 3 + 2].setHue(160);
  }
  FastLED.show();
  comm = 0;
}
// Красный цвет
void SvetRED() {
  for (int i = 0; i < NUM_LEDS; i++) {
    HE = 1;
    leds[i].setHue(HE);
  }
  FastLED.show();
  comm = 0;
}
// БЕЛЫЙ цвет
void SvetWHITE() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = CRGB::White;
    FastLED.setBrightness(br);
  }
  FastLED.show();
  comm = 0;
}
// Зеленый свет
void SvetGREEN() {
  for (int i = 0; i < NUM_LEDS; i++) {
    HE = 95;
    leds[i].setHue(HE);
  }
  FastLED.show();
  comm = 0;
}
// Синий цвет
void SvetBLUE() {
  for (int i = 0; i < NUM_LEDS; i++) {
    HE = 160;
    leds[i].setHue(HE);
  }
  FastLED.show();
  comm = 0;
}
// Желтый цвет
void SvetYELLOW() {
  HE = 40;
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].setHue(HE);
  }
  FastLED.show();
  comm = 0;
}  // Пурпурный цвет
void SvetPURPUR() {
  HE = 232;
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].setHue(HE);
  }
  FastLED.show();
  comm = 0;
}
// Цвет НUЕ увеличить
void SvetColPLUS() {
  br = FastLED.getBrightness();
  HE += 4;
  for (int i = 0; i < NUM_LEDS; i++) {  // Прибавить цвет
    leds[i].setHue(HE);
  }
  FastLED.setBrightness(br);
  FastLED.show();
}
// Цвет НUЕ уменьшить
void SvetColMINUS() {
  br = FastLED.getBrightness();
  HE -= 4;
  for (int i = 0; i < NUM_LEDS; i++) {  // Убавить цвет
    leds[i].setHue(HE);
  }
  FastLED.setBrightness(br);
  FastLED.show();
}



Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Interrupt для чайника
СообщениеДобавлено: Вт июн 13, 2023 05:12:35 
Опытный кот

Карма: -9
Рейтинг сообщений: 28
Зарегистрирован: Пт янв 27, 2012 20:07:54
Сообщений: 859
Откуда: Томск
Рейтинг сообщения: 0
По смыслу вашей программы - похоже не требуется запихивать проверку ir.available() в прерывание.
Переместите проверку и чтение в loop, как это указано в примере использования библиотеки.

Возможно, проблема заключается в использовании Serial.println(comm) внутри прерывания.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Interrupt для чайника
СообщениеДобавлено: Вт июн 13, 2023 09:28:49 
Родился

Зарегистрирован: Вт фев 21, 2023 08:01:54
Сообщений: 12
Рейтинг сообщения: 0
Проблема не в Serial и не в ir.available().
Без вывода FastLED все работает.
Вы просто с лентой не работали.

Проблема в том , что библиотека FastLED
Отключает прерывания.
Потому и не работает циклы с адресной лентой.
Короткие закраски ленты без проблем,
циклические отключают прерывание.

Попробую библиотеку под себя заточить...


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y