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