Измерить количество циклов и время цифрового входа

В настоящее время я работаю над проектом, который считывает цифровой входной сигнал с машины. Работа машины следующая:

Когда форма закрывается, машина подает сигнал «ВЫСОКИЙ», когда форма открыта, машина подает сигнал «НИЗКИЙ». Цикл считается одним циклом, когда форма закрывается --> открывается --> закрывается.

Моя цель — подсчитать цикл и время каждого цикла. Я борюсь, когда входной сигнал переходит от ВЫСОКОГО к НИЗКОМу. Благодарю вас за помощь в работе над этим проектом.

int MoldInput = 2;
int MoldState = 0;
int lastMoldState = 0;
int CycleTimeCounter = 0;
int CycleCount = 0;
unsigned long CycleTime;
volatile unsigned long TimeTemp1 = 0;
volatile unsigned long TimeTemp2 = 0;
void setup() {
  // поместите сюда свой код установки для однократного запуска:
  pinMode (MoldInput,INPUT);
  attachInterrupt(0, RealTimeMoldClose, RISING);
  Serial.begin(115200);
}

void loop() {
  // поместите сюда свой основной код для многократного запуска:
  Serial.println(CycleTime);
}
void RealTimeMoldClose(){
  unsigned long t = millis();
  TimeTemp2 = t;
  CycleTime = TimeTemp2 - TimeTemp1;
  TimeTemp1 = TimeTemp2;
}

, 👍1

Обсуждение

Что подключено к контакту 5, а что к контакту 2? Для времени цикла сохраните значение в миллисах, и в следующий раз, когда MoldState перейдет в ВЫСОКИЙ уровень, вычтите предыдущее значение в миллисах из текущего значения в миллисах., @Jot

Это моя ошибка. К контакту 2 подключен только цифровой сигнал., @Huỳnh Tùng

Не уверен, но [pulseIn](https://www.arduino.cc/reference/en/language/functions/advanced-io/pulsein/) кажется подходящим, @Jaromanda X

голосование за представление правильно отформатированного списка кодов, @jsotola

Я обновил новый код от себя после того, как вспомнил функцию AttachInterrupt. Цените ваши комментарии по этому поводу., @Huỳnh Tùng


1 ответ


Лучший ответ:

1

Вам не нужно ничего делать с HIGH на LOW. Например, если вы подсчитываете, как часто открывается дверь, вам также не нужно считать, как часто она закрывается, поскольку она должна закрыться, прежде чем снова откроется.

Я не вижу смысла в прерывании, поскольку ваш код не делает ничего, кроме проверки того, произошло ли прерывание, поэтому он также может проверять, изменились ли входные данные. Этот код проще:

const int MoldInput = 2;

int lastMoldState = 0;
unsigned long startTime = 0;
unsigned long TotalTime = 0;
unsigned long CycleTimeCounter = 0;

void setup() {
  pinMode (MoldInput, INPUT);
  Serial.begin(115200);
}

unsigned long lastReportedCycleCount = 0;

void loop() {
  int MoldState = digitalRead(MoldInput);
  if (MoldState != lastMoldState) {
    if (MoldState == HIGH) {
      CycleTimeCounter++;  // подсчитываем случаи, когда оно было высоким
      TotalTime += millis() - startTime;  // суммируем временной интервал
      startTime = millis ();
      delay (100);    // устранение дребезга
    }  // конец состояния ВЫСОКИЙ
    lastMoldState = MoldState;
  }   // конец изменения состояния

  if (CycleTimeCounter % 10 == 0 && CycleTimeCounter != lastReportedCycleCount)
    {
    Serial.print (F("Average time after "));
    Serial.print (CycleTimeCounter);
    Serial.print (F(" cycles is "));
    Serial.print (TotalTime / CycleTimeCounter);
    Serial.println (F(" milliseconds"));
    lastReportedCycleCount = CycleTimeCounter;
    }
} // конец цикла
,