Сброс задержки перед началом задержки arduino

SaperEx
Offline
Зарегистрирован: 28.03.2020
Как можно вывернуться и сделать задержку, которая будет работать по принципу перезапуска при вызове задержки, до того, как она вызовет событие?
 
Например дошло до 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");
  } 
}

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Зачем так сложно-то? Прерывания, счетчик, таймер... Молоток потеряли, гвозди микроскопом забиваете?

Совершенно непонятно, зачем вам нужен какой-то таймер, отсчитывающий по 1 мс, если в ардуино он уже и так есть - миллис

SaperEx
Offline
Зарегистрирован: 28.03.2020

Это первый мой скетч), что то нашел,  подправил как мне нужно,  так и работает. 

Именно по тому,  что начинающий в ардуино,  задал вопрос,  как реализовать все это правильно,  но даже то,  что есть,  оказалось не оптимально,  возможно от части не правильно.

 

Нужно просто читать сигнал каждые 50мс и устанавливать сигнал на выход,  а снимать сигнал можно только не раньше чем 500мс. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SaperEx, в известном примере blink without delay просто обновляйте previousMillis в те моменты, когда нужно начать отсчет интервала с начала.

SaperEx
Offline
Зарегистрирован: 28.03.2020

спасибо, сделал

 

#define R1 17.8  // сопротивление резистора R1
#define R2 5.5 // сопротивление резистора R2

const int vg    =   2; 
const int led    =   3;

long previousMillis = 0;
long interval = 500;

float u1;   // измеренные напряжения
float u2;   // измеренные напряжения
int onof;


void setup()
{
  //Serial.begin(9600);
  pinMode(vg,OUTPUT);
  pinMode(led,OUTPUT);
}

void loop()
{

unsigned long currentMillis = millis();
    
u1=((float)analogRead(A0))*5./1024./R2*(R1+R2);

if (u1 > 7.45)
{
digitalWrite(vg,LOW);
previousMillis = currentMillis;
digitalWrite(led,HIGH);
onof=1;
}


if(currentMillis - previousMillis > interval)
{

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");
  } 
}