首页 文章

每隔(X)分钟保存Arduino UNO串行数据

提问于
浏览
0

我在Arduino中有一个基本草图,每秒通过串行发送数据,并使用Processing 2.1进行可视化 .

From Arduino

"Serial.println();  // after all the sensors have been read print a newline     and carriage return
  delay(1000);  // delay by # milliseconds"

In Processing:

Serial myPort; 
PrintWriter output; //print serial output from Arduino
void setup() { 
size(480, 360); 

output = createWriter( "saved-serial-data.txt" ); //save file as ""
println(Serial.list());  
myPort = new Serial(this, "/dev/cu.usbmodem1411", 9600);
myPort.bufferUntil('\n');
} 

void draw() { 
output.println(inString);
}

我能够保存文件,但它是空的,因为我不知道如何根据时间启动触发器来保存和记录数据 . 我见过基于按键的示例(例如:void keyPressed(){//按一个键来保存数据)但是我的草图只是循环而且没有按键需要 . 我希望每隔5分钟保存一次 .

有任何想法吗?

2 回答

  • 0

    然后在 draw() 添加一个计时器,检查是否已经过了5分钟 . 如果是,那么 flush()close() 你的输出 . 我相信您可能必须在关闭后重新创建输出 .

  • 0

    我将假设您知道如何填充 inString ,尽管您尚未发布执行该操作的代码 .

    但假设有,有几种方法可以设置计时器 .

    您可以使用millis()功能 . 此函数返回程序运行的毫秒数,因此您可以使用它来记录开始和结束时间,然后使用这些时间来计算已用时间 . 如果已用时间超过某个阈值,则可以触发事件 . 像这样的东西:

    int prevFiredTime = 0;
    int msDelay = 10000; //10 seconds
    
    void draw(){
       int time = millis();
       int elapsed = time - prevFiredTime;
       if(elapsed > msDelay){
          fire();
          prevFiredTime = time;
       }
    }
    
    void fire(){
       output.println(inString);
    }
    

    您也可以使用frameCount函数 . 它类似于 millis() 函数,只保存自程序启动以来绘制的帧数 . 您可以使用它来执行每个X帧的操作,如下所示:

    int frameDelay = 600; //10 seconds
    
    void draw(){
       if(frameCount % frameDelay == 0){
          fire();
       }
    }
    
    void fire(){
       output.println(inString);
    }
    

    您可能需要修改一下才能获得所需的确切行为,但这些是在Processing中设置计时器的基本方法 .

相关问题