HX711压力传感器(基于STM32F103C8T6)
文章目錄
- 前言
- 一、軟件思路
- 二、軟件代碼
- 1.HX711模塊代碼
- 2.主函數
- 總結
前言
HX711模塊是我們目前比較常見的壓力傳感器模塊,主要的作用是用來做壓力檢測,重量監測等等。博主的這篇博文主要實現功能為,在對重量或者壓力進行監測的同時,可以累加或者清零數值,在此基礎上就可以對比如飲水量進行統計等等。
HX711模塊是市面上比較常見的模塊,通用型的。用的主控芯片是STM32F103C8T6,其他芯片也可兼容,只需要移植HX711模塊的c文件和h文件即可,里面有詳細調用的函數。
一、軟件思路
明確一下目標需求,需要實現稱重以及清零累加的功能。那勢必要用到按鍵模塊和HX711模塊,其中通過HX711模塊監測當前的壓力或者重量,通過按鍵模塊實現數據的清零或者累加。初始化HX711模塊以后,就可以調用HX711模塊內部的函數獲取當前的重量。通過判斷當前重量與上一次測量重量的差別判斷。若稱體重的話,則初始化執行去皮函數,去皮函數的功能就是把當前的重量設置為初始化重量,這樣相當于設置一個基準點。
二、軟件代碼
1.HX711模塊代碼
代碼如下:如下圖所示,這為HX711代碼,這里面需要根據不同的HX711模塊定義了一個校正參數GapValue,通過改變校正參數的大小,就可以矯正好自己的模塊。在C文件的最后表明了校正的步驟,根據此步驟校正即可。需要注意的就是代碼中的get_maopi和get_weight函數,前者在代碼初始化的時候執行,獲得當前的重量。由于本次設計是計算每天的飲水量,由于水1L大概為1KG,可以對應起來。在開始之前,將滿水放在壓力傳感器上,這樣初始化時水量代表的就是還未開始喝的水,等喝了水以后再放到壓力傳感器上,進行一次按鍵判斷累加,這樣就可以得到我們的飲水量。在這個基礎上修改的話,可以用來測物體總重量,需要修改的地方就是if(HX711_Buffer <= Weight_Maopi)這一塊,首先變成>=,其次這個Weight_Shiwu = Weight_Maopi-Weight_Shiwu其中的減號變成加號即可。
#include "HX711.h" #include "delay.h"u32 HX711_Buffer; u32 Weight_Maopi; s32 Weight_Shiwu; u8 Flag_Error=0;//校準參數 //因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里這個參數才能使測量值很準確。 //當發現測試出來的重量偏大時,增加該數值。 //如果測試出來的重量偏小時,減小改數值。 //該值可以為小數 #define GapValue 106.5void Init_HX711pin(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PF端口時鐘//HX711_SCKGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHzGPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化GPIOB//HX711_DOUTGPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //輸入上拉GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_0); //初始化設置為0 }u32 HX711_Read(void) //增益128 {unsigned long count; unsigned char i; HX711_DOUT=1; delay_us(1);HX711_SCK=0; count=0; while(HX711_DOUT); for(i=0;i<24;i++){ HX711_SCK=1; count=count<<1; delay_us(1);HX711_SCK=0; if(HX711_DOUT)count++; delay_us(1);} HX711_SCK=1; count=count^0x800000;//第25個脈沖下降沿來時,轉換數據delay_us(1);HX711_SCK=0; return(count); }void Get_Maopi(void) {Weight_Maopi = HX711_Read(); } //**************************************************** //稱重 //**************************************************** void Get_Weight(void) {HX711_Buffer = HX711_Read();if(HX711_Buffer <= Weight_Maopi) {Weight_Shiwu = HX711_Buffer;Weight_Shiwu = Weight_Maopi-Weight_Shiwu; //獲取實物的AD采樣數值。 Weight_Shiwu = (s32)((float)Weight_Shiwu/GapValue); //計算實物的實際重量//因為不同的傳感器特性曲線不一樣,因此,每一個傳感器需要矯正這里的GapValue這個除數。//當發現測試出來的重量偏大時,增加該數值。//如果測試出來的重量偏小時,減小改數值。} } #ifndef __HX711_H #define __HX711_H#include "sys.h"#define HX711_SCK PBout(0)// PB0 #define HX711_DOUT PBin(1)// PB1extern void Init_HX711pin(void); extern u32 HX711_Read(void); extern void Get_Maopi(void); extern void Get_Weight(void);extern u32 HX711_Buffer; extern u32 Weight_Maopi; extern s32 Weight_Shiwu; extern u8 Flag_Error;#endif2.主函數
代碼如下:首先在函數內部定義了zong參量,代表監測的飲水量。定義了工作的狀態參數,檢測工作狀態,工作狀態為0的時候不檢測,為1的時候檢測。除初始化函數意外,還執行了get_maopi函數,主要是為了初始化狀態,復位。進入while循環里面對按鍵進行掃描,KEY0按鍵實現的功能是直接清零,直接清零的意思是把當前的重量作為飲水的起始點,同時對zong飲水量進行清零處理,當執行完這一步以后,工作狀態切換為1,始終保持掃描飲水量的狀態。KEY1按鍵實現的功能是進行飲水量的累加,具體實現機理就是把當前的飲水量累加到zong變量上,同時工作狀態設置為0,不再進行累加,便于換水。那么想繼續進行累加則通過KEY2進行實現,KEY2設置以后,把當前的飲水量設置為初始飲水量,同時工作狀態也設置為1,相當于重新進行了一次初始化但是并未對zong進行清零,在此基礎上就實現了飲水量的測量。
#include "stm32f10x.h" #include "delay.h" #include "HX711.h" #include "usart.h" #include "key.h" u32 zong=0; //總的飲水量 u8 gongzuo_status=1;//檢測狀態,0的時候不檢測,1的時候檢測 /* KEY0的作用是初始化稱重目標,比如按下KEY0就代表此時的重量成了我們還沒喝水時候的重量 KEY1的作用是累加飲水量,按一下保存當前的飲水量,然后按下KEY0繼續開始繼續檢測 */ int main(void) { u8 key=0; //定義按鍵掃描狀態 Init_HX711pin(); //HX711傳感器初始化KEY_Init(); //按鍵初始化delay_init(); //延時初始化NVIC_Configuration(); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級uart_init(9600); //串口初始化為9600Get_Maopi(); //稱取初始化狀態,此狀態下可獲得最開始的值delay_ms(1000);delay_ms(1000);Get_Maopi(); //重新獲取初始化狀態while(1){key=KEY_Scan(0);if(key==KEY0_PRES) //判斷KEY0按鍵按下{delay_ms(20);if(key==KEY0_PRES){Get_Maopi(); //設置當前重量為初始重量zong=0; //清空飲水量,重新進行計算gongzuo_status=1; }}else if(key==KEY1_PRES)//判斷KEY1按鍵按下{delay_ms(20);if(key==KEY1_PRES){zong+=Weight_Shiwu;//設置當前飲水量給總體gongzuo_status=0; //工作狀態為0}}else if(key==KEY2_PRES)//判斷KEY2按鍵按下{delay_ms(20);if(key==KEY2_PRES){Get_Maopi(); //設置當前重量為初始重量gongzuo_status=1; //工作狀態為1}}if(gongzuo_status==0)Weight_Shiwu=0; //如果工作狀態為0,則檢測到的飲水量一直為0else Get_Weight(); //如果工作狀態為1,則檢測飲水量大小printf("飲水量 = %d mL\r\n",(zong+Weight_Shiwu)); //打印總水量 delay_ms(1000);} }該處使用的url網絡請求的數據。
總結
實測無誤,大家可以放心使用,但請大家針對自己的適用環境進行適當的修改,避免出現bug。
總結
以上是生活随笔為你收集整理的HX711压力传感器(基于STM32F103C8T6)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitHub上标星95k+超牛的《Jav
- 下一篇: 视频教程-清华-尹成老师-Python爬