| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Interrupt для чайника https://radiokot.ru/forum/viewtopic.php?f=66&t=188711 |
Страница 1 из 1 |
| Автор: | gps38region [ Пн июн 12, 2023 10:11:54 ] |
| Заголовок сообщения: | Interrupt для чайника |
Помогите чайнику... Вот код лампы на 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(); } |
|
| Автор: | pavel2000 [ Вт июн 13, 2023 05:12:35 ] |
| Заголовок сообщения: | Re: Interrupt для чайника |
По смыслу вашей программы - похоже не требуется запихивать проверку ir.available() в прерывание. Переместите проверку и чтение в loop, как это указано в примере использования библиотеки. Возможно, проблема заключается в использовании Serial.println(comm) внутри прерывания. |
|
| Автор: | gps38region [ Вт июн 13, 2023 09:28:49 ] |
| Заголовок сообщения: | Re: Interrupt для чайника |
Проблема не в Serial и не в ir.available(). Без вывода FastLED все работает. Вы просто с лентой не работали. Проблема в том , что библиотека FastLED Отключает прерывания. Потому и не работает циклы с адресной лентой. Короткие закраски ленты без проблем, циклические отключают прерывание. Попробую библиотеку под себя заточить... |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


