发布时间:2023-02-23 11:00
/以下为函数声明
extern unsigned long HX711Read(void);
extern long getWeight();
///变量定义
float weight = 0;
int HX711_SCK = 2; /// 作为输出口
int HX711_DT= 3; /// 作为输入口
long HX711Buffer = 0;
long grossWeight = 0;
long netWeight = 0;
int gapValue = 405; ///该值需校准 每个传感器都有所不同
int MEASURE_INTERVAL = 20; // 测量时间间隔
int CALIBRATION_INTERVAL = 2000; // 校准时间间隔
///状态定义
#define STATE_CALIBRATE 1 // 校准状态
#define STATE_MEASURE 2 // 测量状态
int state = 1; // 当前状态
void setup() {
//初始化HX711的两个io口
pinMode(HX711_SCK, OUTPUT); ///SCK 为输出口 ---输出脉冲
pinMode(HX711_DT, INPUT); /// DT为输入口 ---读取数据
Serial.begin(9600);
Serial.println("Pressure Sensor Operating Terminal");
Serial.println("calibrate mode");
delay(3000); ///延时3秒
//获取毛皮重量
grossWeight = HX711Read();
}
void loop() {
runStateMachine(state);
char command = Serial.read(); // 读取用户命令
if (command == 's' && state == STATE_CALIBRATE) { // s 开始测量
state = STATE_MEASURE;
Serial.println("measure mode");
}
if (command == 'e' && state == STATE_MEASURE) { // e 结束测量
state = STATE_CALIBRATE;
Serial.println("calibrate mode");
}
if (command == 'p') { // p 停止程序
Serial.end();
}
}
// 压力传感器状态机
void runStateMachine(int state) {
if (state == STATE_CALIBRATE) {
printMessage(CALIBRATION_INTERVAL);
} else if (state == STATE_MEASURE) {
printMessage(MEASURE_INTERVAL);
}
}
// 称重函数
// 返回值:测得重量(去皮)
long getWeight() {
HX711Buffer = HX711Read(); /// 读取此时的传感器输出值
netWeight = HX711Buffer; /// 将传感器的输出值储存
netWeight = netWeight - grossWeight; // 获取实物的AD采样数值。
netWeight = (long)((float)netWeight/gapValue); // AD值转换为重量(g)
return netWeight;
}
// 把称重打到串口
// 参数:interval 输出时间间隔,单位ms
void printMessage(int interval) {
weight = getWeight(); // 计算放在传感器上的重物重量
Serial.print(float(weight / 1000),3); // 串口显示重量,3意为保留三位小数
Serial.print(" kg\n"); // 显示单位
Serial.print("\n"); // 显示单位
delay(interval); // 延时
}
// HX711驱动程序
// 返回值:模拟电压值
unsigned long HX711Read(void) { // 选择芯片工作方式并进行数据读取
unsigned long count; /// 储存输出值
unsigned char i;
high--高电平 1 low--低电平 0
digitalWrite(HX711_DT, HIGH); digitalWrite作用: DT=1;
delayMicroseconds(1); 延时 1微秒
digitalWrite(HX711_SCK, LOW); digitalWrite作用: SCK=0;
delayMicroseconds(1); 延时 1微秒
count = 0;
while(digitalRead(HX711_DT)); // 当DT的值为1时,开始ad转换
for(i = 0; i < 24; i++) { /// 24个脉冲,对应读取24位数值
digitalWrite(HX711_SCK, HIGH); digitalWrite作用: SCK=0;
/// 利用 SCK从0--1 ,发送一次脉冲,读取数值
delayMicroseconds(1); 延时 1微秒
count = count<<1; /// 用于移位存储24位二进制数值
digitalWrite(HX711_SCK, LOW); digitalWrite作用: SCK=0;为下次脉冲做准备
delayMicroseconds(1);
if (digitalRead(HX711_DT)) { /// 若DT值为1,对应count输出值也为1
count++;
}
}
digitalWrite(HX711_SCK, HIGH); /// 再来一次上升沿 选择工作方式 128增益
count ^= 0x800000; // 按位异或 不同则为1 0^0=0; 1^0=1;
///对应二进制 1000 0000 0000 0000 0000 0000 作用为将最高位取反,其他位保留原值
delayMicroseconds(1);
digitalWrite(HX711_SCK, LOW); /// SCK=0;
delayMicroseconds(1); 延时 1微秒
return(count); /// 返回传感器读取值
}
项目需要一个传感器程序,于是自己写了一个,也供大家参考使用