资料在这里:链接:https://pan.baidu.com/s/1a3lbToJZKTeBq6lbU9SRCg
提取码:1234
实验室一个hx711称重模块,搞了一下,不稳定,所以解析一下代码:
#ifndef __HX711__H__
#define __HX711__H__
#include <Arduino.h>
#define HX711_SCK 2 //设置2号引脚发送时钟信号
#define HX711_DT 3 //设置3号引脚接收数据信号
extern void Init_Hx711(); //初始化
extern unsigned long HX711_Read(void); //读取增益128
extern long Get_Weight(); //获取重量
extern void Get_Maopi(); //获取毛皮
#endif
初始化函数
Init_Hx711():
void Init_Hx711()
{
pinMode(HX711_SCK, OUTPUT);
pinMode(HX711_DT, INPUT);
}
/*
初始化Hx711模块 ,设置引脚SCK和DT 输出输入 类似IIC 用引脚模拟iic
*/
读取增益函数unsigned long HX711_Read(void)
unsigned long HX711_Read(void) //增益128
{
unsigned long count; //储存变量
unsigned char i; //接收位数
bool Flag = 0; //没啥用
digitalWrite(HX711_DT, HIGH);
delayMicroseconds(1);
//高一微秒
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
//低一微秒
count=0; //清除储存变量
while(digitalRead(HX711_DT)); //等待数据引脚DT响应高电平
for(i=0;i<24;i++) //循环读取24位数据 hx711芯片是24位ADC储存芯片
{
digitalWrite(HX711_SCK, HIGH);
delayMicroseconds(1);
count=count<<1;
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
if(digitalRead(HX711_DT))
count++;
//发送时钟信号 并且移位 如果读取电平为高,当前的count的位数为1,否则默认为0
}
digitalWrite(HX711_SCK, HIGH);
count ^= 0x800000; /*
^是异或,位运算的一种,相同为0不同为1 a=3,二进制表示是00000011 b=4,二进制表示是00000100 a=a^b,a的值为:00000111 b=b^a,b的值为:00000011,即是a的初值3 a=a^b,a的值为:00000100,即是b的初值4 实现交换
这里相当于是count ^= 0x800000 = count=count^0x800000,
如果count=FFFFFF,拆散开来为二进制的1111 1111 1111 1111 1111 1111
0x800000=1000 0000 0000 0000 0000 0000
count=count^0x800000=1111 1111 1111 1111 1111 1111^1000 0000 0000 0000 0000 0000=1000 0000 0000 0000 0000 0000;
*/
delayMicroseconds(1);
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
//质低时钟,等待下次发送
return(count); //返回count的值
}
获取毛皮(重量初始化) void Get_Maopi()
void Get_Maopi()
{
Weight_Maopi = HX711_Read(); //赋值hx711获取的值count给maopi
}
/*
可以理解为获取没有东西时候的重量 重量初始化
*/
获取重量:long Get_Weight()
long Get_Weight()
{
HX711_Buffer = HX711_Read();
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取实物的AD采样数值。 用现在的重量-之前初始化的重量
Weight_Shiwu = (long)((float)Weight_Shiwu/GapValue); //实物的重量=数值/GapValue
return Weight_Shiwu; //返回实物的重量
}
GapValue取多少,具体看说明书,在函数里是这样子定义的:
#define GapValue 430
手册又是这样子定义的:
arduino代码实现:
/*
* #define HX711_SCK 2
#define HX711_DT 3
有误 需要校准
*/
#include "HX711.h"
float Weight = 0;
void setup()
{
Init_Hx711(); //初始化HX711模块连接的IO设置
Serial.begin(9600);
Serial.print("Welcome to use!\n");
delay(3000);
Get_Maopi(); //获取毛皮
}
void loop()
{
Weight = Get_Weight(); //计算放在传感器上的重物重量
Serial.print(float(Weight/1000),3); //(g)缩小一千倍(kg) 串口显示重量 3位浮点数
Serial.print(" kg\n"); //显示单位
Serial.print("\n"); //显示单位
delay(1000); //延时1s
}