在线时间694 小时
UID406727
注册时间2012-12-12
NXP金币11
TA的每日心情 | 奋斗 2023-2-15 00:12 |
---|
签到天数: 969 天 [LV.10]以坛为家III
金牌会员
- 积分
- 7090
- 最后登录
- 2023-4-20
|
本帖最后由 jinglixixi 于 2017-5-15 18:45 编辑
开发背景: 伴随老龄化的逐步到来,老人独自在家十分需要有人照顾,而儿女们却需要为生活而奔忙。像老人服药这类的小事,也是需要有人去关注和提示的。为此制作一个多功能的智能型语音药盒是一件有意义的事情。 就开发平台的选择来讲,LPC54114开发板是一款与设计目标十分贴和的开发工具,它所配置的SPH0641LM4H数字麦克风、Wolfson的WM8904codec芯片等即语音类处理。通过配置OLED屏,耳机或小音箱等就可达到基本的设计要求。 此外,板载的温度传感器及内置的RTC和A/D转换器,还能语音药盒的功能上附加一些智能家居控制的功能,因此极具实用价值。 那该语音药盒又有何功能呢? 首先该语音药盒的核心是RTC计时器,它无需MCU的干预接口自行运转,从而使MCU能腾出宝贵的时间去处理其它工作。通过设置多个提示时段,即可在相应的时刻发出的提示信息,这些会以3种形式来输出,他们分别是: 1)语音方式,该提示最有穿透力,因为它不管你在做什么,也不管你是否在关注它,只有在它作用的范围内都会通知到你。 2)中文信息方式,该提示最具审核性,它可供你仔细的查看与核对。通过OLED屏可查看的信息有:服药时间、药品名称、用量等。起初是将它也归入到语音中,但在没有语音文件系统的支持下,语音的播放内容是会受到极大限制的。 3)LED指示方式,该方式可在药盒中指示出是否药物的正确位置,以便于取出。受时间的限制原本打算以步进电机使药盒转动到出口位置以供获取,只能以后在添加了。 除语音药盒功能外,为充分发挥开发板的资源,还以OLED屏实时地显示出环境的温度和A/D转换口的电压值。在添加控制限值的情况下,即可实现温度控制及安放报警等,因为大多数的传感器都是通过模拟信号输出的,接入A/D转换口,即可对其进行判别处理和控制,从而易于实现家居控制等。 1.主要构成 该语音药盒主要由LPC54114开发板、OLED屏、耳机或音箱所构成,如图1所示。在设计与调试阶段可以耳机来进行,在实际使用时,则需要扬声器来播放,采用的方法有2种。一是直接接上一个小音箱,这种方法最简单,但相对比较耗电也不像个独立的作品;另一个是为它配功放,只需一个运放和一些阻容元件即可,相对比较经济,也便于作品的一体化。 在供电方面,建议采用USB电源转换器,它体积小,也比用电池环保。 图1 基本构成
该语音药盒可实现多个时段的提示处理,如图2至图5所示。在测试时为节省时间,仅以分钟为单位设置了4个时段加以验证,情况完全正常。设置时间一到,3种输出信息准时到达。 图2 时段1提示界面
图3 时段2提示界面
图4 时段3提示界面
图5 时段4提示界面
2.字库制作 为便于使用,特利用PCtoLCD2002字模提取软件构建了小字库,其界面如图6所示。通过小字库的构建,可将常用的药名字模提取出来,构建一个专用的字库。 相对来讲如果构建一个完整的字库,并存放在SD卡中以供调用会更理想。它有利于采用文本方式来设置提示条件,这也是后续完善的提升方向之一。 图6 构建字库
3.功能 该作品的功能包括:RTC计时、温度检测、模拟传感器检测及显示等,并通过多时段语音提示功能。 4.各级界面 图7 主界面
该设计共有两种显示模式,即语音药盒模式(多时段语音提示)、家居测控模式(温度检测、模拟传感器测控),其界面分别如图1、图2所示。通过K2键可切换显示模式,在解决测控模式下,日期显示信息会覆盖语音药盒的提示信息。
5.处理流程 图8程序流程
6.程序设计
多时段提示处理程序: - if((f!=0)&&(cp<3))
- {
- if(ch==p) // 时段判别
- {
- m1(); // 中文信息提示(时间、药名、数量)
- led_on(4); // 药盒位置指示
- o=1; // 语音提示启动标识
- }
- if(ch==(p+1))
- {
- m2();
- led_on(5);
- o=1;
- }
- if(ch==(p+2))
- {
- m3();
- led_on(6);
- o=1;
- }
- if(ch==(p+3))
- {
- m4();
- led_on(7);
- o=1;
- }
- if(ch==(p+4))
- {
- OLED_ShowString(20,2," ",16);
- led_off(4);led_off(5);led_off(6);led_off(7);
- }
- }
复制代码温度检测程序: - if(fPCTValue>=0)
- {
- //PRINTF("Temperature Value is +%d.%d oC.\r", (int)(fPCTValue*100)/100, (int)(fPCTValue*100)%100);
- OLED_ShowString(0,4,"Temp: ",16);
- OLED_ShowNum(40,4,(int)(fPCTValue*100)/100,3,16);
- OLED_ShowString(64,4,".",16);
- OLED_ShowNum(72,4,(int)(fPCTValue*100)%100,2,16);
- }
- else
- {
- //PRINTF("Temperature Value is -%d.%d oC.\r", (int)((0-fPCTValue)*100)/100, (int)((0-fPCTValue)*100)%100);
- OLED_ShowString(0,4,"Temp:-",16);
- OLED_ShowNum(40,4,(int)((0-fPCTValue)*100)/100,3,16);
- OLED_ShowString(64,4,".",16);
- OLED_ShowNum(72,4,(int)((0-fPCTValue)*100)%100,2,16);
- }
- OLED_ShowString(80,4,"oC",16);
复制代码模拟信号电压采集程序: - wADCValue = adc_read(ADC_CHANNEL_NUM);
- if(wADCValue != 0xFFFF)
- {
- dwLedTime = (wADCValue*2000)/0xFFFF; // ajust the led blinky freqency
- //wADCValue = 0xFFFF; 3.3v
- }
-
- OLED_ShowString(0,6,"ADC:",16);
- OLED_ShowNum(40,6,(int)((wADCValue*3.3)/0xFFF*100)/100,1,16);
- OLED_ShowString(48,6,".",16);
- OLED_ShowNum(56,6,(int)((wADCValue*3.3)/0xFFF*100)%100,2,16);
- OLED_ShowString(72,6,"V",16);
复制代码
7.语音的录制与播放 在该作品的设计中,语音的处理是一个关键。为了有效地缩减程序的规模和复杂度,语音的录制处理放到外部的其它程序来处理,由于录制的结果是存放在板载的Flash中,因此不怕断电丢失。在该作品中只需按地址适时地对其读取播放即可。 尽管板载的Flash相对于需要来讲不是很大,但在语音较短的情况下,还是可以考虑对Flash进行分段录制,并依地址分段存储与播放。 其实按原来的设想是探索以数字录音芯片录制,然后转存到SD卡的文件中进行存储和管理。当使用时再按文件名来读取需要的语音文件以实现语音的再现。然而花费的时间和精力太多,难以短期解决,只能退而求其次,单用Flash来进行语音录放达到功能上的效果演示。
8.改进方向 未来的改进方向是使用文件来管理语音的录放,从而构建一个语音库来扩展语音的播放内容。此外,将录音数据存入文件可增强语音的实时记录与编辑管理等。 此外,以文件来管理各时段的条件设置,能增强管理及编辑的灵活性。在添加功放模块的条件下,取代用音箱来输出语音提示信息。
最后,感谢NXP社区及活动的组织者,LPC54114开发板是一款十分有特色的开发板,与先前较中意的KL26Z开发板有异曲同工之妙值得不断地探索和利用,并将其打造成一个小型的多媒体平台以开发语音型智能作品。
程序代码:
|
|