Arduino实现压力传感器(使用HX711模块)

发布时间: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);     /// 返回传感器读取值
}

项目需要一个传感器程序,于是自己写了一个,也供大家参考使用

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号