Funpack第六期说明文档
我是来自安徽某师范大学18级通信工程的一名学生,,这次是第二次参加funpack的活动,很高兴也很荣幸能够参加funpack的这次活动.
那么本期活动的任务是实现一个智能手表的简单原型,包括:
- 能显示基本的时间;
- 配合任意形式的一个显示屏及一种或多种传感器或其他器件,实现一个智能手表的相关功能,比如:针对运动的计步器、针对健康的血压监测和跌倒报警等等
首先介绍一下本期开发板评估板,最核心的是MAX32660微控制器,属于美信DARWIN产品系列,是一款超低功耗、性价比突出、集成度非常高的32位控制器。芯片封装非常小,4mm x 4mm 的TQFN已经是这个系列里最大封装,非常适合电池供电或是无线传感器的应用。MAX32660采用了带浮点运算功能的Cortex-M4内核,最大主频96MHz, 带256KB Flash和96KB SRAM,性能很强劲.
那么本次活动我所使用的传感器是apds的一款手势识别传感器,通过oled屏显示一行时间和一行上下箭头,当手从上往下划过传感器时,屏幕上的箭头自动变为向下的箭头,手从下往上划过时则自动变为向上的箭头.
先介绍一下我所使用的手势传感器APDS,它是一款具有光感和色感的传感器,利用四个方向的光电二极管来感测反射的IR能量,以将物理运动信息(即速度,方向和距离)转换成数字信息.APDS的应用广泛,包括手势检测,颜色感测,环境光感测,手机触摸屏和机械开关更换等等.
(手册链接:https://max.book118.com/html/2017/0905/131913559.shtm)
之后就是代码的介绍了,主要代码分别为各个器件的初始化,apds信息获取以及oled显示:
Pin_Init();
printf("Pin Init OK");
if (SPI_Init(SPI0A, 0, SPI_SPEED) != 0)
{
Console_Init();
printf("Error configuring SPI\n");
while (1) {}
}
sys_cfg.tmr = MXC_TMR0;
if (RTC_Init(MXC_RTC, 16*SECS_PER_HR+40*SECS_PER_MIN+0, 0, &sys_cfg) != E_NO_ERROR) {
printf("Failed RTC_Setup().\n");
return -1;
}
if (RTC_EnableRTCE(MXC_RTC) != E_NO_ERROR) {
printf("Failed RTC_EnableRTCE().\n");
return -1;
}
PWM_Output(100);
#if defined USE_OLED
OLED_Init();
#if defined USE_APDS
uint8_t gesture = APDS9960_readGesture();
uint8_t temp_gest = 0;
if(gesture == APDS9960_DOWN)
{
temp_gest = gesture;
printf("v");
}
if(gesture == APDS9960_UP)
{
temp_gest = gesture;
printf("^");
}
if(temp_gest == APDS9960_UP)
OLED_ShowChar(20,30,'^',16);
if(temp_gest == APDS9960_DOWN)
OLED_ShowChar(20,30,'v',16);
sec = RTC_GetSecond();
day = sec / SECS_PER_DAY;
sec -= day * SECS_PER_DAY;
hr = sec / SECS_PER_HR;
sec -= hr * SECS_PER_HR;
min = sec / SECS_PER_MIN;
sec -= min * SECS_PER_MIN;
OLED_ShowChar(10, 8, (char)(48+hr/10),24);
OLED_ShowChar(20, 8, (char)(48+hr%10),24);
OLED_ShowChar(30, 8, (char)(46+(sec%2?12:0)),24);
OLED_ShowChar(40, 8, (char)(48+min/10),24);
OLED_ShowChar(50, 8, (char)(48+min%10),24);
OLED_ShowChar(60, 8, (char)(46+(sec%2?12:0)),24);
OLED_ShowChar(70, 8, (char)(48+sec/10),24);
OLED_ShowChar(80, 8, (char)(48+sec%10),24);
OLED_Refresh();
现象如图,oled第一行显示的是时间,第二行是手势划动的方向.
先是向下划动手指时,第二行显示V字样式代表检测到向下划动:
之后是手指向上滑动,屏幕显示^字样式代表检测到向上划动:
那么以上便是本次活动的我的作业展示了,funpack活动让我每次都接触到没有使用过的开发平台,锻炼了我的学习能力,使我受益匪浅,也让我熟悉了max评估版的基本使用方法,锻炼了我的编程开发能力.很感谢funpack的这次活动,以后也还会多多参加支持活动,希望活动能越办越好!