STM32 物联网智能家居 (五) 设备子系统之点亮LED灯
一、设计思路
对于LED灯控制,我们可以设想一下LED灯的功能。首先就是灯的开关、亮度、颜色,主要大概就是这三个功能。我们如何将这三个功能抽象出来呢,无论底层的LED设备是什么,都可以用这个结构体抽象出来。
如下面所示,控制LED设备肯定需要初始化函数,控制LED设备亮灭,目前设置LED灯的颜色需要三色灯,目前不支持,控制LED灯的亮灭,可以通过给出不同占空比的PWM波进行控制亮度,目前该项目没有考虑。
typedef struct LEDDevice {
int which;
/* 初始化LED设备, 成功则返回0 */
int (*Init)(struct LEDDevice *ptLEDDevice);
/* 控制LED设备, iStatus取值: 1-亮,0-灭 */
int (*Control)(struct LEDDevice *ptLEDDevice, int iStatus);
/* 未实现 */
void (*SetColor)(struct LEDDevice *ptLEDDevice, int iColor);
/* 未实现 */
void (*SetBrightness)(struct LEDDevice *ptLEDDevice, int iBrightness);
}LEDDevice, *PLEDDevice;
下面我们把LED设备分为四层,如下图:
二、设备层
在设备层,里面有LED设备的结构体,里面列举了支持的所有的LED设备,支持白、蓝和绿灯,支持LED初始化和LED控制,如下图所示:
static LEDDevice g_tLEDDevices[] = {
{
LED_WHITE, 0, LEDDeviceInit, LEDDeviceControl},
{
LED_BLUE, 0, LEDDeviceInit, LEDDeviceControl},
{
LED_GREEN, 0, LEDDeviceInit, LEDDeviceControl},
};
下面是设备层的函数:LEDDeviceInit(),LEDDeviceControl(),GetLEDDevice()。
/**********************************************************************
* 函数名称: KAL_LEDDeviceInit
* 功能描述: 设备层的LED初始化函数
* 输入参数: ptLEDDevice-哪个LED设备
* 输出参数: 无
* 返 回 值: 0-成功
***********************************************************************/
static int LEDDeviceInit(struct LEDDevice *ptLEDDevice)
{
return KAL_LEDDeviceInit(ptLEDDevice)