三色LED使用红色(R),绿色(G)、蓝(B)三种基色来合成丰富的色彩,每种基色可取值范围为0-255(0xFF)

本小节使用的三色LED

开发框架内置单色LED(GpioLed类)、三色LED(RgbLed类)和Ws2812灯带(Ws2812Led类)三个驱动类, 它们都继承自Led类。

ESP32 Arduino开发框架是一个可裁剪功能的框架,使用预编译选项来控制内置驱动的开启与禁用,可以避免多余代码占用编译时间和程序空间。
在项目的board_config.h文件中,可以通过以下三个选项来控制LED的启用(1)或禁用(0)
#define CONFIG_USE_LED_GPIO 1 // 启用GpioLed类
#define CONFIG_USE_LED_RGB 0 // 启用RgbLed类
#define CONFIG_USE_LED_WS2812 0 // 启用Ws2812Led类
Led类及其子类的实现请查看源码,本文不做解读。
下面用两个示例来说明其使用方法
从 https://gitee.com/billyzh/esp32-cpp-lesson 下载本教程的源码到本地硬盘文件夹,如d:\esp32-cpp-lesson
在VSCode中,选择【文件】->【打开文件夹...】选择上一步保存的文件夹打开
选择config.h文件,修改第10行为
#define APP_LESSON21_A 1
打开unit2-lesson21a/board_config文件,启用RgbLed类
#define CONFIG_USE_LED_RGB 1
和设置器件使用的引脚,
#define RGB_LED_R_PIN GPIO_NUM_32
#define RGB_LED_G_PIN GPIO_NUM_23
#define RGB_LED_B_PIN GPIO_NUM_33
三色LED的驱动
创建RgbLed类实例,代码如下(unit2-lesson21a/my_board.cpp):
MyBoard::MyBoard() : Board() {
Log::Info(TAG, "===== Create Board ...... =====");
Log::Info(TAG, "initial led.");
led_ = new RgbLed(RGB_LED_R_PIN, RGB_LED_G_PIN, RGB_LED_B_PIN, false);
led_->SetColor(255, 0, 0); //设置默认显示红色
Log::Info( TAG, "===== Board config completed. =====");
}
RgbLed类构造函数有4个参数,前3个参数为r,g,b对应引脚,第4个参数对应是否为共阳极(True)或共阴极(False),本课程实验用三色LED器件为共阴极。
LED闪烁
闪烁代码如下(unit2-lesson21a/my_application.cpp):
void MyApplication::OnLoop() {
Led *led = Board::GetInstance().GetLed();
led->TurnOn();
delay(1000);
led->TurnOff();
delay(1000);
}
闪烁实现代码与上一节(Unit1-lesson13)的LED闪烁代码是一样的,有两点需要理解:
1.在MyBoard类中,我们创建的是RgbLed类的实例,在此处用的是Led类的指针在调用,这是面向对象设计中多类的典型用法:用父类指针指向子类实例
2.这里用RgbLed类实例替换GpioLed类实例,程序还是可以正常工作,实现了业务代码和具体LED驱动代码的分离,这也是面向对象设计带来的好处。
编译项目并上传开发板检验
选择config.h文件,修改第10行为
#define APP_LESSON21_B 1
打开unit2-lesson21b/board_config文件,启用RgbLed类
#define CONFIG_USE_LED_RGB 1
和设置器件使用的引脚,
#define RGB_LED_R_PIN GPIO_NUM_32
#define RGB_LED_G_PIN GPIO_NUM_23
#define RGB_LED_B_PIN GPIO_NUM_33
渐变实现代码如下(unit2-lesson21b/my_application.cpp):
void MyApplication::OnLoop() {
Led *led = Board::GetInstance().GetLed();
led->SetColor(255, 0, 0);
led->TurnOn();
delay(2000);
// 过渡渐变
for (int i=0; i<=255; i+=50) { led->SetColor(255-i, i, 0);
led->TurnOn();
delay(200);
}
led->SetColor(0, 255, 0);
led->TurnOn();
delay(2000);
// 过渡渐变
for (int i=0; i<=255; i+=50) { led->SetColor(0, 255-i, i);
led->TurnOn();
delay(200);
}
led->SetColor(0, 0, 255);
led->TurnOn();
delay(2000);
// 过渡渐变
for (int i=0; i<=255; i+=50) { led->SetColor(i, 0, 255-i);
led->TurnOn();
delay(200);
}
}
代码比较简单,
第一轮显示红色2秒,然后逐渐减少红色值,同时增加绿色值;
第二轮显示绿色2秒,然后逐渐减少绿色值,同时增加蓝色值;
第三轮显示蓝色2秒,然后逐渐减少蓝色值,同时增加红色值;
重复以上步骤。
编译项目并上传开发板检验
勾股定理,是一个基本的几何定理,指直角三角形的两条直角边的平方和等于斜边的平方。中国古代称直角三角形为勾股形,并且直角边中较小者为勾,另一长直角边为股,斜边为弦,所以称这个定理为勾股定理,也有人称商高定理。
本小节主要介绍Ws2812灯珠的使用、对父类进行扩展实现自定义功能,和指针向下强制转换的使用。
ESP32 Arduino Framework是专门针对ESP32开发板的Arduino应用开发框架,为用户开发IOT应用、HMI应用提供一致的开发体验。
ESPConnect是一个基于现代浏览器的管理器,在你需要快速验证、调试、管理文件、检查状态的时候,它能帮你省下大量打开和切换重型工具的时间。
本文介绍两种使用TEA5767收音机模块实现FM收音机的方案,感兴趣的朋友可在此基础上实现更丰富的功能。
GPIOViewer 是一个强大的 Arduino 库,专门为 ESP32 芯片设计,可以实时监控 ESP32 芯片上的所有 GPIO 引脚状态。它可以帮助你快速直观地了解每个引脚的当前状态,例如高电平、低电平、输入、输出、中断等等。
在音频处理领域,I2S是一种广泛使用的通信协议,它专门用于芯片之间的音频数据传输。ESP32 作为一款高性能的微控制器,不仅支持 I2S 通信,还提供了强大的硬件接口和灵活的软件库,使其成为音频项目开发的理想选择。
小鹏物联网智能浇花系统是照顾植物的好帮手,支持自动控制和手动控制两种模式,可通过电脑端和手机端查看数据和控制浇水。
Arduino开发环境下适用于ESP32芯片系列开发板的应用开发框架。
本小节主要介绍C++ 类相关的基础知识,包括类的定义、继承、多态,范围作用域等。
本讲主要介绍VSCode Arduino开发环境的搭建,及与Arduino IDE开发环境的比较。