久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:291692 發(fā)表于 2019-12-8 01:25 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
   在這里記錄一下我正在進行中的小項目,也可供大家參考(能力有限,大佬勿噴)
   繼續(xù)之前的雛形,這次將它進行了完善,首先看一下設(shè)計的結(jié)構(gòu)圖

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

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

  

    顯示部分:HMI 串口屏

   

    語音輔助:M6語音識別播報模塊
        


    無線傳輸:nRF24L01轉(zhuǎn)ttl無線模塊


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

二、核心邏輯為:
    1、等待皮重輸入(因為在實際中藥液的容器分為很多規(guī)格,尤其是PVC型和玻璃型容器皮重差距太大,所以在監(jiān)測之前先進行皮重的輸入,本次程序預(yù)設(shè)了兩種皮重,并可以手動輸入皮重,用來后期進行消除)
    2、開始藥液監(jiān)測(本次使用的稱重傳感器量程為1kg精度為1g,所以采用了每隔一秒采集一次,計算流速、進度、倒計時數(shù)據(jù)的方法進行監(jiān)測,雖采樣率不高,但是應(yīng)用于本設(shè)計,還是適用的)
    3、數(shù)據(jù)的傳輸(本次采集到的流速、進度、倒計時等數(shù)據(jù)會實時體現(xiàn)在三個方面,第一是下位機串口屏幕上、第二是上位機的PC軟件中、第三是語音識別后的播報中)
三、重點問題與解決方案:
    如何通過測量藥液重量來實現(xiàn):流速、進度、倒計時等信息的獲取?
1、手動輸入或選用預(yù)設(shè)的皮重為 Z,這一步是為了消除容器的質(zhì)量
2、測量初始藥液重量(已去皮)為A,進入while循環(huán),測 現(xiàn)一秒的重量為B,下一秒的重量為C,以此類推,從而實現(xiàn)每隔一秒測一次重量
3、流速 = B – C 得到一個單位為 g/s 的 流速數(shù)值
4、進度百分比 = C*100/A 得到一個單位為 % 的 進度數(shù)值
5、C / 流速 = 倒計時 得到一個單位為 s 的 倒計時數(shù)值
    如何實現(xiàn)數(shù)據(jù)的無線傳輸與PC對多個下位機的數(shù)據(jù)接收?
    首先是在硬件的選擇上,選用了nRF24L01無線傳輸模塊,只需單片機通過串口向其發(fā)送數(shù)據(jù),但是為了實現(xiàn)PC端對多個下位機的數(shù)據(jù)接收,我選擇每個下位機都以一個八位字符串來進行發(fā)送數(shù)據(jù):1、2位為設(shè)備號, 3、4位為流速信息,5、6位為進度信息, 7、8位為倒計時信息。并且上位機軟件利用LabVIEW進行編寫,上位機開啟后會依次按順序?qū)Ω鱾下位機發(fā)送啟動信號,當下位機接到此信號則進行數(shù)據(jù)發(fā)送,在上位機處對這個八位字符串進行采集,截取,分割,根據(jù)1、2位設(shè)備號的不同,送入不同的條件分支中,再進行判斷與報警


四、程序編寫時遇到的困難與解決方案:
    如何使得一個發(fā)送來的兩位字符串轉(zhuǎn)換成數(shù)據(jù)變量形式參與運算?
    首先,我們的Keil5編譯軟件在編寫stm32時無法調(diào)用string等相關(guān)語法和函數(shù),因為它是C++的內(nèi)容,這就使得我們在編寫時根本無法定義一個字符串,也就是無法很簡單的一次接收多位字符串,并且這個字符串如果想?yún)⑴c運算時,必須轉(zhuǎn)換成其他變量才可以,否則將會自動轉(zhuǎn)為ASCII碼,在這里我利用了switch-case很方便的解決了這個問題,部分程序如下
  1. void changeA(void);
  2. void changeB(void);
  3. while(1)
  4. {               
  5.         a=getchar();//接收第一個字符
  6.                 a=getchar();//確保接收成功
  7.                 b=getchar();//接收第二個字符
  8.         changeA ();//通過子程序?qū)⑦@個字符轉(zhuǎn)換成整形數(shù)
  9.                 changeB ();//通過子程序?qū)⑦@個字符轉(zhuǎn)換成整形數(shù)
  10.                 z=x*10+y; //第一個整形數(shù)為十位,第二個為個位,組成這個兩位數(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ā)出去?
    首先在編寫STM32時,printf函數(shù)只能定向在一個串口上,在調(diào)用其他串口發(fā)送數(shù)據(jù)時,我們又怎么才能將一個字符串與一個實時變化的變量一并發(fā)送呢,在這里選擇直接組成數(shù)組,將數(shù)組發(fā)送出去,如下:
  1. void Sends(char *buf1);
  2. char A[10] = "";  //定義一個容量為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ā)送一個字節(jié)
  15.                         while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET){};//等待發(fā)送結(jié)束
  16.                          i++;
  17.                 }
  18.          else
  19.          return ;

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

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

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级视频 | 奇米视频777 | 欧美日韩一 | 欧美日韩在线免费 | 日本黄色的视频 | 国产精品久久久久一区二区三区 | 日韩免费高清视频 | 91网站在线看| 秋霞电影一区二区三区 | 成人欧美一区二区三区黑人孕妇 | 免费在线一区二区三区 | 一区二区三区小视频 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 色久伊人| 亚洲国产二区 | 激情网站在线观看 | 国产成人综合网 | 亚洲成人网在线 | 69性欧美高清影院 | www.久久.com | 中文字幕一区二区在线观看 | 免费的日批视频 | 亚洲视频第一页 | 日本久久久久久久久 | 一区二区高清 | 国产精品永久 | 精品久久久久一区二区国产 | 在线观看av网站 | 久一久| 久久国产一区二区三区 | 国产精品久久久久久久久久软件 | 精品国产欧美 | 日日爽| 日本精品一区二区三区视频 | 国产精品一区在线 | 中文字幕欧美日韩一区 | 国产综合视频 | 日日操av| 成人性视频免费网站 | 国产精品成人一区 | 一级做a爰片性色毛片视频停止 |