在這里記錄一下我正在進(jìn)行中的小項(xiàng)目,也可供大家參考(能力有限,大佬勿噴)
繼續(xù)之前的雛形,這次將它進(jìn)行了完善,首先看一下設(shè)計(jì)的結(jié)構(gòu)圖
一、硬件的選用:
主控芯片:stm32F103zet6
1.png (99.67 KB, 下載次數(shù): 69)
下載附件
2019-12-8 01:53 上傳
傳感器部分:HX711與承重傳感器
99.jpg (8.39 KB, 下載次數(shù): 78)
下載附件
2019-12-8 01:54 上傳
2.png (72.35 KB, 下載次數(shù): 73)
下載附件
2019-12-8 01:53 上傳
顯示部分:HMI 串口屏
3.jpg (30.03 KB, 下載次數(shù): 78)
下載附件
2019-12-8 01:53 上傳
語(yǔ)音輔助:M6語(yǔ)音識(shí)別播報(bào)模塊
4.png (119.91 KB, 下載次數(shù): 66)
下載附件
2019-12-8 01:53 上傳
無(wú)線(xiàn)傳輸:nRF24L01轉(zhuǎn)ttl無(wú)線(xiàn)模塊
相較于雛形篇,這次的改進(jìn)的重心在:主控芯片的修改(STM32)、整體程序邏輯的改善、系統(tǒng)整體延時(shí)和錯(cuò)誤率降低、從而使得整體設(shè)計(jì)使用起來(lái)更加順暢,更貼近實(shí)用,下面是程序流程圖介紹:
5.png (64.58 KB, 下載次數(shù): 64)
下載附件
2019-12-8 01:53 上傳
二、核心邏輯為:
1、等待皮重輸入(因?yàn)樵趯?shí)際中藥液的容器分為很多規(guī)格,尤其是PVC型和玻璃型容器皮重差距太大,所以在監(jiān)測(cè)之前先進(jìn)行皮重的輸入,本次程序預(yù)設(shè)了兩種皮重,并可以手動(dòng)輸入皮重,用來(lái)后期進(jìn)行消除)
2、開(kāi)始藥液監(jiān)測(cè)(本次使用的稱(chēng)重傳感器量程為1kg精度為1g,所以采用了每隔一秒采集一次,計(jì)算流速、進(jìn)度、倒計(jì)時(shí)數(shù)據(jù)的方法進(jìn)行監(jiān)測(cè),雖采樣率不高,但是應(yīng)用于本設(shè)計(jì),還是適用的)
3、數(shù)據(jù)的傳輸(本次采集到的流速、進(jìn)度、倒計(jì)時(shí)等數(shù)據(jù)會(huì)實(shí)時(shí)體現(xiàn)在三個(gè)方面,第一是下位機(jī)串口屏幕上、第二是上位機(jī)的PC軟件中、第三是語(yǔ)音識(shí)別后的播報(bào)中)
三、重點(diǎn)問(wèn)題與解決方案:
如何通過(guò)測(cè)量藥液重量來(lái)實(shí)現(xiàn):流速、進(jìn)度、倒計(jì)時(shí)等信息的獲。
1、手動(dòng)輸入或選用預(yù)設(shè)的皮重為 Z,這一步是為了消除容器的質(zhì)量
2、測(cè)量初始藥液重量(已去皮)為A,進(jìn)入while循環(huán),測(cè) 現(xiàn)一秒的重量為B,下一秒的重量為C,以此類(lèi)推,從而實(shí)現(xiàn)每隔一秒測(cè)一次重量
3、流速 = B – C 得到一個(gè)單位為 g/s 的 流速數(shù)值
4、進(jìn)度百分比 = C*100/A 得到一個(gè)單位為 % 的 進(jìn)度數(shù)值
5、C / 流速 = 倒計(jì)時(shí) 得到一個(gè)單位為 s 的 倒計(jì)時(shí)數(shù)值
如何實(shí)現(xiàn)數(shù)據(jù)的無(wú)線(xiàn)傳輸與PC對(duì)多個(gè)下位機(jī)的數(shù)據(jù)接收?
首先是在硬件的選擇上,選用了nRF24L01無(wú)線(xiàn)傳輸模塊,只需單片機(jī)通過(guò)串口向其發(fā)送數(shù)據(jù),但是為了實(shí)現(xiàn)PC端對(duì)多個(gè)下位機(jī)的數(shù)據(jù)接收,我選擇每個(gè)下位機(jī)都以一個(gè)八位字符串來(lái)進(jìn)行發(fā)送數(shù)據(jù):1、2位為設(shè)備號(hào), 3、4位為流速信息,5、6位為進(jìn)度信息, 7、8位為倒計(jì)時(shí)信息。并且上位機(jī)軟件利用LabVIEW進(jìn)行編寫(xiě),上位機(jī)開(kāi)啟后會(huì)依次按順序?qū)Ω鱾(gè)下位機(jī)發(fā)送啟動(dòng)信號(hào),當(dāng)下位機(jī)接到此信號(hào)則進(jìn)行數(shù)據(jù)發(fā)送,在上位機(jī)處對(duì)這個(gè)八位字符串進(jìn)行采集,截取,分割,根據(jù)1、2位設(shè)備號(hào)的不同,送入不同的條件分支中,再進(jìn)行判斷與報(bào)警
6.png (121.58 KB, 下載次數(shù): 61)
下載附件
2019-12-8 01:53 上傳
四、程序編寫(xiě)時(shí)遇到的困難與解決方案: 如何使得一個(gè)發(fā)送來(lái)的兩位字符串轉(zhuǎn)換成數(shù)據(jù)變量形式參與運(yùn)算? 首先,我們的Keil5編譯軟件在編寫(xiě)stm32時(shí)無(wú)法調(diào)用string等相關(guān)語(yǔ)法和函數(shù),因?yàn)樗荂++的內(nèi)容,這就使得我們?cè)诰帉?xiě)時(shí)根本無(wú)法定義一個(gè)字符串,也就是無(wú)法很簡(jiǎn)單的一次接收多位字符串,并且這個(gè)字符串如果想?yún)⑴c運(yùn)算時(shí),必須轉(zhuǎn)換成其他變量才可以,否則將會(huì)自動(dòng)轉(zhuǎn)為ASCII碼,在這里我利用了switch-case很方便的解決了這個(gè)問(wèn)題,部分程序如下 - void changeA(void);
- void changeB(void);
- while(1)
- {
- a=getchar();//接收第一個(gè)字符
- a=getchar();//確保接收成功
- b=getchar();//接收第二個(gè)字符
- changeA ();//通過(guò)子程序?qū)⑦@個(gè)字符轉(zhuǎn)換成整形數(shù)
- changeB ();//通過(guò)子程序?qū)⑦@個(gè)字符轉(zhuǎn)換成整形數(shù)
- z=x*10+y; //第一個(gè)整形數(shù)為十位,第二個(gè)為個(gè)位,組成這個(gè)兩位數(shù)
- }
- void changeA ()
- {
- switch(a)
- {
- case '0': x=0;
- break;
- case '1': x=1;
- break;
- case '2': x=2;
- break;
- case '3': x=3;
- break;
- case '4': x=4;
- break;
- case '5': x=5;
- break;
- case '6': x=6;
- break;
- case '7': x=7;
- break;
- case '8': x=8;
- break;
- case '9': x=9;
- break;
- }
- }
- void changeB ()
- {
- switch(b)
- {
- case '0': y=0;
- break;
- case '1': y=1;
- break;
- case '2': y=2;
- break;
- case '3': y=3;
- break;
- case '4': y=4;
- break;
- case '5': y=5;
- break;
- case '6': y=6;
- break;
- case '7': y=7;
- break;
- case '8': y=8;
- break;
- case '9': y=9;
- break;
- }
- }
復(fù)制代碼 如何使得字符串與整形變量一并發(fā)出去?
首先在編寫(xiě)STM32時(shí),printf函數(shù)只能定向在一個(gè)串口上,在調(diào)用其他串口發(fā)送數(shù)據(jù)時(shí),我們又怎么才能將一個(gè)字符串與一個(gè)實(shí)時(shí)變化的變量一并發(fā)送呢,在這里選擇直接組成數(shù)組,將數(shù)組發(fā)送出去,如下:- void Sends(char *buf1);
- char A[10] = ""; //定義一個(gè)容量為10的數(shù)組
- while(1)
- {
- sprintf(A,"n1.val=%d",liusu); //發(fā)送格式化輸出到 str 所指向的字符串
- Sends(A); //發(fā)送數(shù)組
- }
-
- void Sends(char *buf1) //發(fā)送函數(shù)
- {
- u8 i=0;
- while(1)
- {
- if(buf1[i]!=0)
- {
- USART_SendData(USART3,buf1[i]); //發(fā)送一個(gè)字節(jié)
- while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET){};//等待發(fā)送結(jié)束
- i++;
- }
- else
- return ;
- }
- }
復(fù)制代碼 五、成果部分
實(shí)物主體部分
7.png (228.34 KB, 下載次數(shù): 84)
下載附件
2019-12-8 01:53 上傳
PC上位機(jī)界面
8.png (337.77 KB, 下載次數(shù): 69)
下載附件
2019-12-8 01:53 上傳
下位機(jī)串口屏界面
9.png (127.25 KB, 下載次數(shù): 71)
下載附件
2019-12-8 01:53 上傳
10.png (137.71 KB, 下載次數(shù): 70)
下載附件
2019-12-8 01:53 上傳
11.png (102.3 KB, 下載次數(shù): 63)
下載附件
2019-12-8 01:53 上傳
全部資料51hei下載地址:
輸液監(jiān)測(cè)裝置.zip
(13.05 MB, 下載次數(shù): 146)
2019-12-8 01:24 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|