/*
参考Docs
main.cpp
设置延时函数
设置发送0码和1码,在其中写高低电平延时来判断发送0码和1码
写数据,从高位开始写,然后左移
写光色,RGB三个数据
在setup里设置begin,pin脚
在loop里输出光色
现象:
ws2812b前10颗灯常亮蓝光
*/
#include <Arduino.h>
//信号IO引脚
#define PIN_LED 16
//颜色
typedef struct
{
uint8_t R;
uint8_t G;
uint8_t B;
}t_color;
/*
t_color g_color;
g_color.R
g_color.G
g_color.B
*/
void delay_337_ns()
{
for (int i = 0; i < 1; i++)
{
NOP();
}
}
void delay_600_ns()
{
uint32_t count = 10;
for (int i = 0; i < count; i++)
{
NOP();
}
}
void delay_280_us()
{
uint32_t count = 280*40;
for (uint32_t i = 0; i < count; i++)
{
NOP();
}
}
/*
发送0码
*/
void set_0_num()
{
digitalWrite(PIN_LED,HIGH);
delay_337_ns();
digitalWrite(PIN_LED,LOW);
delay_600_ns();
}
/*
发送1码
*/
void set_1_num()
{
digitalWrite(PIN_LED,HIGH);
delay_600_ns();
digitalWrite(PIN_LED,LOW);
delay_600_ns();
}
/*
发送reset
*/
void set_reset()
{
digitalWrite(PIN_LED,LOW);
delay_280_us();
}
/*
根据每bit数值设置发送0码或者1码
dat
*/
void ws2812b_writebyte(uint8_t dat)
{
for (uint i = 0; i < 8; i++)
{
//先发送高位
if(dat&0x80)//该位为1
set_1_num();
else //该位为0
set_0_num();
dat<<=1;
}
}
/*
按手册写入RGB 24it数据
pColor
*/
void ws2812b_writecolor(t_color *pColor)
{
ws2812b_writebyte(pColor->G);
ws2812b_writebyte(pColor->R);
ws2812b_writebyte(pColor->B);
}
/*或者
void ws2812b_writecolor(t_color pColor)
{
ws2812b_writebyte(pColor.G);
ws2812b_writebyte(pColor.R);
ws2812b_writebyte(pColor.B);
}
*/
/*
多LED控制
//BL_Color 0x000000 //关---清空颜色
//W_Color 0xFFFFFF //白光
//R_Color 0xFF0000 //红光
//G_Color 0x00FF00 //绿光
//B_Color 0x0000FF //蓝光
*/
void ws2812b_more_led_test()
{
t_color temp;
temp.R = 0x00;
temp.G = 0x00;
temp.B = 0xFF;
const int PIXEL_NUM = 10;
//目前理解亮PIXEL_NUM次后,复位,循环
//现象是前10颗灯一直亮蓝
while (true)
{
for (uint8_t i = 0; i < PIXEL_NUM; i++)
{
ws2812b_writecolor(&temp);
}
set_reset();
}
}
/*
单LED控制
*/
void ws2812b_one_led_test()
{
t_color temp;
temp.R = 0x00;
temp.G = 0x00;
temp.B = 0xff;
while (true)
{
ws2812b_writecolor(&temp);
set_reset();
}
}
void setup()
{
Serial.begin(9600);
Serial.printf("setup\n");
pinMode(PIN_LED,OUTPUT);
}
void loop()
{
ws2812b_more_led_test();
}