Таймер в нутри условия if

avgaz
Offline
Зарегистрирован: 23.09.2014

Добрый день, подскажите почему таймер на millis() не работает в нутри условия

пример

long previousMillis = 0; 
long interval = 4000;

вот код для void loop(void)

if (temp1 > 27 && EEPROM.read(eprmotor) == 0){
digitalWrite(openpin,LOW);
if(millis() - previousMillis > interval ){
previousMillis = millis();
EEPROM.write(eprmotor, 1);
digitalWrite(openpin, HIGH);
}
}

Суть данного когда, когда выполняется условоие, что температура больше 27г и в памяти записано что положение 0 срабатывает фукция которая включает реле и выключает через 4 сек но без задержки работы основной программы то есть без delay.

Но проблема в том что когда условия срабатывает то таймер не работает вернее тоже сразу срабатывает без задержки в 4 сек, как собственно поправить?

JasKo
Offline
Зарегистрирован: 21.11.2015

А не лучше вынести из первого условия

  if (temp1 > 27 && EEPROM.read(eprmotor) == 0){
    digitalWrite(openpin,LOW);
    previousMillis = millis();
  }
  if(!digitalRead(openpin) && millis() - previousMillis > interval ){
    // Если реле включено и прошло 4 сек с момента включения - выключаем реле и пишем в память 1
    previousMillis = millis();
    EEPROM.write(eprmotor, 1);
    digitalWrite(openpin, HIGH);
  }

 

avgaz
Offline
Зарегистрирован: 23.09.2014

JasKo пишет:

А не лучше вынести из первого условия

  if (temp1 > 27 && EEPROM.read(eprmotor) == 0){
    digitalWrite(openpin,LOW);
    previousMillis = millis();
  }
  if(!digitalRead(openpin) && millis() - previousMillis > interval ){
    // Если реле включено и прошло 4 сек с момента включения - выключаем реле и пишем в память 1
    previousMillis = millis();
    EEPROM.write(eprmotor, 1);
    digitalWrite(openpin, HIGH);
  }

 

Спасибо, но так тоже не работает.

JasKo
Offline
Зарегистрирован: 21.11.2015

avgaz пишет:

JasKo пишет:

А не лучше вынести из первого условия

  if (temp1 > 27 && EEPROM.read(eprmotor) == 0){
    digitalWrite(openpin,LOW);
    previousMillis = millis();
  }
  if(!digitalRead(openpin) && millis() - previousMillis > interval ){
    // Если реле включено и прошло 4 сек с момента включения - выключаем реле и пишем в память 1
    previousMillis = millis();
    EEPROM.write(eprmotor, 1);
    digitalWrite(openpin, HIGH);
  }

 

Спасибо, но так тоже не работает.

Че неработает? Реле не влючается или не выключается?

avgaz
Offline
Зарегистрирован: 23.09.2014

JasKo пишет:

Че неработает? Реле не влючается или не выключается?

Не выключается по задонному времени, а если из первого условия в вашем примере убрать

previousMillis = millis();

то включается и сразу выключается реле

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

У вас previousMillis объявлена как long а millis() возвращает unsigned long которое при запихивании в long может давать отрицательные значения которые в прорверке условия не вычтутся а сложатся с millis() и условие сразу выполнится.

avgaz
Offline
Зарегистрирован: 23.09.2014

Alex_Sk пишет:

У вас previousMillis объявлена как long а millis() возвращает unsigned long которое при запихивании в long может давать отрицательные значения которые в прорверке условия не вычтутся а сложатся с millis() и условие сразу выполнится.

Поменял, но не чего не вышло ((

вот весь код

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 10 // пин дачика температуры
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float temp1 = 0;

#define openpin 7 // пин реле открытия //
#define colsepin 8 // пин реле закрытия//

unsigned long previousMillis = 0;   
unsigned long interval = 10000;      

unsigned long previousMillis2 = 0;  
unsigned long interval2 = 6000;


#include <EEPROM.h>
int eprmotor = 0; 

int gerconPin1 = 5; // пин геркона


void setup() {
  pinMode(openpin, OUTPUT); 
  digitalWrite(openpin, HIGH);
  
  pinMode(colsepin, OUTPUT);
  digitalWrite(colsepin, HIGH);
  
  pinMode(gerconPin1, INPUT);
  sensors.begin();
  Serial.begin(9600);
  EEPROM.write(eprmotor, 1);
  }

// the loop routine runs over and over again forever:
void loop() {
  
if (millis() - previousMillis2 > interval2) {
previousMillis2 = millis(); 
sensors.requestTemperatures(); 
temp1 = sensors.getTempCByIndex(0);
 }
int epr = EEPROM.read(eprmotor);
int gercon1 = digitalRead(gerconPin1);
Serial.println(temp1); 
Serial.println(epr);
Serial.println(gercon1);


if(temp1 > 26 && epr == 1){
  digitalWrite(openpin,LOW);
     }
  
if (digitalRead(openpin) == LOW && millis() - previousMillis > interval) {
previousMillis = millis();
digitalWrite(openpin,HIGH);
EEPROM.write(eprmotor, 2);
 } 


}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Вставьте в каждый if по сериалу, с отображением критичных значений и проанализируйте, где отрабатывает некорректно.
52 строку попробуйте изменить как temp1 > 26.0 ....

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

После того как в 59 строке в EEPROM запишется 2 она там останется навечно т.к. в loop нет иного оператора записи и условие в 52 строке больше никогда не выполнится.