胡秋霞,田 杰,陳 諾
(西安航空學(xué)院計(jì)算機(jī)學(xué)院,陜西西安 710077)
許多老人的記憶力差,在生病時(shí)經(jīng)常忘記吃藥。針對(duì)老齡患者吃藥困難的實(shí)際情況,設(shè)計(jì)了基于STM32 的智能語(yǔ)音藥盒,該設(shè)計(jì)可以更好地處理老年人的吃藥問(wèn)題[1-2]。MEMO BOX 電子藥盒是由英國(guó)劍橋的盧山研發(fā)的,這是一款智能電子藥盒,造型時(shí)尚、攜帶方便、功能強(qiáng)大,能準(zhǔn)確提示患者及時(shí)服藥。該智能藥盒具有對(duì)應(yīng)的手機(jī)應(yīng)用,可用手機(jī)提前記錄服藥情況,利用藍(lán)牙與其進(jìn)行數(shù)據(jù)交換[3-4]。
秦寧等[5]設(shè)計(jì)的電子藥盒能夠減少高齡患者按時(shí)用藥中遭遇的部分阻礙,但有一些功能上的不完善現(xiàn)象。比如其藍(lán)牙由于協(xié)議問(wèn)題可能會(huì)導(dǎo)致網(wǎng)速慢,高齡患者在使用復(fù)雜手機(jī)APP 時(shí)容易操作失誤[5]。國(guó)內(nèi)對(duì)于智能語(yǔ)音藥盒的相關(guān)研究較晚,在21 世紀(jì)初才逐漸在大城市里出現(xiàn)。
以上研究者在智能語(yǔ)音藥盒方面取得了一定效果,但存在使用藍(lán)牙時(shí)數(shù)據(jù)連接不穩(wěn)定、設(shè)計(jì)復(fù)雜導(dǎo)致容易誤操作等問(wèn)題,因此需要設(shè)計(jì)一種具備較好智能提醒功能、造型簡(jiǎn)約和操作簡(jiǎn)單的電子藥盒[6-7]。鑒于此,文中設(shè)計(jì)了基于STM32 的智能語(yǔ)音藥盒系統(tǒng),該系統(tǒng)能夠提前提示患者服藥并能語(yǔ)音提示服藥時(shí)間,到了系統(tǒng)設(shè)置的時(shí)間后將自動(dòng)進(jìn)行語(yǔ)音提示,具有成本低廉、便于攜帶、操作容易等特點(diǎn),并具有語(yǔ)音提醒功能。
該系統(tǒng)設(shè)計(jì)了以STM32 單片機(jī)為核心的適用于普通家庭的電子藥盒。該設(shè)計(jì)基于時(shí)鐘程序進(jìn)行計(jì)時(shí),實(shí)時(shí)時(shí)間會(huì)被打印到液晶顯示屏上,可通過(guò)鍵盤(pán)更改時(shí)間點(diǎn)。如果達(dá)到提前設(shè)置的時(shí)間,STM32 通過(guò)調(diào)用功能函數(shù)完成語(yǔ)音播報(bào)功能,同時(shí)向輸出端持續(xù)輸出低電平。系統(tǒng)采用STM32 為核心控制芯片[8],連接復(fù)位電路、時(shí)鐘電路,共同組成控制系統(tǒng)。搭配穩(wěn)定的時(shí)鐘電路,顯示模塊完成狀態(tài)時(shí)間顯示功能,紅外模塊檢測(cè)當(dāng)前藥盒蓋子是否打開(kāi),使用語(yǔ)音播報(bào)模塊接收STM32 控制核心發(fā)送的數(shù)據(jù),從而實(shí)現(xiàn)定時(shí)提示功能。在程序的設(shè)計(jì)上,STM32對(duì)各個(gè)模塊的函數(shù)資源進(jìn)行集中執(zhí)行,調(diào)用檢測(cè)按鍵掃描功能函數(shù)消除抖動(dòng)等,然后調(diào)用信息數(shù)據(jù)更新函數(shù),使按鍵與屏幕進(jìn)行信息交互,電子屏用于接收并打印出屏幕顯示信息。系統(tǒng)總體結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)總體結(jié)構(gòu)
單片機(jī)的最小系統(tǒng)STM32F103C8T6 核心板如圖2 所示。該系統(tǒng)擁有最多128 kB 閃存,同時(shí)具有功耗需求?。ㄔ谧钚‰娏鳛?6 mA 時(shí)功耗最?。┖托阅軓?qiáng)等特點(diǎn)。該系統(tǒng)包含了CPU 處理芯片中央處理器、I/O 口和存儲(chǔ)器等,只需要用相應(yīng)的編譯器編寫(xiě)程序就可以實(shí)現(xiàn)對(duì)外圍器件的控制[8-10]。
圖2 單片機(jī)的最小系統(tǒng)STM32核心板
2.2.1 顯示電路
時(shí)間顯示部分使用LCD1602 液晶顯示器,該顯示器可支持最多三十六個(gè)數(shù)字或者字符的顯示,通過(guò)單片機(jī)對(duì)D0 至D9 進(jìn)行控制即可顯示數(shù)據(jù),可通過(guò)軟件編程自由調(diào)整刷新率。通過(guò)發(fā)送八位數(shù)據(jù)確定顯示數(shù)據(jù)的位置,再通過(guò)發(fā)送八位數(shù)據(jù)判斷輸出的數(shù)據(jù)。當(dāng)RS 引腳電平為零時(shí),發(fā)送的是數(shù)據(jù),當(dāng)其為低電平時(shí)發(fā)送位置信息[11-12]。LCD1602 具有顯示效果良好、方便攜帶等優(yōu)點(diǎn),方便數(shù)碼顯示。LCD1602 主要分為背光顯示器與非背光顯示器兩種,背光顯示器厚度大,該設(shè)計(jì)使用非背光顯示器,它是一款工業(yè)數(shù)碼液晶顯示器。LCD1602 引腳功能如表1 所示。
表1 LCD1602引腳功能
2.2.2 按鍵電路
該設(shè)計(jì)有三個(gè)按鍵,分別為K1、K2、K3。K1按鍵用來(lái)設(shè)置時(shí)、分、秒、年、月、日。K2按鍵用于設(shè)置參數(shù)的加法運(yùn)算,可以將設(shè)置完成的時(shí)間變量賦值給系統(tǒng)的時(shí)間變量,從而更改時(shí)間。K3按鍵與K2按鍵相反,用于設(shè)置參數(shù)的減法運(yùn)算,當(dāng)I/O 口檢測(cè)到低電平時(shí),說(shuō)明K3按鍵已經(jīng)被按下,單片機(jī)通過(guò)分析電平的變化來(lái)決定下一步調(diào)用的函數(shù)。但是當(dāng)按鍵被按下時(shí)會(huì)產(chǎn)生抖動(dòng),需要使用去抖函數(shù)。系統(tǒng)按鍵電路連接圖如圖3 所示[13]。
圖3 系統(tǒng)按鍵電路連接圖
2.2.3 語(yǔ)音播報(bào)
電子藥盒使用WT588D 芯片完成語(yǔ)音提示功能,WT588D 是一款可重復(fù)燒寫(xiě)的高性?xún)r(jià)比的模塊封裝語(yǔ)音芯片,其中芯片負(fù)責(zé)輸出語(yǔ)音文件,喇叭可以發(fā)出聲音進(jìn)行提示。WT588D 還擁有完善的軟件配套支持,大大降低了語(yǔ)音開(kāi)發(fā)難度。在使用WT588D芯片之前需要先下載語(yǔ)音資源,STM32 需要播報(bào)音頻文件時(shí),會(huì)向WT588D 模塊發(fā)送進(jìn)行語(yǔ)音提示的命令。需要將數(shù)據(jù)下載到SPI-Flash 中,下載時(shí)只需要進(jìn)行電路復(fù)位就可以同步數(shù)據(jù),無(wú)需斷電[14]。
WT588D 內(nèi)置高速音頻處理器以及功能強(qiáng)大的DA 轉(zhuǎn)換器,支持兩種形式的輸出。WT588D 的P03端口作為信息輸入,核心控制模塊通過(guò)它實(shí)現(xiàn)對(duì)整個(gè)芯片的控制,而其他I/O 口一般被當(dāng)做按鍵使用。PWM 輸出端不能接地,P15 口為忙信號(hào)的輸出口,使用之前需要檢測(cè)忙信號(hào),作用是檢測(cè)當(dāng)前模塊是否正在處理其他工作,如果是低電平,則表示可以接收新的數(shù)據(jù);如果是高電平,則表示當(dāng)前模塊正忙。VDD 可連接VCC,是電源的輸入端,兩端口的電壓可以自動(dòng)實(shí)現(xiàn)均衡。WT588D 引腳圖如圖4 所示。
圖4 WT588D引腳圖
2.2.4 短信模塊
短信模塊選用SIM800 芯片[15],SIM800 使用串口的方式聯(lián)系單片機(jī),而該設(shè)計(jì)主要用到部分AT 指令。首先使用CNMI 指令設(shè)置新任務(wù)并選擇要發(fā)送的位置,當(dāng)SIM 卡未滿(mǎn)且接收到新信息時(shí),芯片會(huì)返回信息給相應(yīng)的串口,然后把數(shù)據(jù)存儲(chǔ)到設(shè)置好的位置上。CMGF 與CSMP 命令分別用來(lái)設(shè)置發(fā)送的模式和參數(shù),CSCS 用來(lái)設(shè)置字符編碼,在發(fā)送含中文的字符時(shí)必須設(shè)置CSCS 為UCS2 并重新設(shè)置CSMP 參數(shù),否則會(huì)出現(xiàn)亂碼現(xiàn)象。發(fā)送CMGR 命令讀取信息。CMGS 指令用來(lái)發(fā)送信息,一般最多可以發(fā)送70 個(gè)漢字字符,180 字節(jié)的英文字母。通過(guò)發(fā)送CPMS 指令設(shè)置和查找信息儲(chǔ)存器,發(fā)送該命令可以查詢(xún)當(dāng)前SIM 卡里存儲(chǔ)的短信信息量。CPMS 命令可以查詢(xún)當(dāng)前SIM 卡的短信存儲(chǔ)空間,以及已使用的空間[16]。
SIM800 芯片電路如圖5 所示,引腳2 接單片機(jī)的TXD 引腳,引腳3 連接單片機(jī)的RXD 引腳。引腳1 與引腳5 接地,在完成信息發(fā)送后電流可能會(huì)達(dá)到峰值,為了防止芯片被擊穿,可以外接一個(gè)二極管。
圖5 SIM800芯片電路
2.2.5 DS1302時(shí)鐘
DS1302 是一種性?xún)r(jià)比高,但易受環(huán)境影響,容易出現(xiàn)時(shí)鐘混亂的時(shí)鐘電路,它可在5 V 的電壓下正常工作,內(nèi)部有12 個(gè)寄存器[17]。
DS1302 引腳圖如圖6 所示,引腳1 與引腳8 分別為連接主電源和備用電源的引腳,兩者可以同時(shí)連接,芯片會(huì)選擇其中電壓更大的一個(gè)引腳。引腳2和引腳3 接外部晶振。引腳4 及GND 為接地引腳。引腳5 為復(fù)位或者片選線(xiàn),可以把RST 從低電平升到高電平,從而完成一次信息傳輸。引腳6 為數(shù)據(jù)輸入輸出口,在控制字被輸入后的下一個(gè)SCLK 時(shí)鐘的上升沿,信息將被輸入時(shí)鐘芯片,信息每次從零開(kāi)始到高位七輸出。在接著的控制字后的下一個(gè)下降沿,從零位至七位讀取芯片的數(shù)據(jù)。引腳7 為SCLK,一般在一個(gè)上升下降沿的間隔中進(jìn)行數(shù)據(jù)操作。
圖6 DS1302引腳圖
該設(shè)計(jì)整體的流程圖如圖7 所示。具體步驟如下:①完成各個(gè)部分如GPIO 引腳、LED、時(shí)鐘電路和GSM 等的初始化工作。②讀取時(shí)鐘電路的時(shí)間并顯示。③用一個(gè)標(biāo)記變量判斷是否應(yīng)發(fā)送短信,如果標(biāo)記變量為1,則調(diào)用發(fā)送短信函數(shù),否則不發(fā)送并將標(biāo)記變量置為0。④判斷是否到吃藥時(shí)間,若是,則將語(yǔ)音標(biāo)志位置為1,并進(jìn)行播報(bào)。⑤語(yǔ)音播報(bào)使用紅外技術(shù),其思想是判斷紅外是否遮擋,若遮擋則語(yǔ)音標(biāo)志位置為0,則停止語(yǔ)音播報(bào)。⑥判斷GSM 是否發(fā)送完畢,如果不是,則繼續(xù)語(yǔ)音播報(bào),否則結(jié)束[18]。
圖7 主程序流程圖
2.3.1 GSM模塊程序設(shè)計(jì)
GSM 模塊程序設(shè)計(jì)主要步驟如下:
1)調(diào)用void Sim800_init()函數(shù)進(jìn)行初始化,調(diào)用其他子函數(shù)時(shí)都需要調(diào)用清除函數(shù)清空接收的緩存。
2)調(diào)用模式設(shè)置函數(shù)子函數(shù)Sim_SendStr("AT+CMGF=1 "),將其設(shè)置為文本發(fā)送模式。因?yàn)镾MS信息為全英文,所以將Sim_SendStr("AT+CSCS="GSM" ")設(shè)置成字符模式,含中文時(shí)必須設(shè)置為UCS2 編碼。
3)調(diào)用發(fā)送處理函數(shù)void Send_Sms(char*number,char * content),先清空發(fā)送緩存區(qū),然后調(diào)用Sms_SendStr(gsm_shuzu)函數(shù)給預(yù)設(shè)的手機(jī)號(hào)發(fā)送文本短信,其中g(shù)sm_shuzu 是一個(gè)字符串,它是AT 指令CMGS 與號(hào)碼的拼接。
4)經(jīng)延遲后,調(diào)用Sms_SendStr(gsm_wenben)函數(shù),其中g(shù)sm_wenben 為發(fā)送的內(nèi)容。
2.3.2 WT588D模塊程序設(shè)計(jì)
WT588D 模塊程序主要步驟如下:
1)設(shè)置存儲(chǔ)器容量,裝載.WAV 格式的音頻文件并設(shè)置其格式,比如采樣率、時(shí)長(zhǎng)等信息。
2)進(jìn)行忙信號(hào)設(shè)置,可自由選擇高低電平輸出,然后進(jìn)行地址選擇,同一地址可裝載不同的語(yǔ)音段。
3)設(shè)置一個(gè)標(biāo)志位yuyin_flag 標(biāo)志是否進(jìn)行語(yǔ)音播報(bào),當(dāng)它為1 時(shí)進(jìn)行語(yǔ)音提示,為0 時(shí)則不進(jìn)行語(yǔ)音提示。
4)使用或判斷系統(tǒng)設(shè)置的三次吃藥時(shí)間與當(dāng)前時(shí)間是否相同,只要有一次相同則調(diào)用void Line_1A(unsigned char dat)函數(shù)獲取語(yǔ)音地址,然后將yuyin_flag 標(biāo)志位置為1,進(jìn)行語(yǔ)音播報(bào)。同時(shí),使用if 判斷當(dāng)yuyin_flag 標(biāo)志位為1 時(shí),開(kāi)始每秒自增1,當(dāng)自增到50 s 時(shí),將yuyin_flag 標(biāo)志位置為0,停止語(yǔ)音提示。
5)當(dāng)紅外感應(yīng)的標(biāo)志位Hw_flag 為0 時(shí),表示藥盒被打開(kāi),此時(shí)yuyin_flag 標(biāo)志位也變?yōu)?,即停止播報(bào)。
文中設(shè)計(jì)選用的模塊在功能完備的情況下最大可能地選擇性?xún)r(jià)比高的器件,電子藥盒使用STM32單片機(jī),顯示屏使用LCD1602,語(yǔ)音模塊采用WT588D芯片以及DS1302 時(shí)鐘芯片。
文中主要實(shí)現(xiàn)了SMS 提示信息發(fā)送,使用液晶顯示屏顯示信息,按鍵電路完成對(duì)三次吃藥時(shí)間的確定,方便到了系統(tǒng)設(shè)定時(shí)間進(jìn)行語(yǔ)音提示。短信功能是該設(shè)計(jì)的一個(gè)亮點(diǎn),在程序中主要調(diào)用AT 命令A(yù)T+CMGS、AT+CSCS 等函數(shù),實(shí)現(xiàn)數(shù)據(jù)和指令的傳輸,完成短信發(fā)送功能。