Таймер обратного отсчета для скетча Arduino

Некоторое время назад я написал скетч для Arduino и пытаюсь добавить в него функциональность. По сути, мне нужен таймер обратного отсчета, который закрывает электромагнитный отсечной клапан через 30 секунд.


person ipatch    schedule 22.04.2014    source источник
comment
Это, вероятно, будет закрыто как слишком широкое. Вы хотите закрыть электромагнитный клапан через 30 секунд после чего? Нам нужно больше информации здесь.   -  person calumb    schedule 23.04.2014
comment
через 30 секунд после открытия.   -  person ipatch    schedule 23.04.2014


Ответы (1)


Вы можете сделать это, используя таймеры и прерывания, но требуется дополнительная информация (какая плата, какой процессор).

Примечание. F_CPU уже определено, если вы используете библиотеки Arduino (#define F_CPU 20000000U)

Примечание 2: вы можете использовать другой таймер, кроме TIMER0, так как он используется для отслеживания времени на Arduino.

#define GMilliSecondPeriod F_CPU / 1000

unsigned int gNextOCR = 0;
volatile unsigned long gMillis = 0;
bool valveOpened = false;

// This interruption will be called every 1ms
ISR(TIMER2_COMPA_vect)
{
  if(valve_open){
    gMillis++;
    if(gMillis >= 30000){
      close_valve();
      gMillis = 0;
    }
  }  

  gNextOCR += GMilliSecondPeriod;
  OCR2A = gNextOCR >> 8; // smart way to handle millis, they will always be average of what they should be
}

// Just call this function within your setup
void setupTime(){
  TCCR2B |= _BV(CS02);
  TIMSK2 |= _BV(OCIE0A);

  sei(); // enable interupts
}
person Tronix117    schedule 23.04.2014
comment
Этот код должен работать на Arduino UNO, просто убедитесь, что вы используете другой таймер, а не timer1, я обновил код с помощью timer2. - person Tronix117; 23.04.2014
comment
(Я хотел сказать, что это не timer0, потому что timer0 используется функцией millis и delay на Arduino) - person Tronix117; 24.04.2014
comment
Это правильная строка для 30 секунд BTW, if(gMillis >= 30000) - person ipatch; 24.04.2014
comment
Небольшой совет/примечание/информация, не связанная с вашим вопросом, с помощью этого кода вы теоретически можете заменить метод Arduino millis(), этот метод намного точнее, потому что он не вводит какую-то вторую смену каждый день. OCR2A = gNextOCR ›› 8, каждый раз изменять интервал прерывания, что приводит к тому, что каждая миллисекунда является средним значением того, чем они должны быть. Arduino просто считает линейно, а затем несколько раз увеличивает 2 мс вместо 1 мс. - person Tronix117; 25.04.2014