我目前正在使用Arduinos和WS2812b LED条为我的公寓建造一些照明 . 我的计划是使用我的智能手机和Raspberry Pi中的应用来控制它们 . 手机将数据(如颜色,模式等)发送到Pi,Pi通过433MHz Launcher 将数据传输到我希望放置在房间内的三个Arduino Nanos .
通过Pi将数据从手机发送到Arduinos工作没有问题,数据正确接收并且LED亮起,但是一旦我这样做,就不能再接收数据了 . 当我收到并且不做任何其他事情时,没有问题 .
这是我的代码:
#include <RCSwitch.h>
#include <Adafruit_NeoPixel.h>
#define LEDPIN 9
#define NUMPIXELS 75
#define STARTBIT 4194305
#define STOPBIT 8388609
#define SETBIT 2097153
RCSwitch rc = RCSwitch();
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, LEDPIN, NEO_GRB + NEO_KHZ800);
uint32_t data[] = {0,0,0};
bool written[] = {false, false, false};
bool led_set = false;
uint32_t wait = 0;
uint16_t j = 0;
int index = 0;
bool recording = false;
int led = 0;
unsigned long time;
static unsigned long received = 0;
void setup() {
Serial.begin(9600);
time = millis();
pinMode(LEDPIN, INPUT);
rc.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
strip.begin();
for (int i = 0; i < 75; i++) {
strip.setPixelColor(i, strip.Color(255,255,255));
}
strip.show();
}
void loop() {
if (millis()-time >= 1000) {
Serial.println(*((unsigned int*)rc.nReceivedValue));
Serial.println(rc.nReceivedValue);
Serial.println(millis());
time = millis();
}
if (rc.available()) {
received = rc.getReceivedValue();
rc.resetAvailable();
Serial.print("received: ");
Serial.print(received);
Serial.println();
}
if ((received == STOPBIT) && recording) {
Serial.println("stopped");
recording = false;
}
else if ((received == STARTBIT) && not recording) {
recording = true;
led_set = false;
Serial.println("started");
}
if (recording) {
if(received == SETBIT && written[index] && index < 3) {
index++;
Serial.println("setbit");
}
else if(received != STARTBIT && received != STOPBIT && received != SETBIT && received != 0 && not written[index] && index < 3) {
data[index] = received & 0xFFFFFFFF;
written[index] = true;
//Serial.println(received);
Serial.println(data[index]);
Serial.println("written");
}
}
else if (data[0] != 0 && data[1] != 0 && data[2] != 0 && not recording && not led_set) {
Serial.println("setting LED");
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, data[2]);
}
strip.show();
rc.resetAvailable();
}
if (not recording) {
for (int k = 0; k < 3; k++) {
written[k] = false;
}
index = 0;
}
}
(我几乎将这些代码撕成碎片,这就是剩下的 . )
These是发送器/接收器,我使用RC-Switch和Adafruit NeoPixel作为库,但其他LED库(FastLED,light_ws2812)也有相同的错误 .
到目前为止我发现它可以使用少于5个LED,如果我将颜色设置为低值,有时可以使用更多LED . 然后,如果我得到另一次接收,或多或少的机会 . 如果我没有在这里设置LED
else if (data[0] != 0 && data[1] != 0 && data[2] != 0 && not recording && not led_set) {
Serial.println("setting LED");
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, data[2]);
}
strip.show();
我可以接收更多数据,如果我硬编码颜色的值,它只适用于亮白色(因此每种颜色为255)或低于14的颜色值 .
如果我在setup()中注释掉最后四行,则重启按钮甚至无法解决问题(尽管拔掉了帮助) . 切换接收器也不起作用 .
我使用的所有三个Arduinos都有同样的问题 . 我使用的是6A电源(至少对于带有75个LED的条带,另外两个有30个LED,每个LED都有2.4A供电)所以功率应该没有问题 .
当我将我的Arduino Uno连接到接收器的第二个数据引脚时,它也无法接收任何东西,使用Uno和旁边的另一个接收器就可以了 . 使用Uno作为示波器并在数据引脚上显示电压,我在首次发送后发现了很多噪声 . 看起来它随着颜色值而增加 . 在我使用setup()中的LED设置重新启动Arduino后噪音消失了,如果我根本不对LED做任何事情,它就不会发生 . 接收器模块上的数据和GND之间有一个5 MOhm下拉电阻 . 我实际上并不知道这个噪音是否与此有关,因为即使有噪音,接收有时也很好 .
我尝试在设置LED之前禁用接收引脚并在之后启用它但这没有帮助 . 手动启用中断也不会执行任何操作 . 我更改了rc-switch中断处理,因此每次发生中断时都会打印一些内容 . 即使在收到第一个数据后,这仍然有效,Arduino不知何故只是不知道发送了什么 .
我真的想知道除了切换到WiFi模块或实际线路之外,我还能尝试解决这个问题 .