【问题标题】:Save Arduino UNO Serial Data every (X) minutes每 (X) 分钟保存一次 Arduino UNO 串行数据
【发布时间】:2024-01-17 05:08:02
【问题描述】:

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

来自 Arduino

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

处理中:

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 分钟保存一次。

有什么想法吗?

【问题讨论】:

    标签: java arduino processing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我假设您知道如何填充 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);
      }
      

      您可能需要稍作修改才能获得所需的确切行为,但这些是在处理中设置计时器的基本方法。

      【讨论】:

      • 谢谢凯文。这看起来像我需要的。我找不到解释清楚的版本。非常感谢。
      最近更新 更多