哈哈哈😁,原来是这样啊,那我的代码不就白写了但是各位kcer如果做出来发现串口数据乱跳可以采用我的代码,因为加了滤波算法
新版代码,加入卡尔曼滤波算法,滤波效果相对更加优秀,只需更改原版的hx711XXXXO.ino,其他步骤同文
不过lz说“然后加了一个TF卡检测”,我代码里不本来就有一个检测吗……
hx711XXXXO.ino:
#include <Arduino.h>
#line 1 "C:\\Users\\Acer\\Desktop\\HX711_5Kg\\HX711_5Kg.ino"
#include "HX711.h"
#include <SPI.h>
#include <SD.h>
float pretime = 0;
File sdcard;
const int cspin = 10;
#line 10 "C:\\Users\\Acer\\Desktop\\HX711_5Kg\\HX711_5Kg.ino"
void setup();
#line 42 "C:\\Users\\Acer\\Desktop\\HX711_5Kg\\HX711_5Kg.ino"
void loop();
#line 10 "C:\\Users\\Acer\\Desktop\\HX711_5Kg\\HX711_5Kg.ino"
void setup()
{
Init_Hx711(); //初始化 hx711
delay(3000);
Get_Maopi(); //初始化毛皮
Serial.begin(115200);
Serial.println("HX711 done.");
pinMode (cspin, OUTPUT);
if (!SD.begin (cspin)) { // SD 初始化并检测
Serial.println("SD card failed!");
}
else {
Serial.print("SD card done.\n");
sdcard = SD.open ("data.txt", FILE_WRITE);
if (sdcard) { // 文件读写测试
Serial.println("Opened data.txt!");
sdcard.println("---------------------------------");
sdcard.println("0.00 0.00");
sdcard.close();
} else {
Serial.println("Error opening data.txt!");
}
Serial.println("Start-----------------");
}
pretime = millis ();
Serial.println (pretime);
}
const double Q = 0.001, R = 0.5;
// 过程噪声方差 q(0.001~1),观测噪声方差 r(1~10)
// 根据不同传感器需要调整这两个参数
double p = 1, k, lastp = 1, ans = 0;
// p 初始估计误差方差,k 卡尔曼增益,lastp上次估计误差方差,ans 上次估计值
double kalman (double val) { // 卡尔曼滤波
// 预测
p = lastp + Q;
// 更新
k = p / (p + R);
ans = ans + k * (val - ans);
lastp = (1 - k) * p;
return ans;
}
void loop() {
float weight = Get_Weight ();
float now = (millis() - pretime) / 1000;
if (weight < 0)
weight = 0;
weight = kalman (weight); // 卡尔曼滤波
float force = weight / 1000 * 9.8;
Serial.print (now);
Serial.print (" ");
Serial.print (weight);
Serial.print ("g");
Serial.print (" ");
Serial.print (force);
Serial.println ("N");
sdcard = SD.open ("data.txt", FILE_WRITE);
sdcard.print (now);
sdcard.print (" ");
sdcard.println (force);
sdcard.close ();
}