Emonlib 电流增加与 MKR 1300 上的 RTC 不同步之间是否存在相关性?

物联网 阿杜伊诺 劳拉 罗拉万
2021-06-02 15:53:48

我遇到了这个奇怪的问题,当监测到的电流超过 27A 时,我的数据发送间隔会被搞砸。基本上,它不断增加我的间隔几秒钟,这是一个例子:

数据库:

        Current    |   Time
        16A         |   10:00:30
        16A         |   10:10:30
        16A         |   10:20:30
        ....
        16A         |   12:00:30
        27A         |   12:10:35
        27A         |   12:20:40
        27A         |   12:30:45
        .....
        27A         |   13:21:05
        16A         |   13:31:05
        16A         |   13:41:05
        ....

我使用的 arduino 是集成了 RTC 的 MKR 1300。这是可见性的代码: 另外,顺便说一下,R​​TC 库是 RTCZero。

/* INITIAL_TIME */
const byte seconds = 0;
const byte minutes = 0;
const byte hours = 0;
const byte day = 17;
const byte month = 12;
const byte year = 18;


byte second_alarm = 0;
byte minute_alarm = 0;
byte hour_alarm = 0;
int SEND_LOOP = 10; //5

float totalKW;
int time_running = 0;
int alarm_Triggered = 0;
int correction_var = 0;
long seq_value = 0;

void setup()
  LoRa Network agreement code (removed)

  analogReadResolution(9);
  emon1.current(1, 90.5);  
  emon2.current(2, 90.3);
  emon3.current(3, 90.3);
  time_running = 0;

  rtc.begin(); // initialize RTC

  rtc.setAlarmTime(hour_alarm, minute_alarm, second_alarm);
  rtc.enableAlarm(rtc.MATCH_HHMMSS);
  rtc.attachInterrupt(triggerAlarm);

  // Set the time
  rtc.setHours(hours);
  rtc.setMinutes(minutes);
  rtc.setSeconds(seconds);

  // Set the date
  rtc.setDay(day);
  rtc.setMonth(month);
  rtc.setYear(year);


}

void loop() {
  if (alarm_Triggered == 1) {
    dataMonitor();
    alarm_Triggered = 0;
  }
}

void dataMonitor() {

  float totalWatt = 0;

  float Irms1 = emon1.calcIrms(600);
  if (Irms1 < 0.3) Irms1 = 0;
  float Watt1 = Irms1 * 230;

  float Irms2 = emon2.calcIrms(600);
  if (Irms2 < 0.3) Irms2 = 0;
  float Watt2 = Irms2 * 230;

  float Irms3 = emon3.calcIrms(600);
  if (Irms3 < 0.3) Irms3 = 0;
  float Watt3 = Irms3 * 230;

  totalWatt = Watt1 + Watt2 + Watt3;
  totalKW = totalKW + totalWatt / 1000;

  sendDataChecker();
  setAlarm();
  time_running = time_running + 1;

}

void sendDataChecker() {
  if (time_running >= SEND_LOOP) {
    String msg = String(seq_value)+";"+String(totalKW);
    int err;
    modem.beginPacket();
    modem.print(msg);
    err = modem.endPacket(true);
    if (err > 0) {
      //message sent correctly
      time_running = 0;
      totalKW = 0;
      seq_value++;
    } else {
      Serial.println("ERR");
      time_running = 0;
    }

    delay(1000);

    if (!modem.available()) {
      //Now downlink message
      return;
    } else {
      char rcv[64] {};
      int i = 0;
      while (i < 64 && modem.available()) {
        rcv[i++] = (char)modem.read();
      }
      String data_received = rcv;
      if (data_received == "") {
        Serial.println("Null");
      } else {
        //JsonObject& root = jsonBuffer.parseObject(data_received);
        correction_var = data_received.toInt();
      }
    }
  }
}


void setAlarm() {
  int INTERVAL = 60; //60
  second_alarm += INTERVAL;
  minute_alarm += second_alarm / 60;
  second_alarm %= 60;
  hour_alarm += minute_alarm / 60;
  minute_alarm %= 60;
  hour_alarm %= 24;

  rtc.setAlarmTime(hour_alarm, minute_alarm, second_alarm);
  correct();
}

void correct() {
  if (correction_var == 0) {
    return;
  }
  if (correction_var == 1) {
    rtc.setSeconds(rtc.getSeconds() + 1);
    correction_var = 0;
    return;
  }
  if (correction_var == -1) {
    if ((rtc.getSeconds() - 1) < 1) {
      rtc.setSeconds(0);
      correction_var = 0;
      return;
    } else {
      rtc.setSeconds(rtc.getSeconds() - 1);
      correction_var = 0;
      return;
    }
  }
  correction_var = 0;
  return;
}

void triggerAlarm() {
  alarm_Triggered = 1;
}
0个回答
没有发现任何回复~