我正在尝试使用串行数据向Arduino Mega 2560发送信息,以便控制LED Pixel Strips和传统的圣诞灯串 . 我也在使用VIXEN照明软件 .
我可以在Arduino loop()函数中使用此代码控制来自Vixen的一条LED像素;
Serial.readBytes((char*)leds, NUM_LEDS * 3);//buffer to store things in, length (number of bytes to read)
FastLED.show();//refresh the pixel LED's
我还可以使用此代码控制传统灯的继电器(或多个继电器);
#define CHANNEL_01 7 //Pin #7 on the Arduino Mega board
void setup()
{
// Begin serial communication
Serial.begin(BAUD_RATE);
#define CHANNEL_COUNT 1
int channels[] = {CHANNEL_01}
int incomingByte[16];
// Define baud rate. This figure must match that of your profile configuration in Vixen!
#define BAUD_RATE 9600
// Set up each channel as an output
for(int i = 0; i < CHANNEL_COUNT; i++)
{
pinMode(channels[i], OUTPUT);
}
}
void loop()
{
if (Serial.available() >= CHANNEL_COUNT)
{
// Read data from Vixen, store in array
for (int i = 0; i < CHANNEL_COUNT; i++)
{
incomingByte[i] = Serial.read();
}
// Write data from array to a pin on Arduino
for (int i = 0; i < CHANNEL_COUNT; i++)
{
digitalWrite(channels[i], incomingByte[i]);
}
}
}
问题是我不能做这两件事 . 我可以将150个字节的LED数据分配给LED灯条并且工作正常,或者,我可以运行继电器并且它们工作正常 . 我无法弄清楚如何从串行数据中删除字节并将其发送到相应的引脚 . 例如,我想使用引脚7控制继电器,使用引脚6控制LED像素条 .
像素LED条消耗来自串行数据的前150个字节的数据 . 但是,如何获得控制继电器的下一个字节,以打开和关闭传统的圣诞灯串?控制灯串的字节将是串行数据中的第151个字节 . 有没有办法指定第151个字节? Serial.read()只是读取第一个字节(我认为) . 用户如何迭代串行数据的字节并仅选择他们想要的?
2 回答
当您执行
Serial.readBytes((char*)leds, NUM_LEDS * 3);
时,您会读取前150个字节,假设您有50个LED . 因此,串行缓冲区中待处理的下一个字节将是第151个字节,因此如果在Serial.readBytes((char*)leds, NUM_LEDS * 3);
之后调用Serial.read()
,则会获得该字节 . 请注意,如果需要,可以使用一个字节来控制8个继电器,每个继电器一位,使用bitRead()
一个例子 .那么值1将打开继电器0,值2将打开继电器1,值3将打开继电器0和继电器1等 .
为了解决这个问题,我买了一个Arduino Uno来运行与LED灯相分离的标准(非LED)灯,这些灯从Arduino MEGA 2560上运行 . 非LED灯在Vixen Lights软件的一个控制器上运行 . 控制器有4个输出(通道),每个非LED灯组一个 . 每个通道将控制固态继电器上的一条线 . Arduino Uno使用此代码运行继电器;
LED在Vixen Lights软件中运行第二个控制器 . 我有两个12伏,50像素的WS2811型LED灯条 . Arduino使用FastLED库,可以从FastLED.io免费下载 . 我发现在LED条带的串行流中有一个字节的垃圾数据,我不得不移过那个字节的数据,以便LED接收正确的数据字节来控制它们的颜色,位置我使用此代码运行我的LED关闭Arduino MEGA 2560;