首页 > 编程语言 >stm32驱动HX711称重传感器 c++代码分享

stm32驱动HX711称重传感器 c++代码分享

时间:2024-09-14 18:26:33浏览次数:3  
标签:rt return HX711 c++ stm32 Hx711 sckPin uint32


一、HX711模块介绍

HX711模块是一种专门用于称重传感器的放大器模块。它的主要功能是将测得的微小电压信号放大到可以被微控制器读取的范围。
HX711模块通常配合称重传感器一起使用,例如压力传感器、负载细胞等。它采用24位的模数转换器(ADC)来精确测量传感器的电压变化。
HX711模块具有一对不平衡式差分输入端,可以通过将感应器连接到这对输入端来测量称重传感器的变化。它还包含一个可变增益放大器,可以根据需要调整放大倍数,以适应不同的测量范围。
该模块通过I2C或SPI接口与微控制器通信,可以实现数据传输和命令控制。通过读取HX711模块输出的测量值,可以获取准确的称重数据。
HX711模块通常被广泛应用于电子秤、压力传感器、称重传感器等领域,用于测量和计量各类物体的重量。它具有高精度、低功耗、稳定性好等特点,适用于各种工业和消费类电子设备。

二、HX711模块原理图

stm32驱动HX711称重传感器 c++代码分享_嵌入式硬件

三、C++源码

hx711.hpp

/************************************************* 
* @copyright: 
* @author:Xupeng
* @date:2022-11-03
* @description: 
**************************************************/  
#ifndef _HX711_HPP_
#define _HX711_HPP_

#include "main_value.h"

class Hx711
{
public:
    Hx711(char *name,int sckPin = -1,int sdaPin = -1);
    ~Hx711();
	uint32_t adcRead();
    uint32_t getFurWeight();
    uint32_t getWeight(uint32_t furWeight);	               //称重函数
	void setCalibrationValue(float val);
private:
    int sckPin = -1;
    int sdaPin = -1;
	const static uint8_t NAME_MAX_NUM = 20;
	char name[NAME_MAX_NUM];
	float	calibrationValue = 384.7;       //标定系数,根据自己的传感器调节
};
#endif

hx711.cpp

/************************************************* 
* @copyright: 
* @author:Xupeng
* @date:2022-11-03
* @description: 
**************************************************/  
#include "hx711.hpp"


#define DBG_TAG "hx711"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
/************************************************* 
* @function:Hx711::Hx711(char *name,int sckPin, int sdaPin)       
* @description:HX711构造函数
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
Hx711::Hx711(char *name,int sckPin, int sdaPin)
    :sckPin(sckPin)
    ,sdaPin(sdaPin)
{
	memset(this->name,0x00,this->NAME_MAX_NUM);
	strncpy(this->name,name,this->NAME_MAX_NUM);
	
	if(sckPin == -1 || sdaPin == -1)
	{
		LOG_E("pin value invald!");
		return;
	}
	
	rt_pin_mode(this->sckPin,PIN_MODE_OUTPUT);
	rt_pin_mode(this->sdaPin,PIN_MODE_INPUT);

}
/************************************************* 
* @function:Hx711::~Hx711()    
* @description:HX711析构函数
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
Hx711::~Hx711()
{
}
/************************************************* 
* @function:Hx711::~Hx711()    
* @description:HX711析构函数
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
uint32_t Hx711::adcRead()
{
	unsigned long count; 
	unsigned char i; 
	unsigned char over = 10;

  	rt_pin_write(this->sckPin,PIN_LOW);
  	count=0; 
  	while(rt_pin_read(this->sdaPin) && over >0)
	{
		over --;
		rt_thread_mdelay(2);
	};
	rt_hw_us_delay(2);
  	for(i=0;i<24;i++)
	{ 
	  	rt_pin_write(this->sckPin,PIN_HIGH);
	  	count=count<<1; 
		rt_hw_us_delay(2);
		rt_pin_write(this->sckPin,PIN_LOW);
	  	if(rt_pin_read(this->sdaPin))
			count++; 
		rt_hw_us_delay(2);
	} 
 	rt_pin_write(this->sckPin,PIN_HIGH);
    count=count^0x800000;//第25个脉冲下降沿来时,转换数据
	rt_hw_us_delay(2);
	rt_pin_write(this->sckPin,PIN_LOW);
	return(count);
}
/************************************************* 
* @function:uint32_t Hx711::getFurWeight()
* @description:获取毛皮重量
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
uint32_t Hx711::getFurWeight()
{
	const uint8_t MEDIAN_LEN=5,MEDIAN=3;              //中值滤波参数,冒泡排序法
	uint32_t   buffer[MEDIAN_LEN];                //储存数组
	uint32_t readData,furWeight,num;           				
	uint8_t i,medleng = 0;
	for(i=0;i<MEDIAN_LEN;i++)
	{
		readData=this->adcRead();	        	   
		if(medleng == 0)                           //第1个元素,直接放入,不需要排序
		{ 
			buffer[0] = readData;
			medleng = 1; 
		}
		else                            	           //中值滤波,取中间值,冒泡排序法
		{  
			for(i = 0; i < medleng; i ++)  
			{
				if( buffer[i] > readData) 	          
				{ 
					num = readData; readData = buffer[i]; buffer[i] = num;
				}
			}
			buffer[medleng] = readData;          	
			medleng++;
		}		
		if(medleng >= MEDIAN_LEN) 		           
		{
			readData = buffer[MEDIAN];	            //取排序好的中间值,
			medleng = 0; 
		}
	}
	furWeight=readData;      
	return furWeight;
}
/************************************************* 
* @function:uint32_t Hx711::getWeight(uint32_t furWeight)     
* @description:获取重量
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
uint32_t Hx711::getWeight(uint32_t furWeight)
{
	uint32_t readWeight;
	uint32_t weight;
	
	readWeight = this->adcRead();		            //HX711数据采集函数
	if(readWeight>furWeight)
	{
		//readWeight=this->adcRead();			                  //重新采集HX711数据					 														   
		weight=(uint32_t)(((float)(readWeight-furWeight))/this->calibrationValue);//修改标定系数,根据传感器不同
	}
	else				
		weight=0;
	return weight;
}
/************************************************* 
* @function:void Hx711::setCalibrationValue(float val)
* @description:设定标定参数
* @calls:          
* @input:                    
* @return:       
* @others:       
*************************************************/ 
void Hx711::setCalibrationValue(float val)
{
	this->calibrationValue = val;
}


标签:rt,return,HX711,c++,stm32,Hx711,sckPin,uint32
From: https://blog.51cto.com/u_14244693/12018158

相关文章

  • C++ 顶层const底层const
    inti=0;int*constpl=&i;//不能改变p1的值,这是一个顶层constconstintci=42;//不能改变ci的值,这是一个顶层constconstint*p2=&ci;//允许改变p2的值,这是一个底层constconstint*constp3=p2;//靠右的const是顶层const,靠左的是底层constconstin......
  • c++临时对象导致的生命周期问题
    对象的生命周期是c++中非常重要的概念,它直接决定了你的程序是否正确以及是否存在安全问题。今天要说的临时变量导致的生命周期问题是非常常见的,很多时候没有一定经验甚至没法识别出来。光是我自己写、review、回答别人的问题就犯了或者看到了许许多多这类问题,所以我想有必要......
  • c++类和对象(3):默认成员函数(下)
    1.拷贝构造函数如果⼀个构造函数的第⼀个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。c++规定:类类型的传值传参必须用拷贝构造1.1拷贝构造函数的特点1.拷贝构造函数是构造函数的⼀个重载......
  • 南沙C++noip老师解一本通题: 1360:奇怪的电梯(lift)
    ​【题目描述】大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字Ki(0≤=Ki≤=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:33125代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4......
  • STM32CubeIDE看门狗
    看门狗简介看门狗:本质是一个递减的计数器当程序有BUG或硬件问题导致的程序卡死或跑飞时,看门狗可及时复位程序作用:防止程序卡死或程序跑飞,保证系统的可靠性和稳定性STM32有独立看门狗(IWDG)和窗口看门狗(WWDG)两种类型独立看门狗:独立工作,对时间精度要求较低窗口看门狗:时间精......
  • 【关于c++模版类的报错问题】
    关于c++模版类的报错问题模版类的定义使用类模板模版类的定义通常在实现一个类时,会在.h头文件中声明函数,在.cpp文件中实现该函数。然而如果是模版类的话情况则会稍有不同。这是一个名为debug.h的头文件,里面包含了一个名为A的模版类类A的实现在debug.hpp中,模板类的......
  • ubuntu下stlink烧录stm32代码
    ubuntu下stlink烧录stm32代码,记录备忘0、环境一、下载stlink驱动 二、编译  三、安装stlink驱动 四、验证安装成功 usb口接stlink后,查到设备五、烧录 六、其它  ......
  • C++STL~~stack&queue
    文章目录stack&queue的概念stack&queue的使用stack&queue的练习总结stack&queue的概念stack(栈)概念和特点栈是一种后进先出(LastInFirstOut,LIFO)的数据结构。就像一叠盘子,最后放上去的盘子最先被拿走。queue(队列)概念和特点队列是一种先进先出(FirstInFirstO......
  • STM32F103C8T6新建工程
    一、建立工程文件夹,keil中新建工程,选择型号首先在桌面新建一个STM32project的工程,以后我们的工程都存在这个文件夹下面,这样比较方便管理。 接下来双击keil5运行,点击Project中的NewuVisionProject。 接下来,在之前新建好的STM32Project中,新建2-1moban文件夹,在它里面来存放......
  • C++——类与对象(三)
    目录引言类型转换1.类型转换2.explicit关键字static成员1.static静态成员变量2.static静态成员函数3.访问静态成员变量的方法3.1 静态成员变量为公有3.2静态成员变量为私有友元1.友元函数2.友元类内部类匿名对象对象拷贝时的编译器优化1.类型转换2.传值......