Ви не увійшли.
А вообще, откажитесь от библиотеки FstLed и напишите свое управление лентой. Там не так уж и сложно.
int command = ir.readCommand();
...
void handleIRCommand(unsigned long irValue) {
Заменить на:
uint8_t command = ir.readCommand();
...
void handleIRCommand(uint8_t irValue) {
И переход на стм или есп
144 можливо навіть і замало
А тут уже можно напороться на другую проблему - нехватку памяти
А від цього щось залежить?
Ну з меншою кількістю код запрацював, принаймні в симуляторі.
144 можливо навіть і замало
А від цього щось залежить?
Ну з меншою кількістю код запрацював, принаймні в симуляторі.
Є ідея реалізації:
Ініціалізуємо 16-бітний таймер з дільником частоти 128, це дискретність 8мкс, переповнення через півсекунди.
В PCINT від IR приймача тупо записуєм в рінгбуфер значення таймера.
Під час вигрузки бітів в стрічку, коли переривання заборонені, цю ж функцію виконує код між вигрузкою бітів.
Коли вільні, вичитуєм з рінгбуфера і декодуємо.
Нажаль, програмування цього всього буде коштувати в рази дорожче, ніж ще одна ардуіна)
мені потрібно виводити анімації циклічно
А количество светодиодов принципиально 144?
А від цього щось залежить?
мені потрібно виводити анімації циклічно
А количество светодиодов принципиально 144?
Те, що ви хочете, (майже) неможливо реалізувати на одному AVR мікроконтролері.
IR приймач може видавати фронти з мінімальним інтервалом 562.5мкс, їх близько 30 на одне натиснення.
Стрічці потрібно передати один цілий нерозривний потік бітів, "відстань" між якими 1.25мкс, кількість бітів пропорційна довжині стрічки.
При 16MHz це відповідно 9000 і 20 тактів процесора. Якщо дуже гарно постаратися, то в цих 20 тактах можна якось обробляти дані з IR приймача, але це потрібно реалізовувати на ASM.
У вашому випадку краще взяти два мікроконтролери, один буде обробляти сигнали з IR приймача і відправляти в UART один символ на одне натиснення. Інший буде працювати по вашому алгоритму, але читатиме символи з UART, апаратний UART дозволить прийняти один символ під час запису на стрічку.
Вот та же проблема хоть и используется друга библиотека
https://qna.habr.com/q/1258298
Дякую, но оскільки мені потрібно виводити анімації циклічно до наступного натискання, це не допоможе мені
Вот та же проблема хоть и используется друга библиотека
https://qna.habr.com/q/1258298
Васятко пише:можливо потрібно якось ефекти переписати?
Хто ж його знає. Ви їх не виклали. Код працює, принаймні в симуляторі з деякими правками, режими перемикаються
Ці два найбільше цікавлять.
void randomLEDs(){
int indices[NUM_LEDS];
int numSimultaneous = random(1, MAX_SIMULTANEOUS_LEDS + 1);
for (int i = 0; i < NUM_LEDS; i++) {
indices[i] = i;
}
// Shuffle the indices array
for (int i = NUM_LEDS - 1; i > 0; i--) {
int j = random(i + 1);
int temp = indices[i];
indices[i] = indices[j];
indices[j] = temp;
}
for (int i = 0; i < NUM_LEDS; i++) {
if (i < numSimultaneous) {
leds[indices[i]] = CRGB::White; // Turn on LEDs
} else {
leds[indices[i]] = CRGB::Black; // Turn off LEDs
}
}
delay(CYCLE_DELAY);
FastLED.show();
}
void policeFlashing() {
for (int i = 0; i < NUM_LEDS; i++) {
if (i < NUM_LEDS / 2) {
leds[i] = CRGB::Blue; // First half is blue
} else {
leds[i] = CRGB::Black; // Second half is dark
}
}
FastLED.show();
delay(100); // Adjust flashing speed
for (int i = 0; i < NUM_LEDS; i++) {
if (i < NUM_LEDS / 2) {
leds[i] = CRGB::Black; // First half becomes dark
} else {
leds[i] = CRGB::Red; // Second half becomes red
}
}
FastLED.show();
delay(100); // Adjust flashing speed
}
можливо потрібно якось ефекти переписати?
Хто ж його знає. Ви їх не виклали. Код працює, принаймні в симуляторі з деякими правками, режими перемикаються
Тоді передавайте у runCurrentEffect() значення mode
Воно знову чекає першого натискання на кнопку, включає відповідний ефект і більше не зчитує сигнали з прийомника, можливо потрібно якось ефекти переписати?