esp32控制ws2812b多灯控制

/*

参考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();
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值