1年3个月前IP:河北
945424
14楼

已经帮你改好了,各位可以直接照抄我的代码


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你的教程接线部分和别的部分也挺详细(就是代码挺烂的)



评论
3
文号 / 945424

浪迹天涯
名片发私信
学术分 0
总主题 1 帖总回复 33 楼拥有证书:进士 机友 笔友
注册于 2024/12/07 21:39:12最后登录 2026/10/16 22:04:50
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:河北

个人简介

暂未填写
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的