把数据保存到Arduino,便于后续分析
我有一块Arduino Uno,配有红外温度计(GY-906)。我有一个简单的记录温度的例程。
我想能够在一段时间内分析温度变化,但还没想清楚如何写入、保存和访问数据?
我只想每分钟记录mlx.ReadObjectTempF(),这样大约运行一个小时后,我就能得到平均温度等(可以通过Excel或其他软件来处理,而不是让Arduino本身来做)。
不使用SD卡可以实现吗?我知道Uno的内存并不富裕,但希望这个简单的数据点(大概最多3~4小时的数据)是可行的?我应该怎么做,才能把数据写入,然后再从一个(例如)txt文件中读取?
#include <Adafruit_MLX90614.h>
#define LED 13
const int piezoPin = 8;
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
void setup() {
Serial.begin(9600);
while (!Serial);
if (!mlx.begin()) {
Serial.println("Error connecting to MLX sensor. Check wiring.");
while (1);
};
}
void loop() {
Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF());
Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");
Serial.println();
// Here's where I'd like to save the `mlx.readObjectTempF()`
delay(500);
}
解决方案
某些微控制器,例如Uno,拥有一种称为EEPROM的存储类型。
Arduino Uno具有 512字节的EEPROM(在某些板子上容量会更多),如果你使用8 位整数,那么就是512个数据点。
如果你每分钟测量一次,那就是大约8.5小时的数据。
EEPROM的好处是即使板子重置,数据也不会丢失。
下面给出一个可行的做法示例:
// snip...
#include <EEPROM.h>
void print_values();
void setup() {
// snip...
print_values();
}
uint16_t write_addr = 0
void loop() {
// snip...
double precise_temp = mlx.readObjectTempF();
// ...print precise temp to serial...
// Discard decimals and convert to signed integer
int8_t storeable_temp = static_cast<int8_t>(precise_temp);
// If write address is above maximum, do nothing and print error to serial
// Otherwise, write at EEPROM address and increment
if (write_addr >= EEPROM.length())
Serial.println("Data Overflowed!");
else {
EEPROM.write(write_addr, storeable_temp);
write_addr++;
}
delay(1000);
}
// Prints all of stored EEPROM in CSV format
void print_values() {
Serial.println("---");
Serial.println("addr,temp");
for (int i = 0; i < EEPROM.length(); i++) {
Serial.print(i);
Serial.print(",");
int8_t temp = static_cast<int8_t>(EEPROM.read(i));
Serial.println(temp);
}
Serial.println("---");
}
不幸的是,使用8 位整数会限制结果的精度。如果愿意,你也可以使用其他数据类型,只是会增加所需的存储空间。
要从板子读取数值,可以连接串口监视器。Uno的自动复位系统会在串口监视器打开时重新启动程序,数值会被打印到串口。
你可能想在EEPROM中设定一个地址,用于记录写入器最后一次写到的索引,以便了解实际收集了多少数据,以及与上次相比的垃圾数据,并确保每次上电时程序不会覆盖已有数据。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。