ATtiny85 + Adafruit_NeoPixel 不适用于数组

Posted

技术标签:

【中文标题】ATtiny85 + Adafruit_NeoPixel 不适用于数组【英文标题】:ATTiny85 + Adafruit_NeoPixel not working with array 【发布时间】:2022-01-12 02:46:20 【问题描述】:

我想使用 Adafruit_NeoPixel 库创建一个 LED 动画。 不幸的是,我正在为一个可能倾倒的事情而苦苦挣扎。由于某种原因,当使用某个数组访问 if (led_states[pixel] > 0) 时,条带不再起作用。这意味着即使 strip.clean() + strip.show() 在安装程序中也不再起作用。愿你能告诉我我做错了什么,因为我真的不明白。 PS:如果有帮助,我正在使用带有 arduino 框架的 ATtiny85。

#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>

#define LED_AMOUNT 30
#define LED_DATA_PIN PB1

SoftwareSerial SWSERIAL(0, PB3);  // RX, TX
Adafruit_NeoPixel strip(LED_AMOUNT, LED_DATA_PIN, NEO_GRB + NEO_KHZ800);

int step = 2;
int max = 255 - step;
int led_states[LED_AMOUNT] =  0 ;
int led_values[LED_AMOUNT] =  0 ;
unsigned long last_frame = 0;
unsigned long last_change = 0;

void led_test_setup() 
    delay(5000);
    SWSERIAL.begin(9600);
    SWSERIAL.println("Setup");
    randomSeed(analogRead(0));

    strip.begin();
    strip.clear();
    strip.show();


void led_test_loop() 
    unsigned long now = millis();
    if (last_change + 200 < now) 
        int pixel = random(0, LED_AMOUNT);
        led_states[pixel] = 1;
        led_values[pixel] = 0;
        last_change = now;
    
    if (last_frame + 10 < now) 
        for (int pixel = 0; pixel < LED_AMOUNT; pixel++) 
            if (led_states[pixel] > 0)  // <---- strip works when commenting this block
                SWSERIAL.printf("V: %i\n", led_values[pixel]);
            
            strip.setPixelColor(pixel, led_values[pixel], led_values[pixel], led_values[pixel]);
        
        last_frame = now;
        strip.show();
    

【问题讨论】:

尝试改变 if (led_states[pixel] &gt; 0) // ..to 只是... SWSERIAL.printf("V: %i\n", led_values[pixel]); ...看看是否可行。 (我的猜测是不会) 注释掉 if (led_state[pixel] &gt; 0) 但保留 printf 有效。条带仍然可以控制。一旦我再次取消注释 if ,就无法再控制条带了。不知道这有什么关系 o.O 为什么你会期望那时不起作用?奇怪的是也没有异常,代码仍然按预期运行并记录,但只是条带函数不起作用。 led_values 中的值始终为 0,因此 LED 始终处于关闭状态。我不确定您是否认为 LED 灯条在工作。 我知道它是否正常工作,因为条带在闪烁过程中被点亮。因此,当它再次关闭时,它可以工作。如果没有,它没有 【参考方案1】:

我可能会发现问题。似乎 SoftwareSerial 和 Neopixel 库都在使用这两种中断,这会破坏 Neo 像素通信。

在这里找到:https://forum.arduino.cc/t/arduino-nano-softwareserial-adafruit_neopixel-problem/540057/2

【讨论】:

以上是关于ATtiny85 + Adafruit_NeoPixel 不适用于数组的主要内容,如果未能解决你的问题,请参考以下文章

ATTINY 85睡眠模式

推荐 Attiny85 编译器/IDE [关闭]

[Ardunio] ATtiny85的时钟问题

如何使用Arduino UNO开发板编程ATtiny85

ATtiny85 - 带 Timer1 的软件 UART

如何在Arduino环境使用ATtiny13/44/45/84/85