项目描述
项目介绍
使用板卡搭建一个手指数量辨识工具。
板卡上集成了光照传感器,将板卡平放后,伸出不同数量的手指在板卡上挥动,识别出有几根手指。
设计思路
当手指以一个离板卡较近的距离经过后,光照传感器正上方就会有一个比较好的遮挡,当手指缓缓经过就会有一个连续的效果(不遮挡-遮挡-不遮挡)。
当在板卡上方使用LED灯照射时,就会产生一个比较强的平行光,这样遮挡产生的效果就会最大化。
因为一次手指经过的时间是比较短的,当检测到一次不遮挡-遮挡-不遮挡变化后,就会等待2秒,当这2秒内再次出现不遮挡-遮挡-不遮挡变化后,就会加一根手指计数,然后从新计时,如果这2秒没有发送变化,就会打印采集到经过的手指数。
官方提供了非常完整的工程,直接在源工程上修改即可得到亮度获取的裸工程。
硬件介绍
特性:
- 易于迁移至基于 AVR 的嵌入式应用的云端
- 嵌入式传感器,执行器或机电一体化应用
- 轻松为广大的 AVR MCU 应用添加云连接
- 智能:PIC24FJ128GA705 XLP MCU
- 128 KB 闪存和 16 KB SRAM
- 低功耗、智能传感器的理想选择
- 连接:WINC1500 Wi-Fi
- 运行连接到 Amazon Cloud 的 TCP/IP 和 TLS
- 安全:ATECC608
- 密钥存储、认证、加密
- AWS IoT Core 的安全设备身份验证
- 预先配置,易于连接
- 物联网传感器节点快速原型开发
- 包括光和温度传感器
- AVR-IoT.com 上的自定义登录页面
- 添加更多传感器:500 多个扩展板供选择
- 轻松拖放编程器/调试器
- 用于连接 MikroElekronika click Boards™ 的 mikroBUS 接头
- 板载调试器
- Microchip MPLAB X IDE中的板卡识别
- 编程和调试
- 虚拟 COM 端口 (CDC)
- 一个逻辑分析仪通道(DGI GPIO)
应用:
- 智能家居物联网传感器和执行器(照明、访问控制、气候控制)
- 智慧城市工业传感器(空气质量、交通预测)
- 健康(血压、心率)
- 工业 4.0 过程控制传感器(液位、压力、温度、流量)
PIC24F系列微控制器是具有128KB 的 ECC 闪存和16KB RAM 的超低功耗16位微控制器,非常适合用于低功耗和互连应用。具有 12 位 ADC(200ksps)、多达 14 个模拟输入、3 个比较器和 CTMU(用于触摸应用),该系列芯片非常适用于通用应用。
芯片关键规格
CPU类型 | 16-bit PIC MCU | 直接内存访问 (DMA) 通道 | 6 | ADC数量 | 1 | 比较器数量 | 3 |
CPU 运行速度 (MHz) | 16 | 工作温度范围 | -40ºC~125ºC | ADC通道数 | 14 | 是否支持低功耗 | 是 |
程序存储器大小(KB) | 128 | 工作电压范围 | 2.0V~3.6V | 最大 ADC 分辨率(bits) | 12 | 是否外设引脚选择 (PPS) / 引脚复用 | 是 |
Multiple Flash Panels | False | 内部振荡器 | 8MHz | 最大 ADC 采样率(ksps) | 200 | 是否支持 MPLAB 代码配置器 | 是 |
EV54Y39A板卡硬件布局
软件流程图
主要代码片段及说明
初始化代码
初始化MAIN_dataTask任务
void application_init(void)
{
SYSTEM_Initialize();
timeout_flushAll();
LED_test();
timeout_create(&MAIN_dataTasksTimer, MAIN_DATATASK_INTERVAL);
}
主任务
主要运算逻辑实现
uint8_t fingers = 0;
uint32_t time_count=0;
uint32_t MAIN_dataTask(void *payload)
{
static uint8_t fingers_mode = 0;
int light = 0;
light = SENSORS_getLightValue();
// printf("light:%d\r\n", light);
if(light < 300 && fingers_mode == 0)
{
time_count = 0;
fingers_mode = 1;
fingers ++;
}
else if(light >= 300 && fingers_mode == 1)
{
fingers_mode = 0;
}
if(fingers != 0 && time_count > 20)
{
printf("fingers num:%d\r\n", fingers);
fingers = 0;
}
time_count++;
return MAIN_DATATASK_INTERVAL;
}
获取亮度
uint16_t SENSORS_getLightValue(void)
{
return ADC1_GetConversion(LIGHT_SENSOR_ADC_CHANNEL);
}
主代码
主要就是初始化与任务调度
int main(void)
{
application_init();
while (1)
{
runScheduler();
}
return 0;
}
功能展示及说明
识别结果打印
对本活动的心得体会
这次的题目趣味性还是比较强的,一开始本来打算采用快速晃动手指的方式,利用挡光率不同的原理去做手指数判断,但是后来考虑到这种方式很难量化处理,就换成了上文的方式,整体玩下来还是比较有趣的。
意见建议
无。
注意
与DFP包与XC16版本如下: