- 安装开发工具Arduino IDE 2.3.2
我使用的桌面软件Arduino IDE2.3.2,在Software | Arduino这里下载。
使用Arduino需要先设置稳定的代理,后续下载esp32和各种库都需要用到代理。
设置稳定的代理以后,就可以很愉快的安装ESP32库
配置首选项
首选项的其它开发板管理器地址可以使用:
https://espressif.github.io/arduino-esp32/package_esp32_dev_index.json
这个地址亲测有用。
也可以使用另外一个地址https://djzrs.github.io/picx-images-hosting/package_esp32_dev_index.json,感谢乔帮主(HonestQiao|乔楚)推荐。
- 安装ESP32
安装esp32 3.0.0-rc1版本的最新库
- 准备物料
开发板: Beetle ESP32 C6,1个
WS2815 LED灯带,1根或2根
12V开关电源1个
杜邦线4根
Type C开发线1根
Beetle ESP32 C6开发板
Beetle ESP32-C6是一款基于ESP32-C6芯片设计的迷你体积的Arduino低功耗物联网开发板,该开发板仅有硬币大小(25*20.5mm)。ESP32-C6搭载160MHz的高性能RISC-V 32位处理器,支持Wi-Fi 6、Bluetooth 5、Zigbee 3.0、Thread 1.3通讯协议,可接入多种通讯协议的物联网网络。Beetle ESP32-C6在仅硬币大小的体积上引出了多达13个IO口。
采购网址https://www.dfrobot.com.cn/goods-3834.html
技术规格书https://wiki.dfrobot.com.cn/SKU_DFR1117_Beetle_ESP32_C6
引脚示意图是需要经常翻看的,主要是了解GND公共地引脚和GPIO即ESP32默认GPIO号。像毫米波雷达人体存在传感器使用串口通讯,一定是要知道RX和TX对应的GPIO。像AHT20温湿度传感器一定要知道SDA和SCL对应的GPIO。不用太费劲去记住上图,熟能生巧,GPIO用的多了,自然然就记住,经常玩经常用,插杜邦线到Beetle ESP32 C6的引脚上都会很熟练,看到开发板就能知道GPIO在哪。
WS2815 LED灯带
我个人采购的灯带供货商主要是莱美光电,WS2815 12V 断点续传单点单控30/60/72/96/120/144灯全系列灯带,我主要采购了一米144灯珠和60灯珠的灯带。144灯珠的灯带单端供电3米以上会有明显压降,60灯珠的灯带单端供电5米没有明显压降。10米可以寄给我,我可以帮忙测试压降情况,(*∩_∩*)。
WS2812b LED灯条是一款5V可单独寻址的灯条,IC内嵌在5050 LED中,使其具有更好的照明性能。
WS2815 LED灯条是将控制电路和RGB芯片集成在一个由5050个元件封装而成的智能控制LED光源。 其内部包括一个智能数字端口数据锁存器和信号整形放大驱动电路。 双信号线版本,信号断点续传。 任何像素的故障都不会影响信号传输和总发光效果。
WS2812B和WS2815对于Arduino开发来说,其实两者代码区别不大,主要是RGB顺序有点区别,其它代码基本上改动不大。WS2815是12V供电,WS2812B是5V供电,用ESP32C3可能还会用开发板自带的5V给灯板灯带供电,用ESP32C6都是用外部供电的方式了。
在接线上就需要注意下,别烧了开发板,把GPIO的杜邦线接到12V,有可能就把开发板烧了。在通电时一定反复检查下。
WS2812灯带、WS2813灯带、WS2815灯带均内置IC,都可以单点单控,每颗灯珠都可以单独控制的。WS2812B和WS2813是5V供电,一米60颗灯珠,5米就会有很明显压降,需要双端供电。
WS2813灯带和WS2815灯带都是双信号电路,具有断续功能。 这意味着如果一个 IC 有缺陷,它不会影响 LED 灯条的其余部分。
我公司使用最多的灯带是WS2812B和WS2815灯带,本文主要使用WS2815灯带演示(注意下,我司采购的WS2815灯带是3针连接器,非4针连接器)。WS2815一是12V供电,一个开关电源单端供电可以管一米60灯珠的灯带可以5米无明显压降。WS2815本身有备份信号,某个灯珠坏了,不影响后面的灯珠灯效。
开关电源
WS2815 LED灯带是12v供电,所以我使用了明纬的12v开关电源。
https://www.meanwell.com.cn/distributors.aspx?s=&c1=4&c2=62
通过这个网址可以找到自己所在城市的经销商,找经销商购买即可。
ESP32C6板载没有5v和12v电压,不会出现PCB板给灯带供电这种坑,以前用ESP32C3,有5V的输出,就给WS2812B灯带供电,就有明显的压降。除非是功率小的灯板,灯珠数量多的灯带最好用外部供电,用专业的开关电源对灯带进行供电。
- 接线
我们约定:红色杜邦线接电源正极(VCC),白色杜邦线接低(GND),绿色杜邦线接信号GPIO。
准备4根杜邦线如下。
线缆颜色公母头数量杜邦线白色公对公1根杜邦线绿色公对公1根杜邦线红色公对母1根杜邦线白色公对母1根
Beetle ESP32 C6的公共地引脚GND有2个,接任何一个均可。我图方便,一般接3V3上面的GND,这个位置也比较好记。对应板子对角的GPIO是6,我用来做灯效信号输出。
白色杜邦线是信号-,接开发板的GNDgnd。绿色杜邦线是信号+,接开发板的GPIO6引脚
1根公对公的白色杜邦线:白色杜邦线的1个公头接Beetle ESP32 C6的公共地引脚GND,另一个公头接WS2815公头的白色线。
注意:绿色线千万不要错接灯带的红色线,会烧开发板。
1跟公对公的绿色杜邦线:绿色杜邦线的1个公头接Beetle ESP32 C6的GPIO6,另一个公头接WS2815公头的绿色线。
如果接其它GPIO,记得后续的源代码修改一下PIN的定义
#define PIN 6
1跟公对母的红色杜邦线,一头接灯带母头的红色线对应的针,一头接开源电源的正极。
1根公对母的白色杜邦线,一头接灯带母头的白色线对应的针,一头接开关电源的负极。
明纬12V开关电源220V转12V开关电源稳压输出集中供电监控电源,最好购买正版的明纬电源,一个可靠的电源对灯效起很好的保障。
- 开发准备
安装 Adafruit_NeoPixel
安装FastLED
这两个库是驱动WS2815灯带的典型库,也是业内用的比较多的库。Adafruit_NeoPixel自带的Simple示例是可以在C6上运行通过的代码示例,下文重点讲解示例代码simple。
// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// Released under the GPLv3 license to match the rest of the
// Adafruit NeoPixel library
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN 6 // On Trinket or Gemma, suggest changing this to 1
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 16 // Popular NeoPixel ring size
// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 500 // Time (in milliseconds) to pause between pixels
void setup() {
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
// Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
// END of Trinket-specific code.
pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}
void loop() {
pixels.clear(); // Set all pixel colors to 'off'
// The first NeoPixel in a strand is #0, second is 1, all the way up
// to the count of pixels minus one.
for(int i=0; i<NUMPIXELS; i++) { // For each pixel...
// pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255
// Here we're using a moderately bright green color:
pixels.setPixelColor(i, pixels.Color(0, 150, 0));
pixels.show(); // Send the updated pixel colors to the hardware.
delay(DELAYVAL); // Pause before next pass through loop
}
}
#define PIN 6
使用GPIO6这个引脚来驱动WS2815灯带
#define NUMPIXELS 16
驱动的灯珠数量,我的1条灯带8颗灯珠,这里的16可以改成8。
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
定义Adafruit_NeoPixel对象,入参1是灯珠数量,入参2是使用哪个GPIO来发出灯效信号,入参3是LED灯类型。12V的WS2815一般使用NEO_GRB,指灯带按RGB顺序。5V灯带WS2812B一般用NEO_GRB,使用GRB顺序。5V RGBW灯带一般用NEO_GRBW,使用GRBW。如果发现颜色不是预期的颜色,可以询问询问一下供货商RGB顺序,顺便也检查一下供电和开发板是否共地。
#define DELAYVAL 500
每颗灯珠亮了以后,等待500毫秒以后,下一颗灯珠亮
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
因为我们是用的是C6开发板,这段代码可以删除掉,不影响灯效
setup() 用于初始化,loop()运行一直重复运行的代码。
pixels.begin();
这句必须执行,表示实例化完成后需要通过Adafruit_NeoPixel类中的begin()方法完成类的初始化操作。
pixels.clear();
用0填充整个像素条,即关闭所有WS2812灯珠。
for(int i=0; i<NUMPIXELS; i++) {
表示循环所有灯珠,这里的NUMPIXELS可以通过pixels.numPixels()动态获取。
uint16_t numPixels(void) const { return numLEDs; }
返回灯带的灯珠数量
pixels.setPixelColor(i, pixels.Color(0, 150, 0));
给第i个灯珠设置RGB颜色0, 150, 0,这个颜色是一种红色
RGB的值可以设置0,0,0 到 255,255,255。
pixels.Color(0, 150, 0)这个可以看一下函数定义
void Adafruit_NeoPixel::Color(uint8_t r, uint8_t g, uint8_t b)
设置RGB的值,从0,0,0到 255,255,255。返回的是32位压缩RGB值,然后可以将其分配给a变量,供以后使用或传递给setPixelColor()函数。
void Adafruit_NeoPixel::setPixelColor(uint16_t n, uint32_t c)
使用32位“打包”RGB或RGBW值设置像素的颜色。n为像素索引,从0开始。c为32位的颜色值。
pixels.show();
显示灯效,show可以看一下它的定义:
void Adafruit_NeoPixel::show(void)
将RAM中的像素数据传输到新像素。注:在大多数体系结构中,中断是暂时禁用的以便实现正确的新像素信号定时。这意味着Arduino millis()和micros()函数,它们需要中断时,会丢失一小段时间间隔函数被调用(大约每30微秒一RGB像素,每40微秒一RGBW像素)。
delay(DELAYVAL);
下一个灯珠要灯DELAYVAL毫秒以后才能进行上面的灯效逻辑
光看代码不够直观,可以看看下面视频看看具体的灯效。
因为我是一根8颗灯珠的WS2815灯带,所以我修改了NUMPIXELS 的值为8。
#define NUMPIXELS 8
https://github.com/adafruit/Adafruit_NeoPixel/blob/master/Adafruit_NeoPixel.cpp
https://github.com/adafruit/Adafruit_NeoPixel/blob/master/Adafruit_NeoPixel.h
这个连接可以查看Adafruit_NeoPixel各个方法的定义。
评论