基于Arduino Makefile:如何将传感器数据保存至电脑文件?
解决Arduino中
import processing.serial.*;的报错问题 嘿,这个报错其实很好理解——你用的那行import processing.serial.*;根本不是Arduino的代码!网上流传的那个《Save to CSV file from Arduino》方案,其实是Processing+Arduino的组合方案,不是纯Arduino代码。Processing是基于Java的可视化编程工具,import是Java/Processing的语法,而Arduino用的是C++,自然不认这个语法,所以才会报‘import’ does not name a type的错误。
下面给你两种可行的解决方案,按需选择:
方案1:用Processing配合Arduino接收数据并保存CSV
这就是网上那个方案的正确打开方式,分两步走:
第一步:编写Arduino端代码(负责发送温湿度数据)
修改你的Arduino代码,让它通过串口输出逗号分隔的温湿度数据,比如:
#include <DHT.h> #include <LiquidCrystal.h> // 假设你已经初始化了DHT传感器和LCD DHT dht(2, DHT11); LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); dht.begin(); lcd.begin(16, 2); } void loop() { float temp = dht.readTemperature(); float humidity = dht.readHumidity(); // 显示到LCD lcd.clear(); lcd.print("Temp: "); lcd.print(temp); lcd.print("C"); lcd.setCursor(0, 1); lcd.print("Hum: "); lcd.print(humidity); lcd.print("%"); // 串口输出CSV格式的数据 Serial.print(temp); Serial.print(","); Serial.println(humidity); delay(2000); }
用Arduino Makefile编译上传这个代码到Uno,确保串口能正常输出数据。
第二步:编写Processing端代码(负责接收并保存CSV)
打开Processing软件,新建一个项目,写入以下代码(注意修改串口名称为你的Arduino串口):
import processing.serial.*; Serial mySerial; PrintWriter output; void setup() { // 替换成你的Arduino串口,比如Linux是"/dev/ttyACM0" mySerial = new Serial(this, "/dev/ttyACM0", 9600); // 创建CSV文件,会保存在Processing项目文件夹里 output = createWriter("sensor_data.csv"); // 写入CSV表头 output.println("Temperature,Humidity"); } void draw() { if (mySerial.available() > 0) { String data = mySerial.readStringUntil('\n'); if (data != null) { data = data.trim(); // 写入数据到CSV output.println(data); // 实时刷新文件 output.flush(); } } } void stop() { // 关闭文件 output.close(); super.stop(); }
运行Processing代码,它就会从Arduino串口读取数据并写入CSV文件了。
方案2:纯Arduino用SD卡模块直接保存CSV
如果你不想用Processing,想让Arduino直接把数据写到CSV文件里,可以用SD卡模块:
硬件准备
- SD卡模块一块
- 接线:
- SD卡模块的CS引脚 → Arduino D10
- MOSI → D11
- MISO → D12
- SCK → D13
- VCC → 3.3V(不要接5V,会烧SD卡)
- GND → GND
Arduino代码
#include <DHT.h> #include <LiquidCrystal.h> #include <SD.h> DHT dht(2, DHT11); LiquidCrystal lcd(12, 11, 5, 4, 3, 2); File dataFile; void setup() { Serial.begin(9600); dht.begin(); lcd.begin(16, 2); // 初始化SD卡 if (!SD.begin(10)) { lcd.print("SD Card Error"); while (1); // 初始化失败就停在这里 } // 打开CSV文件,APPEND模式表示追加数据 dataFile = SD.open("sensor.csv", FILE_WRITE); if (dataFile) { // 如果是新文件,写入表头 if (dataFile.size() == 0) { dataFile.println("Temperature,Humidity"); } dataFile.close(); } else { lcd.print("Open File Fail"); while (1); } } void loop() { float temp = dht.readTemperature(); float humidity = dht.readHumidity(); // 显示到LCD lcd.clear(); lcd.print("Temp: "); lcd.print(temp); lcd.print("C"); lcd.setCursor(0, 1); lcd.print("Hum: "); lcd.print(humidity); lcd.print("%"); // 写入SD卡 dataFile = SD.open("sensor.csv", FILE_WRITE); if (dataFile) { dataFile.print(temp); dataFile.print(","); dataFile.println(humidity); dataFile.close(); } delay(2000); }
用Arduino Makefile编译这个代码时,确保SD库的路径被正确配置(一般Makefile会自动识别系统里的Arduino库),上传后就能直接在SD卡的sensor.csv里看到数据了。
内容的提问来源于stack exchange,提问作者Ramces Gonzalez




