找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15786|回复: 16
收起左侧

DIY Arduino+hx711精密珠宝电子称源程序与资料分享

  [复制链接]
ID:400702 发表于 2018-9-20 20:17 | 显示全部楼层 |阅读模式
里面包括各个模块的电路连接方式,
开发板跟AD转换模块的连接,
开发板跟液晶显示屏的连接,
传感器跟AD模块的连接,
各个模块的原理图
电子秤的开发代码
0.png 0.png

DIY ARDUINO精密珠宝电子称

1.    项目介绍:

电子秤从其原理来讲,就是根据金属受力以后的微弱形变来计算其受力的大小,算是《材料力学》第一节实验课就会接触到的内容。而测量金属的微弱形变最常用的就是应变片。在典型的应用中,通过材料表面不同方位,不同角度贴附的应变片,就可以测量出当前材料所受到拉弯扭的力。
当然,作个开源的电子秤没有这么复杂,一方面有称重的模块,另一方面还有称重专用的AD芯片(hx711),再加上Arduino和对应library库,很简单。
因为AD模块的输出和重量在模块量程内为线性的关系,所以基本就是一个调整比例系数和偏移量的问题。在类库中还对测量值进行了均值处理,让输出更加稳定。3kg的模块,基本可以达到+/- 0.2g的精度,对于一般的应用是足够了。而称重模块的应用也不限于此,用来进行一些对敲击力度的测量,相信也没什么问题。

科易互动机器人
电子秤组装手册




电子秤的包括亚克力板、Arduino UNO 主板、l602I2C液晶、称重传感器、HX711模块。这些零部件需要按照一定的顺序组装起来,才能实现电子称的基本要求。安装也有一些难度,大家在安装的时候一定要注意一些细节,清楚哪一个零部件安装在哪一部分。
  • 安装底座和Arduino UNO 控制板:
     我们先把亚克力板上的保护纸剥去,不剥掉实在有点难看。在配送的螺丝和铜柱中拿出那三根长的铜柱安装在底板最边的三个孔上(底板上有七个螺丝孔),固定后将Arduino UNO 控制板也用螺丝固定在底座上。
   
2.安装主要零部件
  主要零部件有1602、HX711和称重传感器。先将称重模块用螺丝固定在中间层的亚克力板上(上面有两个方孔),不过,要注意的是,在亚克力和称重传感器之间还要垫一块亚克力板,这一小块亚克力是必须要放置的,将直接影响电子称安装的。

接下来就把固定好的亚克力连接到底座上:


完成后就把1602液晶和称重模块也固定在这块亚克力上,具体怎么布置就看个人爱好了。


  • 接线:
      电子秤的接线不是很多,按照下表的接线对应关系连接就可以了:

UNO与1602的接线:
1602I2c模块
UNO
GND
GND
VCC
5V
SDA
A4
SCL
A5


UNO与 HX711接线:
HX711
UNO
VCC
3.3V
GND
GND
SCK
9
DT
10

HX711与称重传感器:
这里称重传感器的接线口是没有接好的,所以在接线的时候需要大家在称重传感器上接上杜邦线的母头,以便与HX711相连接,可以在配送的杜邦线中区四根剪断使用。

称重传感器
HX711
E+
E-
绿
A+
A-


  • 电子秤托盘安装:
      最后一块亚克力(只有一个孔)就是电子秤的托盘,同样在安装的时候需要在称重模块和托盘之间加一块亚克力,如果此时亚克力和下面的1602距离太近,还需要加厚亚克力,比如加多一块纸片。这是防止在托盘受力时顶到1602上面,不能有效得到实际的数据。具体需要在理解了电子秤原理的基础上才能安装。确定好后打上螺丝固定就完成了!!



2.    HX711模块技术参数:

HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的32增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。
特点:
两路可选择差分输入
片内低噪声可编程放大器,可选增益为64 和128
片内稳压电路可直接向外部传感器和芯片内A/D 转换器提供电源
片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟
上电自动复位电路
简单的数字控制和串口通讯:所有控制由管脚输入,芯片内寄存器无需编程
可选择10Hz 或80Hz 的输出数据速率

3.    Arduino电子秤的调试

看一下接线:
1. VCC 可以是 2.6-5.5 中的任意值,因为我们使用的是 Arduino ,所以直接5V供电,GND 接地。
2. SCK 接 Arduino 的 Pin 9,DT 接 Pin10,这两个接脚可以在程序中改变。
3. E+、E-、A+ 和 A- 分别接桥式传感器的:激励电压正、负,输出电压正、负
  (E+ 接红线;E- 接黑线;A+ 接绿或蓝线;A- 接白线)。
4. B+ 和 B- 接通道B的传感器,也可以通过分压电路接电源,用来检测电源电压。不用的话最好接GND,不过我试验不接也没问题。


在 Arduino 中打开示例代码,可以看到非常简单:
#include <HX711.h> // 包含库的头文件
HX711 hx(9, 10); // 数据接脚定义
void setup() {
  Serial.begin(9600);
}
void loop()
{
  double sum = 0;    // 为了减小误差,一次取出10个值后求平均值。
  for (int i = 0; i < 10; i++) // 循环的越多精度越高,当然耗费的时间也越多
    sum += hx.read();  // 累加
  Serial.println(sum/10); // 求平均值进行均差
}
给的示例程序非常简单,但是我查看库中含有很多示例没有给出的函数:HX711(byte sck, byte dout, byte amp = 128, double co = 1); // 定义 sck、dout 接脚,增益倍数(默认128)和修正系数(默认1)
void set_amp(byte amp); // 改变增益倍数和对应的通道,至少调用一次 read() 后起作用
bool is_ready(); // 返回 hx711 是否可用,在 read() 函数中会被调用
long read(); // 返回传感器电压值,如果 hx711 不可用则程序会暂停在此函数
double bias_read(); // 返回:(read() - 偏移值) * 修正系数
void tare(int t = 10); // 将皮重添加到偏移值,影响每次 read(); 的调用
void set_co(double co = 1); // 修改修正系数(默认为1)
void set_offset(long offset = 0); // 修改偏移值(默认为0)可以看到,HX711还可以使用四参数方式定义,同时指定增益倍数及修正系数。在程序运行中还可以随时改变增益倍数,修正系数以及利用偏移值实现去皮重等功能,非常实用。


这里唯一需要解释的是第一个函数,HX711 hx(9, 10); // 这样用说明只定义SCK和DOUT接脚,AMP默认使用A通道的128位增益,修正系数默认为1;
HX711 hx(9, 10, 64); // 这样用说明定义SCK和DOUT接脚,AMP使用A通道的64增益,修正系数默认为1;
HX711 hx(9, 10, 32, 1.4); // 这样用说明定义SCK和DOUT接脚,AMP使用B通道的32位增益,修正系数为1.4;
这里有关通道和增益倍数的选择,资料中已经提及过,A通道只有128和64位两种增益倍数,对应满载电压为 20mV 和 40mV,B通道只有固定的32位增益倍数,满载电压为 80mV,使用时各个通道输入电压不要超过对应增益倍数的满载电压。当然,程序中额可以随时切换增益倍数和通道,使用set_amp(amp)函数即可,当然,amp 的值只能是 128、64或32。
再强调一句,如果增益倍数选择32位增益,那么读出的数据就是B通道的。

下面写一个具体应用示例:
我选择的传感器参数如下:
满量程输出电压=激励电压x灵敏度1.0mV/V
例如:供电电压是5V乘以灵敏度1.0mV/V=满量程5mV

实际上我选用的这个模块,当电源电压是5V时,供给传感器的供电电压是4V,于是我的传感器满量程电压为4mV。
这样我就完全可以选择增益倍数最高的A通道128位增益来得到最高的精度。

电子称连接图示:

图中红色的为HX711模块,右下角为Arduino UNO,吊臂上挂着的就是桥式传感器(我连接的方式为悬吊式测拉力值),AD模块与传感器间的电线越短越好,过长的话会受到各种干扰,AD模块与Arduino之间的连线最好也不要超过30cm,如果必须加长的话,可以考虑使用带电磁屏蔽的线以及信号放大器。

首先使用库自带的例子测试一下,可以看到悬挂上1kg砝码以及托盘等部件后得到的值为:1315588.75
1315597.75
1315607.37
1315606.75
1315604.75
1315589.62
1315579.62
1315594.25
1315588.75
1315580.25
1315589.00
1315584.25
1315605.50
1315596.12
1315592.25
1315607.75
1315585.75
1315582.87
1315568.75
1315574.75
1315578.00
1315583.12
1315604.62
1315573.50
1315584.25
去掉一个500g砝码后值为:742865.50
742847.87
742869.00
742879.12
742873.68
742858.81
742867.81
742843.37
742862.18
742844.87
742856.50
742834.31
742831.31
742825.12
742842.31
742821.31
742816.12
742846.00
742844.00
742826.87
742818.12
742812.87
742807.18
742835.00
可以粗略的计算:
1315500 - 742800 = 572700
所以修正系数大概为: 500 / 572700 = 0.00087305
那么程序就可以写成(这时可以适当的减小些读取速度,增加个delay,比如让程序半分钟一读取):
#include <HX711.h>
HX711 hx(9, 10, 128, 0.00087305);
void setup() {
  Serial.begin(9600);
}
void loop() {
  delay(500);
  double sum = 0;
  for (int i = 0; i < 10; i++)
    sum += hx.read();
  Serial.println(sum/10);
}
编译写入Arduino后,将砝码全部取下,仅保留称体,得到结果是:169640.70
169632.59
169632.90
169640.90
169632.79
169623.59
169649.79
169610.40
169615.20
169659.40
169619.90
169624.79
169614.79
169624.29
169617.79
169629.20
169604.00
169617.50
169628.20
169589.40
169602.29
169598.40
169596.40
169604.00
169612.40
169592.20
说明偏移值近似为 169600,那么我们在setup中调用偏移值的函数(使用bias_read()读取带修正系数及偏移值的读数,与read()对比作参考):
  1. #include <HX711.h>
  2. HX711 hx(9, 10, 128, 0.00087305);
  3. void setup() {
  4.   Serial.begin(9600);
  5.   hx.set_offset(169600);

  6. }
  7. void loop() {
  8.   delay(500);
  9.   double sum0 = 0;
  10.   double sum1 = 0;
  11.   for (int i = 0; i < 10; i++) {
  12.     sum0 += hx.read();
  13.     sum1 += hx.bias_read();
  14.   }
  15.   Serial.print(sum0/10);
  16.   Serial.print(" ");
  17.   Serial.println(sum1/10);
  18. }
复制代码

这时读出的数据变为:
169615.20 0.01
169616.70 0.02
169613.40 0.02
169636.50 0.03
169620.70 0.02
169638.09 0.04
169625.29 0.02
169620.50 0.02
169612.29 0.01
169609.79 0.01
169624.40 0.02
169625.20 0.02
169630.00 0.03
169628.29 0.03
169606.29 0.00
169617.79 0.02
169637.90 0.03
169603.70 0.00
169605.29 0.01
169636.50 0.03

然后再放上500g砝码查看一下数据:
742492.68 500.16
742499.81 500.17
742503.81 500.17
742505.18 500.18
742507.18 500.17
742499.31 500.17
742499.50 500.17
742512.37 500.18
742521.87 500.19
742497.87 500.17
742518.12 500.18
742518.81 500.18
742520.87 500.19
742520.68 500.19
742530.18 500.20
742532.87 500.20
742543.00 500.20
742540.12 500.21
742517.00 500.19
再放上一个500g砝码试试:1315286.75 1000.25
1315304.62 1000.25
1315296.62 1000.25
1315302.25 1000.26
1315302.12 1000.26
1315294.25 1000.25
1315310.00 1000.26
1315277.37 1000.24
1315283.75 1000.24
1315280.25 1000.23
1315286.75 1000.24
1315293.25 1000.25
1315309.87 1000.26
1315299.50 1000.25
1315307.12 1000.26
1315304.50 1000.25
1315301.50 1000.25
1315296.75 1000.25
1315284.50 1000.23
1315284.37 1000.24
1315308.75 1000.26
1315291.62 1000.25
1315312.75 1000.26
1315312.25 1000.26
可以看到第一位小数发生了大概0.2的变化,这说明我们粗略取的修正系数还不够精确,但是完全符合1g精度的要求。

接下来就是完善程序,增加去皮重的功能了,在Arduino上接一个按钮,为了阻止电磁干扰发生误判断,我采用了常输出高电平的按钮,当按下按钮的时候输出低电平,按钮接在 4 号口上:#include <HX711.h>
  1. HX711 hx(9, 10, 128, 0.00087305);
  2. void setup() {
  3.   Serial.begin(9600);
  4.   hx.set_offset(169600);
  5. }
  6. void loop() {
  7.   if(digitalRead(4) == LOW) hx.tare();
  8.   double sum0 = 0;
  9.   double sum1 = 0;
  10.   for (int i = 0; i < 10; i++) {
  11.     sum0 += hx.read();
  12.     sum1 += hx.bias_read();
  13.   }
  14.   Serial.print(sum0/10);
  15.   Serial.print(" ");
  16.   Serial.println(sum1/10);
  17. }
复制代码


这样每次按下按钮的时候就可以去皮重了。

再来一个加了1602液晶的代码
  1. #include <HX711.h>
  2. #include <Wire.h>
  3. #include <LiquidCrystal_I2C.h>
  4. HX711 hx(9, 10, 128, 0.00127551);
  5. LiquidCrystal_I2C lcd(0x27,16,2);
  6. void setup() {
  7.   Serial.begin(9600);
  8.   hx.set_offset(41562);
  9.   lcd.init();                      // initialize the lcd
  10.   lcd.backlight();
  11.   lcd.begin(16,2);

  12. }
  13. void loop() {
  14.   delay(500);
  15.   double sum0 = 0;
  16.   double sum1 = 0;
  17.   for (int i = 0; i < 10; i++) {
  18.     sum0 += hx.read();
  19.     sum1 += hx.bias_read();
  20.   }
  21.   lcd.clear();
  22.   lcd.setCursor(2,0);
  23.   lcd.print("keyes-scale");
  24.   lcd.setCursor(5, 1);
  25.   lcd.print(sum1/10);
  26.   lcd.print("g");
  27.   delay(10);
  28. }
复制代码
   由于温度, 环境 ,线材 ,等等因素的影响,实际的误差+-0.5克左右。

全部资料51hei下载地址:
KT0015 DIY ARDUINO精密珠宝电子秤HX711称重传感器专用AD模块 称重传感器 迷你支架.rar (10.29 MB, 下载次数: 236)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:408892 发表于 2018-10-13 09:47 | 显示全部楼层
非常好用
回复

使用道具 举报

ID:32574 发表于 2018-10-17 14:08 | 显示全部楼层
谢谢楼主分享,学习一下
回复

使用道具 举报

ID:429183 发表于 2018-11-19 14:44 | 显示全部楼层
非常有用,学习了
回复

使用道具 举报

ID:92231 发表于 2019-2-5 09:21 来自手机 | 显示全部楼层
这是我见到较详细的关于电子称资料,顶一个
回复

使用道具 举报

ID:276761 发表于 2019-2-5 10:52 | 显示全部楼层
有空做个            
回复

使用道具 举报

ID:285286 发表于 2019-2-26 14:41 | 显示全部楼层
可以可以,有时间做一个
回复

使用道具 举报

ID:469313 发表于 2019-3-2 09:44 | 显示全部楼层
谢谢楼主分享,学习一下   
回复

使用道具 举报

ID:500096 发表于 2019-3-29 08:28 | 显示全部楼层
不错,学习了
回复

使用道具 举报

ID:222498 发表于 2019-10-22 10:41 | 显示全部楼层
讲得好详细啊,学习学习。我刚好想做一个自动热水壶制作。放到特定重量的水就关闭电磁水阀,然后触发大功率继电器烧水。
回复

使用道具 举报

ID:629546 发表于 2019-10-24 17:15 | 显示全部楼层
.......................ARSGFDJHFCNB

hx711-arduino-v0.01.tar.zip

1.48 KB, 下载次数: 10, 下载积分: 黑币 -5

回复

使用道具 举报

ID:647255 发表于 2019-11-22 18:03 | 显示全部楼层
计算这块是挺头疼的。感谢提供思路
回复

使用道具 举报

ID:397804 发表于 2019-11-29 15:41 | 显示全部楼层
这是我见到较详细的关于电子称资料,顶一个
回复

使用道具 举报

ID:405462 发表于 2019-12-31 09:02 | 显示全部楼层
我也有弄一個實驗哈!
回复

使用道具 举报

ID:707603 发表于 2020-3-23 12:59 | 显示全部楼层
很好,学习了
回复

使用道具 举报

ID:846249 发表于 2020-11-21 17:58 | 显示全部楼层
能不能将此电子称的程序改一改成为密度计。密度等于物体的重量除以物体重量减去该物体在液体中的重量。能够自动计算出物体的密度,而不用分步实施。请回复!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表