把数据保存到Arduino,便于后续分析

编程语言 2026-07-10

我有一块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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章