Измерить количество циклов и время цифрового входа
В настоящее время я работаю над проектом, который считывает цифровой входной сигнал с машины. Работа машины следующая:
Когда форма закрывается, машина подает сигнал «ВЫСОКИЙ», когда форма открыта, машина подает сигнал «НИЗКИЙ». Цикл считается одним циклом, когда форма закрывается --> открывается --> закрывается.
Моя цель — подсчитать цикл и время каждого цикла. Я борюсь, когда входной сигнал переходит от ВЫСОКОГО к НИЗКОМу. Благодарю вас за помощь в работе над этим проектом.
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;
}
@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;
}
} // конец цикла
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- 4-битный счетчик вверх и вниз
- Включить и отключить отдельные прерывания
- Проблема прерывания библиотеки MPU6050 Arduino Jeff Rowberg
- генерировать два сдвинутых по фазе ШИМ-импульса, запускаемых внешним сигналом с частотным разделением, с помощью Arduino uno?
- Включение прерывания Timer1 CompareA мгновенно вызывает прерывание?
- Таймер Arduino в режиме ctc 4 против 14
- Прерывания TIMER1 CTC не работают с avr-gcc
Что подключено к контакту 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