在 Arduino 上使用中断记录实时数据收集

Recording real time data collection with interrupt on Arduino

我一直致力于使用 Arduino 中断收集流量,我想使用实时时钟为数据添加时间戳。

我使用 Arduino 示例将两个草图单独工作,但是当我将它们组合在一起时,它只写入串行端口一次,我不确定为什么。

一旦我有了脉冲计数,就会将其保存到 SD 卡中以进行数据处理。

#include "RTClib.h"

RTC_DS1307 rtc;
int Pulses =2;            //Digital Pin 2 on Uno
volatile int pulsecount;  //Volatile integer to store pulse count in

void setup() {
  Serial.begin(9600); 
  rtc.begin();            //start rtc
    
  pinMode(Pulses, INPUT); //Make Pin2 Input
  attachInterrupt(digitalPinToInterrupt(Pulses), CountPulses ,FALLING); //Use interrupt on "Pulses" Pin, count on the falling edge, store in CountPulses
}

//create a function that adds up the pulsecount
void CountPulses() {
  pulsecount++;
}

void loop() {
  DateTime time = rtc.now();  //Get the time from RTC
  Serial.print(String("DateTime::TIMESTAMP_TIME:\t") + time.timestamp(DateTime::TIMESTAMP_TIME)); //Print the time to serial monitor

  pulsecount = 0; // set initial count to zero
  interrupts();   // start interrupt
  delay(5000);    // count pulses for 5 seconds
  noInterrupts(); // stop interrupt

  Serial.print(",");  
  Serial.println(pulsecount); //Feed pulse count to serial

  Serial.flush(); //flush the serial port to avoid errors in counting
}

函数noInterrupts()停止所有中断,而不仅仅是您设置的中断。执行此操作时,任何在后台使用中断的 Arduino 库代码都可能停止工作。

您应该启用和禁用您自己设置的中断。

尝试将 interrupts(); 替换为 attachInterrupt(digitalPinToInterrupt(Pulses), CountPulses, FALLING); 并将 noInterrupts(); 替换为 detachInterrupt(digitalPinToInterrupt(Pulses));

您还可以从 setup() 中删除 attachInterrupt();不再需要它了。