1

我目前正在使用 Arduinos 和 WS2812b LED 条为我的公寓建造一些照明设备。我的计划是使用智能手机上的应用程序和 Raspberry Pi 来控制它们。手机向 Pi 发送数据(如颜色、模式等),然后 Pi 通过 433MHz 发射器将数据传输到我想放置在房间内的三个 Arduino Nano。

通过 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;
   }

}

(我几乎把这段代码撕成碎片,这就是剩下的。)

这些是发射器/接收器,我使用RC-SwitchAdafruit NeoPixel作为库,但其他 LED 库(FastLEDlight_ws2812)也有相同的错误。

到目前为止,我发现它可以使用少于 5 个 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() 中的最后四行,则问题甚至无法通过重新启动按钮来解决(尽管拔掉电源会有所帮助)。切换接收器也不起作用。

我使用的所有三个 Arduino 都有相同的问题。我使用 6A 电源(至少对于带有 75 个 LED 的灯条,另外两个有 30 个 LED,每个 LED 的电源为 2.4A)所以电源应该没有问题。

当我将我的 Arduino Uno 连接到接收器的第二个数据引脚时,它也无法接收到任何东西,将 Uno 与旁边的另一个接收器一起使用就可以了。使用 Uno 作为示波器并在数据引脚上显示电压,我在第一次传输后注意到很多噪声。看起来它随着颜色值的增加而增加。在我使用 setup() 中的 LED 设置重新启动 Arduino 后,噪音就消失了,如果我根本不对 LED 做任何事情,它就不会发生。接收器模块上的数据和 GND 之间有一个 5 MOhm 下拉电阻。我实际上不知道这种噪音是否与此有关,因为即使有噪音,接收有时也很好。

我尝试在设置 LED 之前禁用接收引脚并在之后启用它,但这没有帮助。手动启用中断也不会做任何事情。我更改了 rc-switch 中断处理,因此每次发生中断时它都会打印一些内容。即使在收到第一个数据后也能正常工作,但 Arduino 不知何故无法识别发送的内容。

我真的很想知道除了切换到 WiFi 模块或实际电线之外,是否有什么我可以尝试解决的问题。

4

0 回答 0