重量传感器

重量传感器套件

简介

重量传感器是一个比较实用、贴近生活场景的传感器,通过获取物体的重量信息能够制作很多有趣的应用,例如家用电子秤、日用品余量报警、物联网称台等。DFRobot商城中已经有了重量传感器和HX711信号转接模块,但是由于结构搭建难度较大,很多无法搭建结构的朋友不能使用这款传感器。

这款重量传感器套件,降低了结构搭建难度,让任何人都能够快速的制作出一个电子称台获取物体的重量信息。另外,由于每个人的安装方式、使用习惯不同,所以传感器需要校准,传统的方法是需要使用单独的校准代码去获取校准值,为优化这一问题,本套件中的信号转接板中内置了校准算法,可一键校准重量信息,无需再运行单独的代码进行校准。

注:传感器最大量程为1kg,请勿过多的超出量程,否则会永久性的损坏传感器,导致数据不准

特性

应用场景

项目实例:牛奶自动购买机

技术规格

修改地址后传感器断电重启后生效

A0 A1 地址
0 0 0X64
1 0 0X65
0 1 0X66
1 1 0X67

引脚及按键

序号 名称 功能描述 序号 名称 功能描述
1 VCC 正极 6 E+ 传感器红色线
2 GND 公共地 7 E- 传感器黑色线
3 SCL I2C时钟线 8 S- 传感器白色线
4 SDA I2C数据线 9 S+ 传感器绿色线
5 CAL按键 自动校准 10 RST按键 去皮

使用说明

组装步骤

使用教程

准备

  /*!
   * @brief Constructor 
   * @param pWire I2c controller
   * @param addr  I2C address(0x64/0x65/0x660x67)
   */
  DFRobot_HX711_I2C(TwoWire * pWire = &Wire,uint8_t addr = HX711_I2C_ADDR);

  /**
   * @brief 初始化函数
   * @return 如果初始化成功则返回1,否则返回错误码。
   */
  int begin(void);

  /**
   * @brief 获取物体重量信息
   * @param 取平均值的次数
   * @return 返回获取的重量值,单位:g
   */
  float readWeight(uint8_t times = 12);

  /**
   * @brief 获取校准值(获取按键校准或enableCal()函数的校准值)
   * @return 返回获取的校准值
   */
  float getCalibration();

  /**
   * @brief 设置/更新校准值
   * @param 数值
   */
  void  setCalibration(float value);

  /**
   * @brief 设置重量传感器模块自动校准时的触发阈值(g)
   * @param 阈值数据
   */
  void  setThreshold(uint16_t threshold);

  /**
   * @brief 设置重量传感器模块自动校准时的校准重量(g)
   * @param 重量数据
   */
  void  setCalWeight(uint16_t triWeight);

  /**
   * @brief 启动校准(软件方式)
   */
  void enableCal();

  /**
   * @brief 去皮(软件方式)
   */
  void peel();

  /**
   * @brief 等待传感器校准完成
   * @return 校正完成返回:True
   *         校正失败返回:False
   */
  bool getCalFlag();

接线图

自动校准 - 按键

(物体放上后会有1S的延时防抖动时间,所以不要着急,物体放好后在校准完成之前不要触碰)

#include <DFRobot_HX711_I2C.h>

//DFRobot_HX711_I2C MyScale(&Wire,/*addr=*/0x64);
DFRobot_HX711_I2C MyScale;

float Weight = 0;

void setup() {
  Serial.begin(9600);
  while (!MyScale.begin()) {
    Serial.println("The initialization of the chip is failed, please confirm whether the chip connection is correct");
    delay(1000);
  }
  //// Set the calibration weight when the weight sensor module is automatically calibrated (g)
  MyScale.setCalWeight(100);
  // Set the trigger threshold (G) for automatic calibration of the weight sensor module. When only the weight of the object on the scale is greater than this value, the module will start the calibration process
  // This value cannot be greater than the calibration weight of the setCalWeight() setting
  MyScale.setThreshold(10);
  // Obtain the calibration value. The accurate calibration value can be obtained after the calibration operation is completed
  Serial.print("the calibration value of the sensor is: ");
  Serial.println(MyScale.getCalibration());
  MyScale.setCalibration(MyScale.getCalibration());
  delay(1000);
}

void loop() {
  Weight = MyScale.readWeight();
  Serial.print("weight is: ");
  if(Weight > 0.5){
    Serial.print(Weight, 1);
  }
  else{
    Serial.print(0, 1);
  }
  Serial.println(" g");
  delay(1000); 
}

Mind+

自动校准 - 软件

#include <DFRobot_HX711_I2C.h>

//DFRobot_HX711_I2C MyScale(&Wire,/*addr=*/0x64);
DFRobot_HX711_I2C MyScale;

void setup() {
  Serial.begin(9600);
  while (!MyScale.begin()) {
    Serial.println("The initialization of the chip is failed, please confirm whether the chip connection is correct");
    delay(1000);
  }
  //Set the calibration weight when the weight sensor module is automatically calibrated (g)
  MyScale.setCalWeight(100);
  // Set the trigger threshold (G) for automatic calibration of the weight sensor module. When only the weight of the object on the scale is greater than this value, the module will start the calibration process
  // This value cannot be greater than the calibration weight of the setCalWeight() setting
  MyScale.setThreshold(10);  

  //Start sensor calibration
  Serial.println("Please put the object within 5S");
  MyScale.enableCal();
  long time1 = millis();
  //Wait for sensor calibration to complete
  while(!MyScale.getCalFlag()){
       delay(1000);
       if((millis()-time1) > 7000){ 
          Serial.println("The calibration failed this time, and no object is detected within 5S. The last calibration value will be used.");
          break;
       }
  }
  //Obtain the calibration value. The accurate calibration value can be obtained after the calibration operation is completed
  Serial.print("the calibration value of the sensor is: ");
  Serial.println(MyScale.getCalibration());
  MyScale.setCalibration(MyScale.getCalibration());
}

void loop(){
  float Weight = MyScale.readWeight();
  Serial.print("weight is: ");
  if(Weight > 0.5){
    Serial.print(Weight, 1);
  }
  else{
    Serial.print(0, 1);
  }
  Serial.println(" g");
  delay(1000);  
}

Mind+

快速使用实例

#include <DFRobot_HX711_I2C.h>

//DFRobot_HX711_I2C MyScale(&Wire,/*addr=*/0x64);
DFRobot_HX711_I2C MyScale;

float Weight = 0;

void setup() {
  Serial.begin(9600);
  while (!MyScale.begin()) {
    Serial.println("The initialization of the chip is failed, please confirm whether the chip connection is correct");
    delay(1000);
  }
  //// Set the calibration weight when the weight sensor module is automatically calibrated (g)
  MyScale.setCalWeight(50);
  // Set the trigger threshold (G) for automatic calibration of the weight sensor module. When only the weight of the object on the scale is greater than this value, the module will start the calibration process
  // This value cannot be greater than the calibration weight of the setCalWeight() setting
  MyScale.setThreshold(10);
  // Obtain the calibration value. The accurate calibration value can be obtained after the calibration operation is completed
  Serial.print("the calibration value of the sensor is: ");
  Serial.println(MyScale.getCalibration());
  MyScale.setCalibration(MyScale.getCalibration());
  delay(1000);
}

void loop() {
  Weight = MyScale.readWeight();
  Serial.print("weight is: ");
  if(Weight > 0.5){
    Serial.print(Weight, 1);
  }
  else{
    Serial.print(0, 1);
  }
  Serial.println(" g");
  delay(1000); 
}

Mind+

兼容性

MCU Work Well Work Wrong Untested Remarks
Arduino uno
FireBeetle-ESP8266
FireBeetle-ESP32
掌控板
树莓派
microbit

FAQ

Q1:如何显示负的重量信息。

A:将代码中的loop函数替换

void loop() {
  Serial.print("weight is: ");
  Serial.print(MyScale.readWeight(), 1);
  Serial.println(" g");
  delay(1000);
}
Q2:如何判断自动校准是否成功。
A:成功后校准按键上方的指示灯会闪烁三下并熄灭,如果熄灭前没有闪烁三下则表示没有校准成功。
Q3:自动校准成功后输出的重量信息有较小误差(<0.5g)。
A:有时候物体放不稳会造成有很小的误差,再校准一次即可。
Q4:自动校准成功后输出的重量信息有较大误差(>3g),而且进行了多次校准每次校准成功后输出的重量信息都有较大误差。
A:请检查传感器(秤杆)的四根引线不要有过多缠绕,缠绕过多会影响数据。确保秤面已经放平。
Q5:如何确定校准物体的重量应该为多大。
A:取中间值,例如使用时测量范围大约为0-600g,那么校准物体重量最好选择300g(其他重量也可以,中间值是理想值)。
Q6:为什么在校准100g物体时,放上了100g物体后没有启动校准,一直校准失败。
A:校准时需要有一个“触发重量”,按下校准键,传感器检测到有东西放上去并且超过“触发重量”时才会开始校准。在第一次使用时,因为没有校准,所以放上100g的物体传感器读到的数据可能只有5g,这时需要降低MyScale.setThreshold(10)的值(30改为5或更低),然后重新上传代码。
Q7:不管放不放物体,传感器输出数据一直为0。
A:这是由于在Arduino完成复位前就将物体放在秤面上所导致的。解决办法:将秤面上物体取下,按一下Arduino的复位键或者传感器的rst键,重新放上物体即可正常使用。
Q8:为什么使用setCalibration()函数设置了校准值为2000,而使用getCalibration()函数察看当前的校准值却不是2000。
A:getCalibration()函数只能获取按键校准或enableCal()函数的校准值,无法获取通过setCalibration()函数设置的校准值

更多

DFshopping_car1.png DFRobot商城购买链接