找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5550|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

智護(hù) 輸液監(jiān)測(cè)系統(tǒng)--項(xiàng)目設(shè)計(jì)筆記(中期篇)STM32源程序,LAB上位機(jī),HMI串口屏

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
   在這里記錄一下我正在進(jìn)行中的小項(xiàng)目,也可供大家參考(能力有限,大佬勿噴)
   繼續(xù)之前的雛形,這次將它進(jìn)行了完善,首先看一下設(shè)計(jì)的結(jié)構(gòu)圖

一、硬件的選用:
    主控芯片:stm32F103zet6
                                        

    傳感器部分:HX711與承重傳感器

  

    顯示部分:HMI 串口屏

   

    語(yǔ)音輔助:M6語(yǔ)音識(shí)別播報(bào)模塊
        


    無(wú)線(xiàn)傳輸:nRF24L01轉(zhuǎn)ttl無(wú)線(xiàn)模塊


   相較于雛形篇,這次的改進(jìn)的重心在:主控芯片的修改(STM32)、整體程序邏輯的改善、系統(tǒng)整體延時(shí)和錯(cuò)誤率降低、從而使得整體設(shè)計(jì)使用起來(lái)更加順暢,更貼近實(shí)用,下面是程序流程圖介紹:
      

二、核心邏輯為:
    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)警


四、程序編寫(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)題,部分程序如下
  1. void changeA(void);
  2. void changeB(void);
  3. while(1)
  4. {               
  5.         a=getchar();//接收第一個(gè)字符
  6.                 a=getchar();//確保接收成功
  7.                 b=getchar();//接收第二個(gè)字符
  8.         changeA ();//通過(guò)子程序?qū)⑦@個(gè)字符轉(zhuǎn)換成整形數(shù)
  9.                 changeB ();//通過(guò)子程序?qū)⑦@個(gè)字符轉(zhuǎn)換成整形數(shù)
  10.                 z=x*10+y; //第一個(gè)整形數(shù)為十位,第二個(gè)為個(gè)位,組成這個(gè)兩位數(shù)


  11. void changeA ()
  12. {
  13.                 switch(a)
  14.         {
  15.                  case '0': x=0;
  16.      break;
  17.      case '1': x=1;
  18.      break;
  19.      case '2': x=2;
  20.      break;
  21.      case '3': x=3;
  22.      break;
  23.      case '4': x=4;
  24.      break;
  25.      case '5': x=5;
  26.      break;
  27.      case '6': x=6;
  28.      break;
  29.      case '7': x=7;
  30.      break;
  31.         case '8': x=8;
  32.      break;
  33.         case '9': x=9;
  34.      break;        
  35.          }
  36.         }

  37. void changeB ()
  38.         {
  39.            switch(b)
  40.         {
  41.                  case '0': y=0;
  42.      break;
  43.      case '1': y=1;
  44.      break;
  45.      case '2': y=2;
  46.      break;
  47.      case '3': y=3;
  48.      break;
  49.      case '4': y=4;
  50.      break;
  51.      case '5': y=5;
  52.      break;
  53.      case '6': y=6;
  54.      break;
  55.      case '7': y=7;
  56.      break;
  57.         case '8': y=8;
  58.      break;
  59.         case '9': y=9;
  60.      break;        
  61.         }
  62. }
復(fù)制代碼
如何使得字符串與整形變量一并發(fā)出去?
    首先在編寫(xiě)STM32時(shí),printf函數(shù)只能定向在一個(gè)串口上,在調(diào)用其他串口發(fā)送數(shù)據(jù)時(shí),我們又怎么才能將一個(gè)字符串與一個(gè)實(shí)時(shí)變化的變量一并發(fā)送呢,在這里選擇直接組成數(shù)組,將數(shù)組發(fā)送出去,如下:
  1. void Sends(char *buf1);
  2. char A[10] = "";  //定義一個(gè)容量為10的數(shù)組
  3. while(1)

  4.   sprintf(A,"n1.val=%d",liusu);        //發(fā)送格式化輸出到 str 所指向的字符串
  5.   Sends(A);                     //發(fā)送數(shù)組

  6.                
  7. void Sends(char *buf1)                  //發(fā)送函數(shù)
  8. {
  9.         u8 i=0;
  10.         while(1)
  11.         {
  12.          if(buf1[i]!=0)
  13.                  {
  14.                         USART_SendData(USART3,buf1[i]);  //發(fā)送一個(gè)字節(jié)
  15.                         while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET){};//等待發(fā)送結(jié)束
  16.                          i++;
  17.                 }
  18.          else
  19.          return ;

  20.                 }
  21. }
復(fù)制代碼
五、成果部分
    實(shí)物主體部分
                            
    PC上位機(jī)界面
    下位機(jī)串口屏界面

全部資料51hei下載地址:
輸液監(jiān)測(cè)裝置.zip (13.05 MB, 下載次數(shù): 146)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏16 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:775899 發(fā)表于 2020-6-11 10:07 | 只看該作者
這個(gè)好!這個(gè)好!
回復(fù)

使用道具 舉報(bào)

板凳
ID:777315 發(fā)表于 2020-6-12 14:59 | 只看該作者
這個(gè)不錯(cuò),,當(dāng)時(shí)還做過(guò)一個(gè)這種傳感器。
回復(fù)

使用道具 舉報(bào)

地板
ID:795368 發(fā)表于 2020-11-23 15:39 | 只看該作者
能學(xué)以致用真好
回復(fù)

使用道具 舉報(bào)

5#
ID:1019158 發(fā)表于 2022-4-17 16:19 | 只看該作者
可以用51來(lái)代替32嗎?用51代替后期的傳輸會(huì)不會(huì)出問(wèn)題
回復(fù)

使用道具 舉報(bào)

6#
ID:997874 發(fā)表于 2024-5-6 20:28 | 只看該作者
msp432能滿(mǎn)足要求嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表