这期分享一下我用arduino ide编写的火箭发动机推力采集程序,这是用arduino nano作为主控芯片,对于新手来说比较简单
下面是要用到的模块
手底下暂时没有多余的,暂时先展示一下大体部分,用到了模块SD卡模块,Hx711模块 ,arduino nano328p的模块,蜂鸣器一个,按键一个 ,传感器一个
值得注意的是,我用的SD卡模块是那种小型的,可能跟其他的模块接线不一样,像那种大一点的SD卡模块可能接线不同
除了接线不一样 ,其他的都不用改动 ,代码也是通用的,下面来说一下接线
SD——nano接线:3V3-3V3 CS-D10 MOSI-D11 CLK-D13 MISO-D12 GND-GND
HX711——nano接线:DT-D5 SCK-D4
蜂鸣器——nano: D8 GND
复位键——nano: D3 GND
传感器接线
接下来展示一下代码部分
// SD接线:3V3-3V3 CS-D10 MOSI-D11 CLK-D13 MISO-D12 GND-GND //HX711接线:DT-D5 SCK-D4 //蜂鸣器 D8 GND //复位键 D3 GND #include <SD.h> File file; #include <HX711_ADC.h> #include <EEPROM.h> //以上库没有的在库管理安装 float i; float time; float time2; const int HX711_dout = 5; //接HX711 dout const int HX711_sck = 4; //接 HX711 sck HX711_ADC LoadCell(HX711_dout, HX711_sck); const int calVal_calVal_eepromAdress = 0; unsigned long t = 1; float a = 0.00; void setup() { Serial.begin(57600); pinMode(3, INPUT_PULLUP);//设置复位按键 pinMode(8, OUTPUT);//设置蜂鸣器输出 Serial.println(); Serial.println("准备..."); float calibrationValue; calibrationValue = 88.88; //校准值根据实际情况进行修改 LoadCell.begin(); unsigned long stabilizingtime = 2000; // tare preciscion can be improved by adding a few seconds of stabilizing time boolean _tare = true; //set this to false if you don't want tare to be performed in the next step LoadCell.start(stabilizingtime, _tare); if (LoadCell.getTareTimeoutFlag()) { Serial.println("Timeout, check MCU>HX711 wiring and pin designations"); } else { LoadCell.setCalFactor(calibrationValue); // set calibration factor (float) Serial.println("Startup is complete"); } if (!SD.begin()) { Serial.println("SD初始化失败"); return; } Serial.println("SD初始化成功"); file = SD.open("test.txt", FILE_WRITE); if (file) { file.println(" "); file.println(" "); file.println("以上数据作废 "); file.println("开始记录新数据:"); file.println("数据从左到右是 当前推力(g) 最大推力(g) 最大推力(kg) 最大推力(N) 数据量 时间"); file.close(); } } void loop() { static boolean newDataReady = 0; const int serialPrintInterval = 500; //increase value to slow down serial print activity // check for new data/start next conversion: if (LoadCell.update()) newDataReady = true; // get smoothed value from the dataset: if (newDataReady) { //if (millis() > t + serialPrintInterval) { i = LoadCell.getData(); if (a < i) a = i; Serial.print("当前推力:"); Serial.print(i); Serial.print("g"); Serial.print(" "); Serial.print("累计最大推力:"); Serial.print(a); Serial.print("g"); Serial.print(" "); Serial.print("累计最大kg:"); Serial.print(a / 1000); Serial.print("kg"); Serial.print(" "); Serial.print("累计最大N:"); Serial.print(a / 1000 * 9.8); Serial.print("N"); Serial.print(" "); Serial.print(time); Serial.print(" "); Serial.print(time2); Serial.println("s");//打印数据方便调试 file = SD.open("test.txt", FILE_WRITE); if (file) { file.print(i); //数据输出 file.print(" "); file.print(a); //数据输出 file.print(" "); file.print(a / 1000);//单位转换kg file.print(" "); file.print(a / 1000 * 9.8);//单位转换N file.print(" "); file.print(time);//总共数据量用以计算时间 file.print(" "); file.println(time2);//时间输出 time += 1; //计算时间 time2 = time / 30; //数字越大时间越慢 根据采集率的快慢进行修改 file.close(); } else { digitalWrite(8, 1); delay(150); digitalWrite(8, 0); delay(150);//检测SD卡是否丢失 } } if (digitalRead(3) == t) { LoadCell.tareNoDelay(); } if (LoadCell.getTareStatus() == true) {//置零设置 Serial.println("Tare complete"); digitalWrite(8, 0); a = a - a; } else { digitalWrite(8, 1); } }
VID20240718155039.mp4 点击下载
上传代码后,插上SD卡即可
注意一下 ,如果SD卡中途断开或者损坏,将无法进行数据储存,蜂鸣器会报警提示
VID20240718155148.mp4 点击下载
以下是SD卡读取的数据
VID20240718155645.mp4 点击下载
数据与串口监视器上面的格式一致
数据从左到右是 当前推力(g) 最大推力(g) 最大推力(kg) 最大推力(N) 数据量 时间
calibrationValue = 88.88; //校准值根据实际情况进行修改
这部分用于校准数据,可以用砝码来进行修改
time += 1; //计算时间
time2 = time / 30; //数字越大时间越慢 根据采集率的快慢进行修改
在代码中的这一行根据HX711实际采集率来修改时间
欢迎大家对代码进行修改
初来驾到,希望大家多多指教
谢谢,这个真是太厉害了 我要去试试看
这是怎么回事,我编译不了
Arduino:1.8.4 (Windows 10), 开发板:"Arduino Nano, ATmega328P (Old Bootloader)"
C:\Users\HP\Documents\Arduino\sketch_jul19a\sketch_XXXXXXXXXo: In function 'void setup()':
sketch_jul19a:33: error: no matching function for call to 'HX711_ADC::start(long unsigned int&, boolean&)'
XXXXXXXXXXXart(stabilizingtime, _tare);
^
In file included from C:\Users\HP\Documents\Arduino\sketch_jul19a\sketch_XXXXXXXXXo:7:0:
C:\Users\HP\Documents\Arduino\libraries\HX711_ADC\src/HX711_ADC.h:47:7: note: candidate: int HX711_ADC::start(unsigned int)
int start(unsigned int t); // start and tare one HX711
^~~~~
C:\Users\HP\Documents\Arduino\libraries\HX711_ADC\src/HX711_ADC.h:47:7: note: candidate expects 1 argument, 2 provided
exit status 1
no matching function for call to 'HX711_ADC::start(long unsigned int&, boolean&)'
在文件 -> 首选项开启
“编译过程中显示详细输出”选项
这份报告会包含更多信息。
作者,他给这句话标红了XXXXXXXXXXXart(stabilizingtime, _tare); 这是为什么。。。。
看一下库文件安装没,没安装的话就会这样
应该就试库文件没装,把开头的#include <HX711_ADC.h>
#include <.h>
HX711_ADC
EEPROM
在库管理中搜索安装下
不好意思,再问一下楼主 我库文件也安装了,但还是这样 。。。但我好像把这句话删掉又编译成功了 ,这句话有什么作用?
你这图片我有点看不清 ,如果不影响使用的话就没事儿,你先调一下校准值,看看能不能用 ,能用的话就不管他了
IDE 串口监视器乱码\(`Δ’)/
自行在库管里安装库文件
错误原因
错误信息指出,HX711_ADC::start 函数只接受一个参数,而代码中传递了两个参数(stabilizingtime 和 _tare)。这可能是由于库版本或函数签名的变化引起的。
解决方法
检查 HX711_ADC 库文档:确认 HX711_ADC 库的 start 方法的最新函数签名,并相应地修改代码。
更新库:确保你使用的是库的最新版本,可能已经修改了函数签名。
修改代码:根据库文档调整代码,使其符合新的函数签名。
示例修改
假设新的 start 方法只接受一个参数,以下是如何修改代码的示例:
cpp复制代码#include <HX711_ADC.h>// 引脚定义const int HX711_dout = 4; // 数据引脚const int HX711_sck = 5; // 时钟引脚HX711_ADC LoadCell(HX711_dout, HX711_sck);void setup() {
XXXXXXXXXgin(115200); delay(10);
XXXXXXXXXintln("Starting..."); unsigned long stabilizingtime = 2000; // 稳定时间
XXXXXXXXXXXgin();
XXXXXXXXXXXart(stabilizingtime); // 修改为只传递一个参数
XXXXXXXXXXXtCalFactor(696.0); // 设置校准因子}void loop() { static boolean newDataReady = 0; const int serialPrintInterval = 0; // 增加串口打印间隔
if (LoadCell.update()) newDataReady = true; if (newDataReady) { if (millis() > serialPrintInterval) { float i = XXXXXXXXXXXtData();
XXXXXXXXXint("Load_cell output val: ");
XXXXXXXXXintln(i);
newDataReady = 0;
}
}
}
解释
HX711_ADC 对象:创建了一个 LoadCell 对象。
setup() 函数:
初始化串口通信。
调用 XXXXXXXXXXXgin() 初始化 HX711。
调用 XXXXXXXXXXXart(stabilizingtime) 方法,传递稳定时间 stabilizingtime 作为唯一参数。
设置校准因子。
loop() 函数:
更新 LoadCell 状态。
如果有新的数据准备好,读取并打印。
检查库版本和文档
确保你使用的 HX711_ADC 库是最新版本,并查看库的文档或示例代码,确保函数调用符合最新的函数签名和用法。
通过这些调整,你应该能够解决 no matching function for call to 'HX711_ADC::start(long unsigned int&, boolean&)'
chat GPT4.0 不确定对不对
确实,还真的编译成功了,一开始最新的库下载不了,重新启动电脑后才可以下载,谢谢你
https://www.haofei.icu/list ChatGPT网站 如果没有访问次数直接换号
用这个可以吗
这个软件好。会写代码的
我修改了一下 更加人性化了。。。。但是。。。。
换开发板了