图25.3.3.2形参值的具体描述
初始化好AP3216C传感器之后,就可以对其采集到的数据进行获取,实现这个读取过程的函数为ap3216c_read_data,代码如下:
/**
* @brief 读取AP3216C的数据
* @NOTE 读取原始数据,包括ALS,PS和IR * 如果同时打开ALS,IR+PS的话两次数据读取的时间间隔要大于112.5ms
* @param ir : IR传感器值
* @param ps : PS传感器值
* @param als : ALS传感器值
* @retval 无
*/
void ap3216c_read_data(uint16_t *ir, uint16_t *ps, uint16_t *als)
{
uint8_t buf[6];
uint8_t i;
for (i = 0; i < 6; i++)
{
buf = ap3216c_read_one_byte(0X0A + i); /* 循环读取所有传感器数据 */
}
if (buf[0] & 0X80)
{
*ir = 0; /* IR_OF位为1,则数据无效 */
}
else
{
*ir = ((uint16_t)buf[1] << 2) | (buf[0] & 0X03);/* 读取IR传感器数据 */
}
*als = ((uint16_t)buf[3] << 8) | buf[2]; /* 读取ALS传感器数据 */
if (buf[4] & 0x40)
{
*ps = 0; /* IR_OF位为1,则数据无效 */
}
else
{
/* 读取PS传感器的数据 */
*ps = ((uint16_t)(buf[5] & 0X3F) << 4) | (buf[4] & 0X0F);
}
}
该函数用于读取AP3216C传感器的ALS+PS+IR数据。通过调用ap3216c_read_data函数读取相关寄存器的值,然后判断数据有效位,再整合得到IR值、ALS值、PS值。
25.3.4 CMakeLists.txt文件
打开本实验BSP下的CMakeLists.txt文件,其内容如下所示:
set(src_dirs
AP3216C
IIC
LCD
LED
SPI
XL9555)
set(include_dirs
AP3216C
IIC
LCD
LED
SPI
XL9555)
set(requires
driver)
idf_component_register(SRC_DIRS ${src_dirs}
INCLUDE_DIRS ${include_dirs} REQUIRES ${requires})
component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)
上述的红色AP3216C驱动需要由开发者自行添加,以确保AP3216C驱动能够顺利集成到构建系统中。这一步骤是必不可少的,它确保了AP3216C驱动的正确性和可用性,为后续的开发工作提供了坚实的基础。
25.3.5 实验应用代码
打开main/main.c文件,该文件定义了工程入口函数,名为app_main。该函数代码如下。
i2c_obj_t i2c0_master;
/**
* @brief 程序入口
* @param 无
* @retval 无
*/
void app_main(void)
{
uint16_t ir, als, ps;
esp_err_t ret;
ret = nvs_flash_init(); /* 初始化NVS */
if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
led_init(); /* 初始化LED */
i2c0_master = iic_init(I2C_NUM_0); /* 初始化IIC0 */
spi2_init(); /* 初始化SPI2 */
xl9555_init(i2c0_master); /* 初始化XL9555 */
lcd_init(); /* 初始化LCD */
ap3216c_init(i2c0_master); /* 初始化AP3216C */
lcd_show_string(30, 50, 200, 16, 16, "ESP32", RED);
lcd_show_string(30, 70, 200, 16, 16, "AP3216C TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 130, 200, 16, 16, "AP3216C Ready!", RED);
lcd_show_string(30, 150, 200, 16, 16, "IR :", RED);
lcd_show_string(30, 170, 200, 16, 16, "PS :", RED);
lcd_show_string(30, 190, 200, 16, 16, "ALS:", RED);
while(1)
{
ap3216c_read_data(&ir, &ps, &als); /* 读取数据 */
lcd_show_num(30 + 40, 150, ir, 5, 16, BLUE); /* 显示IR数据 */
lcd_show_num(30 + 40, 170, ps, 5, 16, BLUE); /* 显示PS数据 */
lcd_show_num(30 + 40, 190, als, 5, 16, BLUE); /* 显示ALS数据 */
LED_TOGGLE(); /* 提示系统正在运行 */
vTaskDelay(200);
}
}
在app_main函数中,完成一系列外设初始化后,调用ap3216c_init函数完成AP3216C初始化,LCD显示IR、PS、ALS信息。在while循环中,间隔200毫秒调用ap3216c_read_data函数获取AP3216C传感器的IR、PS和ALS数据,然后在LCD进行显示。
25.4 下载验证
程序下载成功后,LCD会显示光环境传感器的ALS+PS+IR数据,同时,LED闪烁,提示系统正在运行,并且串口打印实验现象。
大家可以用手遮挡/靠近AP3216C传感器,可以看到三个传感器的数据变化,说明我们的代码是正常的。