Сброс задержки перед началом задержки arduino
- Войдите на сайт для отправки комментариев
Сб, 28/03/2020 - 19:19
Как можно вывернуться и сделать задержку, которая будет работать по принципу перезапуска при вызове задержки, до того, как она вызовет событие?
Например дошло до delay, пошел таймер отсчитывать 500мс, а тут прилетает следующее срабатывание delay, и она должна сбросить свой таймер и начать отсчитывать заного, а если delay был вызван и последующего срабатывания delay нету, то она должна дойти до 500мс и вызвать положенное ей событие
Так полагаю нужно обычный таймер вложить в тот таймер который уже есть или же можно как то обойтись другим методом?
Суть кода:
Читать каждые 50мс напряжение u1, если значение превысило то сразу записать 0, если же напряжение упало, то через 500мс записать 1, если во время того как идет отсчет 500мс, появится опять высокое напряжение, то сделать сброс счетчика на 500мс
#include <MsTimer2.h> #define MEASURE_PERIOD 500 // время периода измерения #define R1 17.8 // сопротивление резистора R1 #define R2 5.5 // сопротивление резистора R2 const int vg = 2; const int led = 3; int timeCount; // счетчик времени float u1; // измеренные напряжения float u2; // измеренные напряжения int onof; void timerInterupt() { timeCount++; } void setup() { Serial.begin(9600); MsTimer2::set(1, timerInterupt); MsTimer2::start(); pinMode(vg,OUTPUT); pinMode(led,OUTPUT); } void loop() { if ( timeCount >= MEASURE_PERIOD ) { timeCount= 0; u1= ((float)analogRead(A0)) * 5. / 1024. / R2 * (R1 + R2); if (u1 > 7.35) {digitalWrite(vg,LOW); digitalWrite(led,HIGH); onof=1;} else //delay(500); {digitalWrite(vg,HIGH); digitalWrite(led,LOW); onof=0;} // отладка, вывод значений в COM порт Serial.print("V"); Serial.print(onof, 2); Serial.print("-"); Serial.print(u1, 2); Serial.print("T"); } }
Зачем так сложно-то? Прерывания, счетчик, таймер... Молоток потеряли, гвозди микроскопом забиваете?
Совершенно непонятно, зачем вам нужен какой-то таймер, отсчитывающий по 1 мс, если в ардуино он уже и так есть - миллис
Это первый мой скетч), что то нашел, подправил как мне нужно, так и работает.
Именно по тому, что начинающий в ардуино, задал вопрос, как реализовать все это правильно, но даже то, что есть, оказалось не оптимально, возможно от части не правильно.
Нужно просто читать сигнал каждые 50мс и устанавливать сигнал на выход, а снимать сигнал можно только не раньше чем 500мс.
SaperEx, в известном примере blink without delay просто обновляйте previousMillis в те моменты, когда нужно начать отсчет интервала с начала.
спасибо, сделал