Таймер в нутри условия if
- Войдите на сайт для отправки комментариев
Вс, 12/03/2017 - 13:55
Добрый день, подскажите почему таймер на 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 сек, как собственно поправить?
А не лучше вынести из первого условия
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); }А не лучше вынести из первого условия
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); }Спасибо, но так тоже не работает.
А не лучше вынести из первого условия
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); }Спасибо, но так тоже не работает.
Че неработает? Реле не влючается или не выключается?
Че неработает? Реле не влючается или не выключается?
Не выключается по задонному времени, а если из первого условия в вашем примере убрать
previousMillis = millis();то включается и сразу выключается реле
У вас previousMillis объявлена как long а millis() возвращает unsigned long которое при запихивании в long может давать отрицательные значения которые в прорверке условия не вычтутся а сложатся с millis() и условие сразу выполнится.
У вас 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); } }Вставьте в каждый if по сериалу, с отображением критичных значений и проанализируйте, где отрабатывает некорректно.
52 строку попробуйте изменить как temp1 > 26.0 ....
После того как в 59 строке в EEPROM запишется 2 она там останется навечно т.к. в loop нет иного оператора записи и условие в 52 строке больше никогда не выполнится.