【实验】ESP32S3驱动AP3216C多功能传感器模块

设计简介

本设计是选用的是ESP32S3的主控芯片,学习如何驱动AP3216C多功能传感器模块

本实验中,开发板选用的是图灵哥TRGESP32S3拓展板,多功能传感器模块用的是板子上搭载的AP3216C

AP3216C简介

AP3216C是一款多功能传感器模块,它集成了环境光传感器(ALS)、接近传感器(PS)和红外传感器(IR)三种功能于一体,为智能设备提供全面的感测解决方案。以下是AP3216C的更详细介绍

技术规格

  1. 环境光传感器(ALS)AP3216C的环境光传感器能够检测周围环境的光线强度,帮助设备自动调节屏幕亮度,以适应不同的光照条件,从而节省电能并提升用户体验
  2. 接近传感器(PS)接近传感器可以检测物体(如用户脸部)的接近情况,常用于智能手机中,当用户接听电话时自动关闭屏幕,防止误触操作
  3. 红外传感器(IR)红外传感器可用于手势识别,用户可以通过简单的手势控制设备,如上下滑动手指调节音量或左右滑动切换音乐

特点

  1. 高精度:AP3216C采用高精度的感测元件,确保了光线强度和距离测量的准确性
  2. 低功耗:模块在设计上注重能效,即使在连续工作状态下也能保持低功耗,有助于延长设备电池寿命
  3. 小尺寸:AP3216C具有紧凑的设计,便于集成到各种尺寸的设备中,不占用过多空间
  4. 快速响应:传感器响应速度快,能够即时调整屏幕亮度和执行手势识别等操作
  5. 快速响应:传感器响应速度快,能够即时调整屏幕亮度和执行手势识别等操作

应用场景

  1. 智能手机和平板电脑:用于自动调节屏幕亮度和实现接近感应功能
  2. 笔记本电脑:自动调节屏幕亮度和键盘背光
  3. 智能家居设备:如智能灯泡,根据环境光线自动调节亮度,或通过手势控制开关
  4. 可穿戴设备:如智能手表,用于环境光检测和手势控制

优势

  1. 成本效益:集成多种传感器于一体,减少了物料成本和设计复杂性
  2. 稳定性:经过市场验证,AP3216C具有出色的稳定性和可靠性
  3. 易于集成:提供了详细的集成指南和技术支持,便于制造商快速集成到产品中

因此可见,AP3216C是一款多功能、高性能的传感器模块,它的出现为智能设备的设计提供了更多的灵活性和便利性对于我们在人工智能和智能家居的学习与开发中提供了非常大的帮助。

程序设计

AP3216C传感器模块的程序设计思路通常包括以下几个步骤

  1. 初始化硬件接口首先,需要初始化与AP3216C通信的硬件接口,通常是I2C接口。这包括设置正确的I2C地址、时钟频率和配置必要的GPIO引脚
  2. 配置AP3216C寄存器通过I2C接口向AP3216C的寄存器写入配置数据,以设置传感器的工作模式。这可能包括环境光传感器的灵敏度、接近传感器的检测阈值、红外传感器的增益等
  3. 读取传感器数据定期或根据需要通过I2C接口读取AP3216C的传感器数据寄存器,获取环境光强度、接近状态和红外数据
  4. 数据处理对读取到的原始数据进行处理,例如,将环境光传感器的原始值转换为Lux值,或者将接近传感器的数据转换为距离信息
  5. 实现功能逻辑根据处理后的数据实现具体的功能逻辑,例如自动调节屏幕亮度、触发接近事件或者识别手势

程序现象

 LCD会显示光环境传感器的ALS+PS+IR数据

部分程序源码

 iic_ap3216c.ino

/**
 ******************************************************************************
 * @file      iic_ap3216c.ino
 * @author    Turinger Software
 * @version   V1.0
 * @date      2024-09-20
 * @brief     光环境传感器实验
 ******************************************************************************
 * 
 * 实验平台:图灵哥 TRGESP32S3探索板
 * 实验目的:学习光环境传感器AP3216C的使用,实现光照强度(ALS)/接近距离(PS)/红外光强(IR)等的测量
 *
 * 硬件资源及引脚分配:
 * 1,   UART0 --> ESP32S3 IO
 *       TXD0 --> IO43
 *       RXD0 --> IO44
 * 2,  XL9555 --> ESP32S3 IO
 *        SCL --> IO42
 *        SDA --> IO41
 *        INT --> IO0(跳线帽连接) 
 * 3, SPI_LCD --> ESP32S3 IO / XL9555
 *         CS --> IO21
 *        SCK --> IO12
 *        SDA --> IO11
 *         DC --> IO40(跳线帽连接)
 *        PWR --> XL9555_P13
 *        RST --> XL9555_P12
 * 4, AP3216C --> ESP32S3 IO
 *        SCL --> 40
 *        SDA --> 41
 *        INT --> XL9555_P00
 *
 * 实验现象:
 * 1, LCD会显示光环境传感器的ALS+PS+IR数据
 * 
 * 注意事项:
 * 无
 * 
 ******************************************************************************
 */

#include "uart.h"
#include "xl9555.h"
#include "spilcd.h"
#include "ap3216c.h"


uint16_t ir, als, ps;       /* 光照强度(ALS)/接近距离(PS)/红外光强(IR) */

/**
 * @brief    当程序开始执行时,将调用setup()函数,通常用来初始化变量、函数等
 * @param    无
 * @retval   无
 */
void setup() 
{
    uart_init(0, 115200);   /* 串口0初始化 */
    xl9555_init();          /* IO扩展芯片初始化 */
    lcd_init();             /* LCD初始化 */

    lcd_show_string(30, 50, 200, 16, LCD_FONT_16, "ESP32-S3", RED);
    lcd_show_string(30, 70, 200, 16, LCD_FONT_16, "AP3216C TEST", RED);
    lcd_show_string(30, 90, 200, 16, LCD_FONT_16, "TRG@TURINGTCH", RED);

    while (ap3216c_init())  /* 检测不到AP3216C */
    {
        lcd_show_string(30, 130, 200, 16, LCD_FONT_16, "AP3216C Check Failed!", RED);
        delay(500);
    }
    lcd_show_string(30, 130, 200, 16, LCD_FONT_16, "AP3216C Ready!", RED);
        
    lcd_show_string(30, 160, 200, 16, LCD_FONT_16, " IR:", RED);
    lcd_show_string(30, 180, 200, 16, LCD_FONT_16, " PS:", RED);
    lcd_show_string(30, 200, 200, 16, LCD_FONT_16, "ALS:", RED);
}

/**
 * @brief    循环函数,通常放程序的主体或者需要不断刷新的语句
 * @param    无
 * @retval   无
 */
void loop() 
{
    ap3216c_read_data(&ir, &ps, &als);                      /* 读取数据  */

    lcd_show_num(30 + 32, 160, ir, 5, LCD_FONT_16, BLUE);   /* 显示IR数据 */
    lcd_show_num(30 + 32, 180, ps, 5, LCD_FONT_16, BLUE);   /* 显示PS数据 */
    lcd_show_num(30 + 32, 200, als, 5, LCD_FONT_16, BLUE);  /* 显示ALS数据  */

    delay(500); 
}

ap3216c.cpp

/**
****************************************************************************************************
 * @file      ap3216c.cpp
 * @author    Turinger Software
 * @version   V1.0
 * @date      2024-09-20
 * @brief     AP3216C驱动代码
 * 实验平台    图灵哥 TRGESP32S3探索板
 *
 ****************************************************************************************************
 */

#include "ap3216c.h"
#include <Wire.h>

/**
 * @brief     初始化光环境传感器
 * @param       无
 * @retval      0:初始化成功;1:初始化失败
 */
uint8_t ap3216c_init(void)
{
    uint8_t temp;

    Wire.begin(IIC_SDA, IIC_SCL, 400000);   /* 初始化IIC连接 */

    ap3216c_write_one_byte(0x00, 0X04);     /* 复位AP3216C */
    delay(50);                              /* AP3216C复位至少10ms */

    ap3216c_write_one_byte(0x00, 0X03);     /* 开启ALS、PS+IR */

    temp = ap3216c_read_one_byte(0X00);     /* 读取刚刚写进去的0X03 */
    if (temp == 0X03)
    {
        return 0;           /* AP3216C正常 */
    }
    else 
    {
        return 1;           /* AP3216C失败 */
    }
}

/**
 * @brief     向ap3216c指定寄存器写入一个数据
 * @param       reg: 要写入的寄存器
 * @param       data: 要写入的数据
 * @retval      无
 */
void ap3216c_write_one_byte(uint8_t reg, uint8_t data)
{
    Wire.beginTransmission(AP3216C_ADDR);     /* 发送从机的7位器件地址到发送队列 */
    Wire.write(reg);                          /* 发送要写入从机寄存器的地址到发送队列 */
    Wire.write(data);                         /* 发送要写入从机寄存器的数据到发送队列 */
    Wire.endTransmission();                   /* IIC 发送 发送队列的数据(不带参数,表示发送stop信号,结束传输) */         
}

/**
 * @brief     在ap3216c指定寄存器读出一个数据
 * @param       reg: 要读取的寄存器
 * @retval      寄存器的值 / 0xFF:未接收到数据
 */
uint8_t ap3216c_read_one_byte(uint8_t reg)
{
    uint8_t rd_num = 0;
    uint8_t rd_data = 0;

    Wire.beginTransmission(AP3216C_ADDR);       /* 发送从机的7位器件地址到发送队列 */
    Wire.write(reg);                            /* 发送要读取从机的寄存器地址到发送队列 */
    Wire.endTransmission(0);                    /* IIC 发送 发送队列的数据(传参为0,表示重新发送一个start信号,保持IIC总线有效连接) */

    rd_num = Wire.requestFrom(AP3216C_ADDR, 1); /* 主机向从机发送数据请求,并获取到数据 */

    if (Wire.available() != 0)                  /* 得到已经接收到的数据字节数 */
    {
        return Wire.read();                     /* 到数据缓冲区读取数据 */
    }

    return 0xFF;
}

/**
 * @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[i] = 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 = ((uint16_t)(buf[5] & 0X3F) << 4) | (buf[4] & 0X0F);   /* 读取PS传感器的数据 */
    }
}

ap3216c.h

/**
 ****************************************************************************************************
 * @file      ap3216c.h
 * @author    Turinger Software
 * @version   V1.0
 * @date      2024-09-20
 * @brief     24C02驱动代码
 * 实验平台    图灵哥 TRGESP32S3探索板
 *
 ****************************************************************************************************
 */

#ifndef __AP3216C_H
#define __AP3216C_H

#include "Arduino.h"

/* 引脚定义 */
#define IIC_SCL         42
#define IIC_SDA         41

#define AP3216C_ADDR    0X1E    /* 7位器件地址 */

/* 函数声明 */
uint8_t ap3216c_init(void);                                         /* AP3216C初始化函数 */
void ap3216c_write_one_byte(uint8_t reg, uint8_t data);             /* 写AP3216C寄存器函数 */
uint8_t ap3216c_read_one_byte(uint8_t reg);                         /* 读取AP3216C寄存器数据函数 */
void ap3216c_read_data(uint16_t *ir, uint16_t *ps, uint16_t *als);  /* 读取AP3216C的数据 */

#endif

实验结果

实验到此结束,感谢观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值