项目介绍
我在这个项目里使用了EV54Y39A板卡上的TEMT6000亮度传感器,实现了手指数量识别的设计,它的主要功能为:将板卡平放后,伸出不同数量的手指在板卡的光照传感器上挥动,识别出有几根手指。识别的结果通过板载的LED灯珠来进行显示。具体的工作流程如下:
- 按下btn1按键,所有led闪烁三下,并开始识别。
- 手指扫过TEMT6000亮度传感上方。
- 按下btn2按键,识别结束,led显示识别到的手指数量。
- 显示一段时间后,闪烁三下熄灭,准备开始下一轮识别。
项目中使用的EV54Y39A板卡又叫PIC-IoT WA 开发板,它将功能强大的 PIC24FJ128GA705 MCU、ATECC608A CryptoAuthentication™ 安全元件 IC 和经过全面认证的 ATWINC1510 Wi-Fi® 网络控制器结合在一起,为嵌入式应用连接到云端网络服务 (AWS或Google等) 提供了最简单有效的方法。该电路板还包括一个板载调试器,无需外部硬件即可对 MCU 进行编程和调试。
PIC-IoT WA 开发板包含两个主要组件:PIC微控制器(PIC24FJ128GA705)和Wi-Fi模块(WINC1510)。PIC24F是一款低功耗的16位微控制器,时钟频率为32MHz,具有集成的12位ADC。Wi-Fi模块采用Microchip的ATWINC1510,是低功耗认证的IoT网络控制器。
板载的ATECC608密码协处理器。用于生成私钥和公钥,私钥用于加密发送的每条消息,而公钥可与服务提供商(如Google IoT cloud或AWS)共享。
板载传感器包括TEMT6000X01光传感器和MCP9808温度传感器。光传感器连接到PIC控制器的10位ADC,温度传感器通过I2C接口测量-20℃至100℃之间的温度,典型精度为0.25 ℃。
PIC IoT WA开发板可通过微型USB端口或4.2V锂电池供电,同时具有板上编程仿真器和调试器(PKOB)支持一路串口和一个IO的逻辑分析功能。
代码片段及说明
使用官方MPLAB X IDE开发非常方便,我们可以在MCC中配置我们需要的引脚功能,并重命名。按下Generate后,相关代码会自动生成。这样我们只需要写自己的app即可,无需再去操心硬件底层的使用。引脚的编号参考原理图,本项目中使用到了两个按键,四个led和一个光传感器TEMT6000。
自动生成完代码后,我们进入mcc自动生成的头文件中,找到pin_manager,就可以看到我们刚才配置好的引脚要如何使用。使用起来非常方便直观,都是一行代码就可以完成。当然在使用这些方法前,需要先#include "mcc_generated_files/pin_manager.h"
代码中我们先写一个点亮led的function,功能是输入点亮灯的个数就可以按要求点亮。
#include "mcc_generated_files/pin_manager.h"
int set_led(int level) {
switch (level) {
case 0:
LED0_SetHigh();
LED1_SetHigh();
LED2_SetHigh();
LED3_SetHigh();
break;
case 1:
LED0_SetLow();
LED1_SetHigh();
LED2_SetHigh();
LED3_SetHigh();
break;
case 2:
LED0_SetLow();
LED1_SetLow();
LED2_SetHigh();
LED3_SetHigh();
break;
case 3:
LED0_SetLow();
LED1_SetLow();
LED2_SetLow();
LED3_SetHigh();
break;
case 4:
LED0_SetLow();
LED1_SetLow();
LED2_SetLow();
LED3_SetLow();
break;
}
return 1;
}
然后我们用上面这个函数再写一个blink函数,输入blink灯的数量,实现在使用该函数时闪灯三下。这里注意在使用内置方法__delay_ms之前,我们要先定义时钟常量并导入相关库。
#define FCY 1000000UL
#include <libpic30.h>
int blink(int level) {
set_led(0);
__delay_ms(1000);
set_led(level);
__delay_ms(1000);
set_led(0);
__delay_ms(1000);
set_led(level);
__delay_ms(1000);
set_led(0);
__delay_ms(1000);
set_led(level);
__delay_ms(1000);
set_led(0);
return 1;
}
主程序部分就是流程执行:
- 按下btn1按键,所有led闪烁三下,并开始识别。
- 手指扫过TEMT6000亮度传感上方。
- 按下btn2按键,识别结束,led显示识别到的手指数量。
- 显示一段时间后,闪烁三下熄灭,准备开始下一轮识别。
我在里面添加了一个1ms的延迟作为debounce,因为从原理图上看板子上并没有消抖电容。如果需要更大的debounce可以自行增加数值。
int finger = 0;
int main(void) {
// initialize the device
SYSTEM_Initialize();
blink(4);
while (1) {
if (BTN0_GetValue() == 0) {
blink(4);
while (1) {
if (SENS_GetValue() == 0) {
__delay_ms(1);
if (SENS_GetValue() == 0) {
while (SENS_GetValue() == 0) {
// Wait for release
if (BTN1_GetValue() == 0) {
break;
}
}
finger++;
}
}
if (BTN1_GetValue() == 0) {
// Show Results
set_led(finger);
__delay_ms(3000);
blink(finger);
// Reinitialize
finger = 0;
break;
}
}
}
}
return 1;
}
功能展示
开发板上电后,首先是四个灯闪烁,表示已经启动完成。
按下BTN1,开始识别。使用三根手指挥过板子,接着按下btn2后,可以看到三个灯亮起。
心得体会
这次活动非常有意思,光传感器可能是大多数人在刚刚接触嵌入式开发时就会接触到的传感器,应该都很熟悉。但往往应用都是作为开灯指示器类,几乎还没有看到过像这次任务一样使用动态的数据来指示手指的变化。这次的任务让我对传感器使用的灵活性有了全新的理解。