已经帮你改好了,各位可以直接照抄我的代码
HX711_XXXXXXo.cpp:
#include <Arduino.h>
#include "HX711.h"
#include <SPI.h>
#include <SD.h>
float pretime = 0;
File sdcard;
const int cspin = 10; // SD卡片选引脚
bool isFirstWrite = true;
// 引脚定义(按实际接线)
#define HX711_SCK 2
#define HX711_DT 3
// 滤波参数(平衡稳定度和灵敏度)
const int numReadings = 5;
int readings[numReadings];
int readIndex = 0;
int total = 0;
void setup() {
Init_Hx711();
Get_Maopi(); // 读取空载零点(含安装应力)
delay(3000);
Serial.begin(115200);
Serial.println("HX711初始化完成 程序by-tian30");
// 初始化SD卡
pinMode(cspin, OUTPUT);
if (!SD.begin(cspin)) {
Serial.println("你还没有插SD卡哦!");
while (1);
}
Serial.println("SD卡就绪");
pretime = millis();
// 初始化滤波数组
for (int i = 0; i < numReadings; i++) {
readings[i] = 0;
}
}
void loop() {
// 首次写入表头
if (isFirstWrite) {
sdcard = SD.open("data.txt", FILE_WRITE);
if (sdcard) {
sdcard.println("Time(s)\tForce(N)");
sdcard.close();
isFirstWrite = false;
}
}
// 读取重量(带滤波)
total -= readings[readIndex];
readings[readIndex] = Get_Weight();
total += readings[readIndex];
readIndex = (readIndex + 1) % numReadings;
float weight = (float)total / numReadings;
if (weight < 0) weight = 0; // 负数归零
// 计算时间和推力
float now = (millis() - pretime) / 1000.0;
float force = weight / 1000.0 * 9.8;
// 写入SD卡
sdcard = SD.open("data.txt", FILE_WRITE);
if (sdcard) {
sdcard.print(now, 3);
sdcard.print("\t");
sdcard.println(force, 3);
sdcard.close();
}
// 串口输出
Serial.print(now, 3);
Serial.print("\t");
Serial.print(weight);
Serial.print("g\t");
Serial.print(force, 3);
Serial.println("N");
}
另外我加了一个滤波算法,防止数值一直乱跳,然后加了一个TF卡检测,如果你的TF卡有问题的话是识别不出来的,防止试车前出事
HX711.cpp:
#include "HX711.h"
long HX711_Buffer = 0;
long Weight_Maopi = 0; // 空载零点(自动读取)
long Weight_Shiwu = 0;
// 【必须校准!】按以下步骤修改:
// 1. 空载时上传代码,记录串口显示的重量值(如显示100g)
// 2. 放140g物体,记录显示值(如显示240g)
// 3. 计算:GapValue = 原GapValue * 140 / (240-100) → 示例:204*140/140=204
#define GapValue 204 // 替换为你的计算值
void Init_Hx711() {
pinMode(HX711_SCK, OUTPUT);
pinMode(HX711_DT, INPUT);
}
void Get_Maopi() {
Weight_Maopi = HX711_Read(); // 自动读取当前空载原始数据作为零点
}
long Get_Weight() {
HX711_Buffer = HX711_Read();
Weight_Shiwu = HX711_Buffer - Weight_Maopi; // 减去零点
Weight_Shiwu = (long)((float)Weight_Shiwu / GapValue); // 用校准因子计算
return Weight_Shiwu;
}
unsigned long HX711_Read(void) {
unsigned long count = 0;
unsigned char i = 0;
digitalWrite(HX711_DT, HIGH);
delayMicroseconds(1);
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
while (digitalRead(HX711_DT));
for (i = 0; i < 24; i++) {
digitalWrite(HX711_SCK, HIGH);
delayMicroseconds(1);
count = count << 1;
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
if (digitalRead(HX711_DT)) count++;
}
digitalWrite(HX711_SCK, HIGH);
delayMicroseconds(1);
count ^= 0x800000;
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
return count;
}
这里要注意一下必须要把GapValue值算出来,不能拍拍脑壳直接填
剩下的一个文件是头文件不用修改,TF卡中已经是左边时间,右边推力(g取9.8N/kg),如果你发现串口数据有时候一直跳一个固定数值(比如我的老显示1400g),可以试试直接采集并打印 HX711 原始数据,如果发现串口数据很稳定就可能是干扰问题(比如接地端连接不稳或没连接)还要注意连接线不可太长,不然HX711的信号会衰减,如果原始数据也乱跳那就是HX711或压力传感器坏了(建议先换一个HX711试试,因为之前对HXX711修改过,可能让你给改坏了)
另外我要和LZ说一下,不能犯这种小错误,如果我不发现别人照抄再去试车可就害人不浅啊,不过LZ你的教程接线部分和别的部分也挺详细(就是代码挺烂的)