Arduino结合HX711实现8路信号采集称重

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daybreak___/article/details/82780259

说明:使用两块Arduino实现8路Sensor同时采集,并输出控制信号
写作目的主要是为了作为学习笔记

Arduino & Sensor接线图

1、双机通讯连线图
双机通讯连线图
2、HX711和Sensor的连线图
HX711和Sensor的连线图
3、将8个Sensor的SCK全部接到receive板的D2引脚
4、8个DATA线分别接至receive板的D3-D10引脚
5、将8路继电器模组控制引脚接到Send板的D2-D9
6、Send板的D10和D11作为接受信号引脚
注意Sensor和Arduino进行共地

HX711库文件

1、下载链接
链接:github链接.
2、将下载到的HX711 Master文件夹放入Arduino的libraries文件夹中并加载,所有需要用的函数,如偏差设定,系数设定等都在库文件里有定义,详细请查看库文件对于库函数的定义,当然也可以自己修改库函数,以方便实际使用需求

示例代码

1、send板代码

#include <SoftwareSerial.h>
#include <HX711.h>
HX711 hx1(3, 2);
HX711 hx2(4, 2);
HX711 hx3(5, 2);
HX711 hx4(6, 2);
HX711 hx5(7, 2);
HX711 hx6(8, 2);
HX711 hx7(9, 2);
HX711 hx8(10, 2);

double c1, c2, rs;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  hx1.set_offset(121100);//设置偏移量
  hx2.set_offset(121100);
  hx3.set_offset(121100);
  hx4.set_offset(121100);
  hx5.set_offset(121100);
  hx6.set_offset(121100);
  hx7.set_offset(121100);
  hx8.set_offset(121100);

  hx1.set_scale(2214);//设置修正系数
  hx2.set_scale(2214);
  hx3.set_scale(2214);
  hx4.set_scale(2214);
  hx5.set_scale(2214);
  hx6.set_scale(2214);
  hx7.set_scale(2214);
  hx8.set_scale(2214);

}

void loop() {
  // put your main code here, to run repeatedly:
  double s1 = hx1.get_units(5); //读取5次并计算平均值
  double s2 = hx2.get_units(5);
  double s3 = hx3.get_units(5);
  double s4 = hx4.get_units(5);
  double s5 = hx5.get_units(5);
  double s6 = hx6.get_units(5);
  double s7 = hx7.get_units(5);
  double s8 = hx8.get_units(5);
  
  c1=s1+s2+s3+s4;
  c2=s5+s6+s7+s8;
  rs=c1-c2;

  transmit();//发送经过修正后的数据
}
void transmit(){
        Serial.print('a');
        Serial.print(c1);
        Serial.print('b');
        Serial.print(c2);
        Serial.print('c');
        Serial.print(rs);
        Serial.println('#');
        delay(100);
  }

发送字符中的a,b,c,#是作为标志符,以作为后续receive函数对接收到的数据进行分割处理
2、receive板代码

#include <SoftwareSerial.h>
double c1, c2, rs;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
void loop() {
  // put your main code here, to run repeatedly:
  receive();//接收到Send板上发出的数据并解析为double类型
  Serial.println(c1);
  Serial.println(c2);
  Serial.println(rs);
  Serial.println();

}
void receive() {

  String comdata = "";
  String buf1 = "";
  String buf2 = "";
  String buf3 = "";

  while (Serial.available() > 0)
  {
    comdata += char(Serial.read());
    delay(2);
  }
  if (comdata.length() > 0)
  {
    int ja, jb, jc, jd;

    for (int i = 0; i < comdata.length(); i++) {

      if (comdata[i] == 'a') {
        ja = i;
      }
      if (comdata[i] == 'b') {
        jb = i;
      }
      if (comdata[i] == 'c') {
        jc = i;
      }
      if (comdata[i] == '#') {
        jd = i;
      }

    }//找到标志符号并记录标志符号的索引位置

    for (int k = ja + 1; k < jb; k++) {
      buf1 += char(comdata[k]);
    }
    for (int k = jb + 1; k < jc; k++) {
      buf2 += char(comdata[k]);
    }
    for (int k = jc + 1; k < jd; k++) {
      buf3 += char(comdata[k]);
    }
    c1 = buf1.toDouble();
    c2 = buf2.toDouble();
    rs = buf3.toDouble();
  }//分割字符并转换为需要的数据类型
}
控制代码的输出

数据的读取和双机通讯功能实现后便可以利用,接收到的数据进行一些其他的控制代码书写

猜你喜欢

转载自blog.csdn.net/daybreak___/article/details/82780259