风筝
发表于: 2020-4-12 19:49:09 | 显示全部楼层

在本篇文章中,我们将使用Arduino开发板、称重传感器、HX711分线板模块以及LCD液晶显示屏制作一款电子秤。本文是一个非常简单的Arduino重量测量项目。


电子秤使用称重传感器来测量由负载产生的重量,此处大多数称重传感器都参照应变计的方法,该应变计将压力转换为电信号,这些称重传感器具有四个应变计,嵌在惠斯通电桥结构(Wheatstone bridge)中。


所需的组件

为了使用称重传感器和HX711模块设计Arduino电子秤,我们使用以下组件:

●    Arduino UNO开发板

●    HX711分线板模块

●    称重传感器

●    1602 LCD显示屏

●    按钮开关

●    面包板

●    连接线

●    称重传感器的安装结构(螺母、螺栓、框架、底座)

●    标准重量块(100克)


称重传感器是什么?

称重传感器是用于产生电信号的传感器。它将诸如张力、压力或扭矩之类的力转换为可以测量和标准化的电信号。随着施加到称重传感器上的力增加,电信号按比例变化。称重传感器用于测量重量。称重传感器进行的应变测量有助于在压力下保持设备的完整性,并保护附近的人员和设备。


称重传感器通常由一个弹簧元件组成,在该弹簧元件上已放置了应变仪。弹簧元件通常由钢或铝制成。这意味着它非常坚固,但弹性也很小。顾名思义,弹簧元件表明,钢在载荷作用下会发生轻微变形,但随后会返回到其初始位置,对每种载荷都具有弹性。这些极小的变化可以通过应变仪获得。然后,最后由分析电子设备解释应变计的变形以确定重量。


HX711称重传感器放大器分线板模块

称重传感器放大器是基于HX711的小型分线板模块,可让您轻松读取称重传感器以测量重量。通过将放大器模块连接到微控制器,您将能够读取称重传感器的电阻变化,并且通过一些校准,您将可以获得非常准确的重量测量值。

hx711-module-arduino.jpg


HX711使用两线接口(时钟和数据)进行通信。任何微控制器的GPIO引脚都可以连接,并且已经编写了许多库,从而可以轻松地从HX711读取数据。称重传感器使用四线惠斯通电桥配置连接到HX711。这些通常是红色、黑色、白色、绿色和黄色。每种颜色对应于称重传感器的常规颜色编码:

1.  红色(励磁+或VCC)。

2.  黑色(励磁或GND)。

3.  白色(放大器+,信号+或输出+)。

4.  绿色(A-、S-或O-)。

5.  黄色(外壳)。


称重传感器和HX711的连接电路:


称重传感器的底座

还需要使用螺母和螺栓将基座固定在其上方的称重传感器。在这里,我们使用了一个硬质胶合板作为框架,用于在其上放置物品,并使用了一块轻木板作为基础。这是必需的,因为在称重传感器上施加一定的重量时,称重传感器会略微弯曲。

2.png


Arduino连接HX711称重传感器的连接电路图

如下图所示连接电路图

Load_Cell_Interface_Arduino.png


工作说明

在使整个电路正常工作之前,有必要使用HX711校准称重传感器。我们首先放置100g重量的砝码,调整直到在LCD显示屏上显示100g重量。一旦在称重传感器上测得100g的重量,就完成校准。现在,您只需放置任何重量即可进行99.9%的精度测量。


称重传感器是放大器,可感测重量,并向HX711负载放大器模块提供模拟电电压。然后,将这个放大后的值馈送到Arduino,将HX711的输出转换为以克为单位的重量值。输出结果显示在1602 LCD上。


HX711称重传感器与Arduino连接的源代码

只需复制此代码并将其上传到Arduino开发板即可。确保与电路图中的连接相同。

  1. #include <LiquidCrystal.h>
  2. LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

  3. #define DT A0
  4. #define SCK A1
  5. #define sw 9

  6. long sample=0;
  7. float val=0;
  8. long count=0;

  9. unsigned long readCount(void)
  10. {
  11. unsigned long Count;
  12. unsigned char i;
  13. pinMode(DT, OUTPUT);
  14. digitalWrite(DT,HIGH);
  15. digitalWrite(SCK,LOW);
  16. Count=0;
  17. pinMode(DT, INPUT);
  18. while(digitalRead(DT));
  19. for (i=0;i<24;i++)
  20. {
  21. digitalWrite(SCK,HIGH);
  22. Count=Count<<1;
  23. digitalWrite(SCK,LOW);
  24. if(digitalRead(DT))
  25. Count++;
  26. }
  27. digitalWrite(SCK,HIGH);
  28. Count=Count^0x800000;
  29. digitalWrite(SCK,LOW);
  30. return(Count);
  31. }

  32. void setup()
  33. {
  34. pinMode(SCK, OUTPUT);
  35. pinMode(sw, INPUT_PULLUP);
  36. lcd.begin(16, 2);
  37. lcd.print(" Weight ");
  38. lcd.setCursor(0,1);
  39. lcd.print(" Measurement ");
  40. delay(1000);
  41. lcd.clear();
  42. calibrate();
  43. }

  44. void loop()
  45. {
  46. count= readCount();
  47. int w=(((count-sample)/val)-2*((count-sample)/val));
  48. lcd.setCursor(0,0);
  49. lcd.print("Measured Weight");
  50. lcd.setCursor(0,1);
  51. lcd.print(w);
  52. lcd.print("g ");

  53. if(digitalRead(sw)==0)
  54. {
  55. val=0;
  56. sample=0;
  57. w=0;
  58. count=0;
  59. calibrate();
  60. }
  61. }

  62. void calibrate()
  63. {
  64. lcd.clear();
  65. lcd.print("Calibrating...");
  66. lcd.setCursor(0,1);
  67. lcd.print("Please Wait...");
  68. for(int i=0;i<100;i++)
  69. {
  70. count=readCount();
  71. sample+=count;
  72. }
  73. sample/=100;
  74. lcd.clear();
  75. lcd.print("Put 100g & wait");
  76. count=0;
  77. while(count<1000)
  78. {
  79. count=readCount();
  80. count=sample-count;
  81. }
  82. lcd.clear();
  83. lcd.print("Please Wait....");
  84. delay(2000);
  85. for(int i=0;i<100;i++)
  86. {
  87. count=readCount();
  88. val+=sample-count;
  89. }
  90. val=val/100.0;
  91. val=val/100.0; // put here your calibrating weight
  92. lcd.clear();
  93. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-7 13:30 , Processed in 0.056042 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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