HX711压力传感器(基于STM32F103C8T6)
文章目錄
- 前言
- 一、軟件思路
- 二、軟件代碼
- 1.HX711模塊代碼
- 2.主函數(shù)
- 總結(jié)
前言
HX711模塊是我們目前比較常見(jiàn)的壓力傳感器模塊,主要的作用是用來(lái)做壓力檢測(cè),重量監(jiān)測(cè)等等。博主的這篇博文主要實(shí)現(xiàn)功能為,在對(duì)重量或者壓力進(jìn)行監(jiān)測(cè)的同時(shí),可以累加或者清零數(shù)值,在此基礎(chǔ)上就可以對(duì)比如飲水量進(jìn)行統(tǒng)計(jì)等等。
HX711模塊是市面上比較常見(jiàn)的模塊,通用型的。用的主控芯片是STM32F103C8T6,其他芯片也可兼容,只需要移植HX711模塊的c文件和h文件即可,里面有詳細(xì)調(diào)用的函數(shù)。
一、軟件思路
明確一下目標(biāo)需求,需要實(shí)現(xiàn)稱重以及清零累加的功能。那勢(shì)必要用到按鍵模塊和HX711模塊,其中通過(guò)HX711模塊監(jiān)測(cè)當(dāng)前的壓力或者重量,通過(guò)按鍵模塊實(shí)現(xiàn)數(shù)據(jù)的清零或者累加。初始化HX711模塊以后,就可以調(diào)用HX711模塊內(nèi)部的函數(shù)獲取當(dāng)前的重量。通過(guò)判斷當(dāng)前重量與上一次測(cè)量重量的差別判斷。若稱體重的話,則初始化執(zhí)行去皮函數(shù),去皮函數(shù)的功能就是把當(dāng)前的重量設(shè)置為初始化重量,這樣相當(dāng)于設(shè)置一個(gè)基準(zhǔn)點(diǎn)。
二、軟件代碼
1.HX711模塊代碼
代碼如下:如下圖所示,這為HX711代碼,這里面需要根據(jù)不同的HX711模塊定義了一個(gè)校正參數(shù)GapValue,通過(guò)改變校正參數(shù)的大小,就可以矯正好自己的模塊。在C文件的最后表明了校正的步驟,根據(jù)此步驟校正即可。需要注意的就是代碼中的get_maopi和get_weight函數(shù),前者在代碼初始化的時(shí)候執(zhí)行,獲得當(dāng)前的重量。由于本次設(shè)計(jì)是計(jì)算每天的飲水量,由于水1L大概為1KG,可以對(duì)應(yīng)起來(lái)。在開(kāi)始之前,將滿水放在壓力傳感器上,這樣初始化時(shí)水量代表的就是還未開(kāi)始喝的水,等喝了水以后再放到壓力傳感器上,進(jìn)行一次按鍵判斷累加,這樣就可以得到我們的飲水量。在這個(gè)基礎(chǔ)上修改的話,可以用來(lái)測(cè)物體總重量,需要修改的地方就是if(HX711_Buffer <= Weight_Maopi)這一塊,首先變成>=,其次這個(gè)Weight_Shiwu = Weight_Maopi-Weight_Shiwu其中的減號(hào)變成加號(hào)即可。
#include "HX711.h" #include "delay.h"u32 HX711_Buffer; u32 Weight_Maopi; s32 Weight_Shiwu; u8 Flag_Error=0;//校準(zhǔn)參數(shù) //因?yàn)椴煌膫鞲衅魈匦郧€不是很一致,因此,每一個(gè)傳感器需要矯正這里這個(gè)參數(shù)才能使測(cè)量值很準(zhǔn)確。 //當(dāng)發(fā)現(xiàn)測(cè)試出來(lái)的重量偏大時(shí),增加該數(shù)值。 //如果測(cè)試出來(lái)的重量偏小時(shí),減小改數(shù)值。 //該值可以為小數(shù) #define GapValue 106.5void Init_HX711pin(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PF端口時(shí)鐘//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); //根據(jù)設(shè)定參數(shù)初始化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); //初始化設(shè)置為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個(gè)脈沖下降沿來(lái)時(shí),轉(zhuǎn)換數(shù)據(jù)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; //獲取實(shí)物的AD采樣數(shù)值。 Weight_Shiwu = (s32)((float)Weight_Shiwu/GapValue); //計(jì)算實(shí)物的實(shí)際重量//因?yàn)椴煌膫鞲衅魈匦郧€不一樣,因此,每一個(gè)傳感器需要矯正這里的GapValue這個(gè)除數(shù)。//當(dāng)發(fā)現(xiàn)測(cè)試出來(lái)的重量偏大時(shí),增加該數(shù)值。//如果測(cè)試出來(lái)的重量偏小時(shí),減小改數(shù)值。} } #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.主函數(shù)
代碼如下:首先在函數(shù)內(nèi)部定義了zong參量,代表監(jiān)測(cè)的飲水量。定義了工作的狀態(tài)參數(shù),檢測(cè)工作狀態(tài),工作狀態(tài)為0的時(shí)候不檢測(cè),為1的時(shí)候檢測(cè)。除初始化函數(shù)意外,還執(zhí)行了get_maopi函數(shù),主要是為了初始化狀態(tài),復(fù)位。進(jìn)入while循環(huán)里面對(duì)按鍵進(jìn)行掃描,KEY0按鍵實(shí)現(xiàn)的功能是直接清零,直接清零的意思是把當(dāng)前的重量作為飲水的起始點(diǎn),同時(shí)對(duì)zong飲水量進(jìn)行清零處理,當(dāng)執(zhí)行完這一步以后,工作狀態(tài)切換為1,始終保持掃描飲水量的狀態(tài)。KEY1按鍵實(shí)現(xiàn)的功能是進(jìn)行飲水量的累加,具體實(shí)現(xiàn)機(jī)理就是把當(dāng)前的飲水量累加到zong變量上,同時(shí)工作狀態(tài)設(shè)置為0,不再進(jìn)行累加,便于換水。那么想繼續(xù)進(jìn)行累加則通過(guò)KEY2進(jìn)行實(shí)現(xiàn),KEY2設(shè)置以后,把當(dāng)前的飲水量設(shè)置為初始飲水量,同時(shí)工作狀態(tài)也設(shè)置為1,相當(dāng)于重新進(jìn)行了一次初始化但是并未對(duì)zong進(jìn)行清零,在此基礎(chǔ)上就實(shí)現(xiàn)了飲水量的測(cè)量。
#include "stm32f10x.h" #include "delay.h" #include "HX711.h" #include "usart.h" #include "key.h" u32 zong=0; //總的飲水量 u8 gongzuo_status=1;//檢測(cè)狀態(tài),0的時(shí)候不檢測(cè),1的時(shí)候檢測(cè) /* KEY0的作用是初始化稱重目標(biāo),比如按下KEY0就代表此時(shí)的重量成了我們還沒(méi)喝水時(shí)候的重量 KEY1的作用是累加飲水量,按一下保存當(dāng)前的飲水量,然后按下KEY0繼續(xù)開(kāi)始繼續(xù)檢測(cè) */ int main(void) { u8 key=0; //定義按鍵掃描狀態(tài) Init_HX711pin(); //HX711傳感器初始化KEY_Init(); //按鍵初始化delay_init(); //延時(shí)初始化NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)uart_init(9600); //串口初始化為9600Get_Maopi(); //稱取初始化狀態(tài),此狀態(tài)下可獲得最開(kāi)始的值delay_ms(1000);delay_ms(1000);Get_Maopi(); //重新獲取初始化狀態(tài)while(1){key=KEY_Scan(0);if(key==KEY0_PRES) //判斷KEY0按鍵按下{delay_ms(20);if(key==KEY0_PRES){Get_Maopi(); //設(shè)置當(dāng)前重量為初始重量zong=0; //清空飲水量,重新進(jìn)行計(jì)算gongzuo_status=1; }}else if(key==KEY1_PRES)//判斷KEY1按鍵按下{delay_ms(20);if(key==KEY1_PRES){zong+=Weight_Shiwu;//設(shè)置當(dāng)前飲水量給總體gongzuo_status=0; //工作狀態(tài)為0}}else if(key==KEY2_PRES)//判斷KEY2按鍵按下{delay_ms(20);if(key==KEY2_PRES){Get_Maopi(); //設(shè)置當(dāng)前重量為初始重量gongzuo_status=1; //工作狀態(tài)為1}}if(gongzuo_status==0)Weight_Shiwu=0; //如果工作狀態(tài)為0,則檢測(cè)到的飲水量一直為0else Get_Weight(); //如果工作狀態(tài)為1,則檢測(cè)飲水量大小printf("飲水量 = %d mL\r\n",(zong+Weight_Shiwu)); //打印總水量 delay_ms(1000);} }該處使用的url網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)。
總結(jié)
實(shí)測(cè)無(wú)誤,大家可以放心使用,但請(qǐng)大家針對(duì)自己的適用環(huán)境進(jìn)行適當(dāng)?shù)男薷?#xff0c;避免出現(xiàn)bug。
總結(jié)
以上是生活随笔為你收集整理的HX711压力传感器(基于STM32F103C8T6)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: GitHub上标星95k+超牛的《Jav
- 下一篇: ArcGIS城市建筑日照分析