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

news2024/9/27 3:06:50

一、HX711模块介绍

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

二、HX711模块原理图

在这里插入图片描述

三、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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2125891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交叉熵函数与kl散度的区别

公式上的区别 手动计算的方式展示如何实现这两个损失函数 交叉熵损失函数 import torch import torch.nn.functional as F# 模型的输出 logits 和真实标签 target logits torch.tensor([[2.0, 0.5, 0.1], [0.3, 2.5, 0.8]], requires_gradTrue) target torch.tensor([0, 1])…

测试开发基础——软件测试中的bug

二、软件测试中的Bug 1. 软件测试的生命周期 软件测试贯穿于软件的整个生命周期 需求分析 测试计划 测试设计与开发 测试执行 测试评估 上线 运行维护 用户角度&#xff1a;软件需求是否合理 技术角度&#xff1a;技术上是否可行&#xff0c;是否还有优化空间 测试角度…

某郊到家:互联网时代下的按摩服务革新

在快速发展的时代背景下&#xff0c;一群具有前瞻性的企业家在2018年勇敢地进军了按摩服务行业&#xff0c;引领了一场对传统模式的革新。他们不仅在竞争激烈的市场中站稳脚跟&#xff0c;还成功地在不断变化的市场环境中确立了自己的位置。 创新的商业模式和持续的努力&#x…

【2024】前端学习笔记2-有序列表-无序列表-描述列表

学习笔记 有序列表:ol基本使用:嵌套使用扩展:使用CSS改变序号类型无序列表:ul基本使用扩展:使用CSS改变符号类型扩展:使用CSS定制列表样式描述列表:dl基本使用扩展:使用CSS定制类型格式总结有序列表:ol 有序列表由<ol>标签包裹一组<li>(列表项)标签组成…

区块链之变:揭秘Web3对互联网的全面改变

随着技术的进步&#xff0c;区块链 逐渐从一个相对小众的概念演变为重塑互联网结构的核心力量。特别是 Web3 的兴起&#xff0c;标志着互联网进入了一个新的发展阶段。这一变革不仅仅是技术的升级&#xff0c;更是对互联网功能、数据控制和用户体验的全面重新定义。本文将详细探…

数学建模笔记—— 回归分析

数学建模笔记—— 回归分析 回归分析1. 回归分析的一般步骤2. 一元线性回归分析2.1 具体过程2.1.1 确定回归方程中的解释变量和被解释变量2.1.2 确定回归模型和建立回归方程2.1.3 利用回归直线进行估计和预测2.1.4 对回归方程进行各种检验(补充)1. 回归直线的拟合优度2. 显著性…

哪款提醒软件能清晰展示每日工作任务?

在快节奏的工作环境中&#xff0c;每天的工作任务堆积如山&#xff0c;如何有效地整理和清晰查看这些任务&#xff0c;成为了提高工作效率的关键。一款优秀的提醒软件能够帮助我们将任务条理化&#xff0c;确保每一项工作都能按时完成。 敬业签就是这样一款能够清晰展示每日工…

VR 尺寸美学主观评价-解决方案-现场体验研讨会报名

棣拓科技VR创新解决方案助力尺寸美学所见即所得! 诚邀各位行业专家莅临指导交流 请扫描海报二维码踊跃报名&#xff0c;谢谢 中国上海 2024.10.25 亮点介绍 1、通过精湛渲染技术&#xff0c;最真实展现设计效果&#xff0c;并通过VR设备一比一比例进行展现。 2、设置相关设…

suid提权的环境搭建+反弹shell

SUID&#xff08;Set User ID&#xff09;是一种特殊的文件权限设置&#xff0c;它允许文件在执行时具有文件所有者的权限。当具有SUID权限的文件被执行时&#xff0c;执行该文件的用户会暂时获得文件所有者的权限。这种权限通常用于需要高权限操作的程序&#xff0c;如‌passw…

建筑用能该如何统一管理?水电气集抄太麻烦?!看看这个吧!建筑能耗分析管理系统 您的运维“好帮手”

安科瑞刘鸿鹏 随着工业化和信息化进程的加速&#xff0c;企业对能源管理的需求愈加迫切。安科瑞电气股份有限公司推出的Acrel-5000能耗管理系统运用物联网技术&#xff0c;实时采集电表、水表、燃气表等能源计量仪表的数据&#xff0c;并结合大数据技术进行处理和存储。该平台旨…

uniapp(H5)设置反向代理,设置成功后页面报错

设置反向代理后&#xff0c;页面报错图&#xff1a; 反向代理代码&#xff1a;devServer下面就是配置对应的代理&#xff0c;一般这样就没问题了 "h5": {"router": {"mode": "hash"},"devServer": {"port": 517…

基于SpringBoot+Vue的古诗词学习软件系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的古诗词学…

9月编程排行榜来了!C语言跌至历史最低!

9月的编程语言排行榜终于出炉&#xff0c;令人意外的是&#xff0c;曾经风靡全球、无数开发者的首选——C语言&#xff0c;竟然跌到了历史最低点&#xff01;这一变化引发了整个编程社区的广泛关注和讨论。 大家周三好呀&#xff01;又来到金秋九月&#xff0c;又到了TIOBE编程…

【MATLAB源码-第264期】基于matlab的跳频通信系统仿真,采用MSK调制方式,差分解调;输出误码率曲线和各节点波形图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 跳频通信系统是一种能够提高通信抗干扰能力的技术&#xff0c;它通过在传输过程中不断地改变载波频率来避开干扰或者窃听。在这套跳频通信系统中&#xff0c;我们采用了最小频移键控&#xff08;MSK&#xff09;作为调制方式…

Jenkins 详解,几分钟学会,自动编译/部署/发布软件

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们详细讨论Jenkins。 随着互联网应用越来越多&#xff0c;系统规模也越来越大&#xff0c;DevOps、CI/CD等概念也被重视起来&#xff0c;持续交付/持续集成/自动化部署等理念也被越来越多的团队接受。 而本期介绍的Jenkin…

智能交通(三)——Elsevier特刊推荐

特刊征稿 01 期刊名称&#xff1a; Vehicular Communications 特刊名称&#xff1a; Computational Aspects of Vehicular Networks 截止时间&#xff1a; 论文提交日期:2024年7月21日 录用通知:2024年9月30日 期末论文:2024年10月30日 目标及范围&#xff1a; 主题包括…

windows10下本机FTP服务搭建教程

文章目录 前言一、FTP服务器简介二、开启FTP服务站点&#xff08;所有用户可访问&#xff09;1.安装FTP服务2.配置FTP服务器3.本机访问ftp服务 三、开启FTP服务站点&#xff08;指定用户可访问&#xff09;1.创建本地用户2.添加FTP站点3.本机访问ftp服务 总结 前言 ftp服务器主…

Linux——分离部署,分化压力

PQS/TPS 每秒请求数/ 每秒事务数 // 流量衡量参数 可以根据预估QPS 和 服务器的支持的最高QPS 对照计算 就可以得出 需要上架的服务器的最小数量 PV 页面浏览数 UV 独立用户访问量 // 对于网站的总体访问量 response time 响应时间 // 每个请求的响应时间…

828华为云征文 | Flexus X实例与Harbor私有镜像仓库的完美结合

前言 华为云828企业上云节&#xff0c;Flexus X实例携手Harbor私有镜像仓库&#xff0c;共创云上安全高效新生态&#xff01;Flexus X以其卓越性能与稳定性&#xff0c;为Harbor提供了理想的运行环境。Harbor作为领先的私有镜像仓库&#xff0c;与Flexus X完美结合&#xff0c;…

[OpenGL]使用OpenGL绘制三角形

一、简介 本文介绍了如何在linux/win(wsl2)环境下&#xff0c;使用GLFWGLAD实现绘制三角形。 本文内容基本根据LearnOpengGL-入门-你好&#xff0c;三角形整理完成&#xff0c;读者也可以参考LearnOpengGL-入门-你好&#xff0c;三角形自行学习如何使用OpenGL绘制三角形。 按…