Почему не корректно работает задержка ?

pavelcdn
Offline
Зарегистрирован: 24.08.2019

пробую использовать millis для запуска двух не связанных кусочков кода, но работает то через раз то вообще фиг пойми как)) подскажите где косяк?

#define rele_dom 9    // пин реле в доме
#define rele_ul 6    // пин реле на улице
#define dsveta 7     // пин датчика света
#define ddvij 2  // датчик движения
#define gerkon 5  // геркон
#define knopka 3  // кнопка

// test
// Variables will change:
long previousMillis = 0;        // храним время последнего переключения светодиода
long previousMillis2 = 0;
bool one = false;

// /test
void setup() {
  Serial.begin(9600);

  pinMode(rele_dom, OUTPUT);
  pinMode(rele_ul, OUTPUT);

  digitalWrite(rele_dom, HIGH); // выключаем реле по умолчанию
  digitalWrite(rele_ul, HIGH);

  pinMode(dsveta, INPUT);
  pinMode(gerkon, INPUT);
  pinMode(knopka, INPUT);


}

void loop()
{
  Serial.println(digitalRead(dsveta));
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();

  if (digitalRead(dsveta) == 1) {
    digitalWrite(rele_dom, LOW);
  } else {
    
    if (currentMillis - previousMillis > 30000) { // время в милисекундах
      previousMillis = currentMillis;
      digitalWrite(rele_dom, HIGH);
    }
    
  }


  if (digitalRead(dsveta) == 1) {
    digitalWrite(rele_ul, LOW);
  } else {
    
    if (currentMillis - previousMillis2 > 4000) { // время в милисекундах
      previousMillis2 = currentMillis;
      digitalWrite(rele_ul, HIGH);
    }
    
  }
}

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

написанное фиг пойми как, именно так и работает. 

Honey
Offline
Зарегистрирован: 01.10.2020

Замените

long previousMillis = 0;        // храним время последнего переключения светодиода
long previousMillis2 = 0;

На

unsigned long previousMillis = 0;        // храним время последнего переключения светодиода
unsigned long previousMillis2 = 0;
DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Honey пишет:

Замените

long previousMillis = 0;        // храним время последнего переключения светодиода
long previousMillis2 = 0;

На

unsigned long previousMillis = 0;        // храним время последнего переключения светодиода
unsigned long previousMillis2 = 0;

здесь это как мёртвому припарки.

rkit
Offline
Зарегистрирован: 23.11.2016

Наверно счетчики отключения нужно стартовать в момент включения, и завершать после этого, а не крутить вне зависимости от ничего.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

на самом деле не такая простая задача )))

проверь, может это то, что и требовалось?
в железе не проверял, но  скомпилировалось

#define rele_dom 9    // пин реле в доме
#define rele_ul 6    // пин реле на улице
#define dsveta 7     // пин датчика света
#define ddvij 2  // датчик движения
#define gerkon 5  // геркон
#define knopka 3  // кнопка

// test
// Variables will change:
long previousMillis = 0;        // храним время последнего переключения светодиода
long previousMillis2 = 0;
bool one = false;
byte flag_ul = 0;
byte flag_dom = 0;
// test

void setup() {
  Serial.begin(9600);

  pinMode(rele_dom, OUTPUT);
  pinMode(rele_ul, OUTPUT);

  digitalWrite(rele_dom, HIGH); // выключаем реле по умолчанию
  digitalWrite(rele_ul, HIGH);

  pinMode(dsveta, INPUT);
  pinMode(gerkon, INPUT);
  pinMode(knopka, INPUT);
}

void loop()
{
  Serial.println(digitalRead(dsveta));
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
 if(flag_dom && flag_ul && digitalRead(dsveta)){ // светало )))
  flag_dom = 0; flag_ul = 0;}
 
  if (digitalRead(dsveta) == 1) {
    digitalWrite(rele_dom, LOW);
    digitalWrite(rele_ul, LOW);    // если светло всё выключено
  } else {                         // вечерело
    if(!digitalRead(rele_dom) && !flag_dom){
                                   // свет в доме был выключен
    digitalWrite(rele_dom, HIGH);  // включили свет
    previousMillis = currentMillis;// запомнили во сколько включили
    }else{                         // свет включен, не порали выключать 
    if (currentMillis - previousMillis >= 30000) { // время в милисекундах
    digitalWrite(rele_dom, LOW);   // пора - выключаем 
    flag_dom = 1;
     }
    }
    if(!digitalRead(rele_ul)&& !flag_ul){
    digitalWrite(rele_ul, HIGH);  
    previousMillis2 = currentMillis;
    }else{
    if (currentMillis - previousMillis2 > 4000) { // время в милисекундах
    digitalWrite(rele_ul, LOW);
    flag_ul = 1; 
      }
    }
  }
}

 

Komandir
Offline
Зарегистрирован: 18.08.2018

экстрасексы набежали ...

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Komandir пишет:

экстрасексы набежали ...

это Знахари анализ мочи на вкус делают, а мы экстрасенсы общаемся только с Хрустальным шаром )))