Задержка выполнения функции

trifon
Offline
Зарегистрирован: 12.09.2015

  У меня вопрос по задержке. При падении освещённости загорается светодиод, горит 10 секунд и гаснет. Как это будет с помощью delay понятно. Так же мне понятно, что нужно применить millis. Но написать код никак не получается. Есть куча примеров по millis, но они все связаны с мерцанием, т.е. включением/отключением.

  Прошу помочь с кодом.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

покажите свои труды - в которых "не получается"

trifon
Offline
Зарегистрирован: 12.09.2015
const int ledPin =  3;     
int ledState = LOW;          
unsigned long previousMillis = 0;      
const long interval = 5000;   
int ldr = A0; // Фоторезистор

void setup() {
  
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  
}

void loop()
{
  if (analogRead(ldr) < 500) 
     {
      unsigned long currentMillis = millis();
      if(currentMillis - previousMillis >= interval) 
      {
        previousMillis = currentMillis;   
        digitalWrite(ledPin, HIGH);
     }
    }
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
// const int ledPin =  3; экономим память
#define ledPin 3
// int ledState = LOW;  экономим память
unsigned long sekundomer = 0;      
// const long interval = 5000;  экономим память
const int interval = 5000; // int - 0...65535
// int ldr = A0; // Фоторезистор  экономим память
#define ldr A0
boolean flagLed = false;
//=============================================================
void setup()
{
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
}
//=============================================================
void loop()
{
  if ( analogRead( ldr ) < 500 && ! flagLed )
    {
      flagLed = true;
      sekundomer = millis();
      digitalWrite( ledPin, HIGH );
    }

  if ( flagLed && millis() - sekundomer > interval )
    {
      digitalWrite( ledPin, LOW );
      flagLed = false;
    }
    
  while ( analogRead( ldr ) < 500 && ! flagLed )
    {
      // гистерезис - крутимся пока освещённость не станет более 499
    }
}
//=============================================================
// кататак :) - возможна ошибка.....

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#define ledPin 3
unsigned long sekundomer = 0;      
const int interval = 5000;
#define ldr A0
boolean flagLed = false;
//=============================================================
void setup()
{
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
}
//=============================================================
void loop()
{
  if ( analogRead( ldr ) < 500 && ! flagLed )
    {
      flagLed = true;
      sekundomer = millis();
      digitalWrite( ledPin, HIGH );
    }

  if ( flagLed && millis() - sekundomer > interval )
    {
      digitalWrite( ledPin, LOW );
      flagLed = false;
    }
    
  while ( analogRead( ldr ) < 500 && ! flagLed )
    {
      // гистерезис - крутимся пока освещённость не станет более 499
      // это ловушка....
      // от повторного включения светодиода до восстановления освещённости
      // или надо не так ?
    }
}
//=============================================================
// кататак :) - возможна ошибка.....

 

trifon
Offline
Зарегистрирован: 12.09.2015

Код работает. Большое спасибо.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

НО , из-за строки 28 программа ничего делать не будет !!!!!!!!!
....будет ждать повышения освещённости - и всё

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

определите ещё один флаг - "возврат из сумерек на свет" - избавитесь от while() и в лупе можно ещё много полезного будет делать !
...удачи :)