Помогите допилить или укажите на ошибку

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

Суть такова: при установке на охрану (пока имитируем нажатием кнопки), загорается диод на 5 сек. При этом кнопка не отпускается. При снятии с охраны (отпустили кнопку), так же загорается на 5 сек. По отдельности блоки работают. Как только два сразу начинаю испытывать, получается не все как хочется. 

#define Security        3 // вход установки на охрану
#define DRL             7 // выход для запуска ДХО и вежливого света
#define IGN             10 // вход зажигания 
boolean lock_key_flag=false; // Флаг для управления вежливым светом

// DRL------------------------------------------------------------------------------------------------
int Speed_DRL = 0;                   // Скорость при превышении которой включаются ДХО
int DoorKey = 5000;                 // Время, на которое включится вежливый свет при снятии охраны  5c
int DoorLock = 5000;               // Время, на которое включится вежливый свет при установке на охрану
boolean DoorKey_flag=true;         // Флаг вежливого света при снятии с охраны
boolean DoorLock_flag=true;        // Флаг вежливого света при установке на охраны
boolean Speed_DRL_flag=false;       // Флаг ДХО
unsigned long last_time_DoorKey; //Запоминает время когда установлена на охрану
unsigned long last_time_DoorLock; //Запоминает время когда снята охрана
//----------------------------------------------------------------------------------------------------

 void setup() 
 {
  Serial.begin (9600);
  
 
  pinMode(IGN,INPUT);                 digitalWrite(IGN, LOW);
  pinMode(Security,INPUT_PULLUP);     digitalWrite(Security, LOW);
  pinMode(DRL, OUTPUT);               digitalWrite(DRL, LOW);
  }

void loop()
{
     //DoorKey---------вежливый свет при снятии с охраны --------------------------------------------------
    
      if (DoorKey_flag==true && digitalRead(IGN)==false && digitalRead(Security)==true)
      { 
        last_time_DoorKey=millis();
        while(millis()<=DoorKey+last_time_DoorKey && digitalRead(Security)==false)
      {
       digitalWrite(DRL, HIGH); 
       Serial.println("ВЫКЛ");     
      }      
    
      }
      else 
      {         
      lock_key_flag=digitalRead(Security);    
      digitalWrite(DRL, LOW);
      }         
//----------------------------------------------------------------------------------------------------

//DoorLock---------вежливый свет при установке на охрану ---------------------------------------------
     
      if (DoorLock_flag==true && digitalRead(IGN)==false && digitalRead(Security)==true && lock_key_flag==false) 
      {        
      lock_key_flag=true;      
      last_time_DoorLock=millis();     
      
      while(digitalRead(Security)&& (millis()<=DoorLock+last_time_DoorLock))
      {
       digitalWrite(DRL, HIGH);
       Serial.println("ВКЛ");
      }
                   
      }
      else
      {         
      lock_key_flag=digitalRead(Security);    
      digitalWrite(DRL, LOW);
      }      
//----------------------------------------------------------------------------------------------------
      
      
     
    
     
 }

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Логику надо внятно расписать, тогда проще самому будет написать, а не склеивать 2 текста из инета, не понимая, как оне работають. 

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

ИМХО, блоки и по отдельности работать не должны. Например, в первом у вас условия в строках 31 и 36 противоречат другу другу, попадание программы в цикл while в строке 36 практически невозможно.

Главная ошибка - вы обновляете last_time_DoorKey и last_time_Doorlock при каждом проходе loop. поэтому задержки 5 секунд вы никогда не получите. Запоминать millis нужно только при первом заходе в блок.

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

b707 пишет:

ИМХО, блоки и по отдельности работать не должны. Например, в первом у вас условия в строках 31 и 36 противоречат другу другу, попадание программы в цикл while в строке 36 практически невозможно.

Главная ошибка - вы обновляете last_time_DoorKey и last_time_Doorlock при каждом проходе loop. поэтому задержки 5 секунд вы никогда не получите. Запоминать millis нужно только при первом заходе в блок.

Исправил вот так. Вроде как заработало. Вы так имели в виду или еще вариант есть???

void loop()
{
     //DoorKey---------вежливый свет при снятии с охраны --------------------------------------------------
           
        while(millis()<=DoorKey+last_time_DoorKey && digitalRead(Security)==false)
      {
       digitalWrite(DRL, HIGH); 
       Serial.println("ВЫКЛ");     
      }     
           
//----------------------------------------------------------------------------------------------------

//DoorLock---------вежливый свет при установке на охрану ---------------------------------------------
     
      if (DoorLock_flag==true && digitalRead(Security)==true && lock_key_flag==false) 
      {        
      lock_key_flag=true;      
      last_time_DoorLock=millis();     
      
      while(digitalRead(Security)&& (millis()<=DoorLock+last_time_DoorLock))
      {
       last_time_DoorKey=millis();
       digitalWrite(DRL, HIGH);
       Serial.println("ВКЛ");
      }
                   
      }
      else
      {         
      lock_key_flag=digitalRead(Security);    
      digitalWrite(DRL, LOW);      
      }     
//----------------------------------------------------------------------------------------------------

 

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

taha17 пишет:

Исправил вот так. Вроде как заработало. Вы так имели в виду или еще вариант есть???

по этому куску не понятно, правильно или нет. Например, в какой момент устанавливается значение last_time_DoorKey ?

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

b707 пишет:

taha17 пишет:

Исправил вот так. Вроде как заработало. Вы так имели в виду или еще вариант есть???

по этому куску не понятно, правильно или нет. Например, в какой момент устанавливается значение last_time_DoorKey ?

Вот переделал. Вроде.... Вроде как работает ))) 
Втрой раз вот пишу на форуме о помощи, и второй раз именно вы подсказываете. Весьма вам блогадарен за помощь начинающим )) 
#define Security        4 // вход установки на охрану
#define DRL             7 // выход для запуска ДХО и вежливого света
#define IGN             10 // вход зажигания - HIHG при включении зажигания
boolean lock_key_flag=false; // Флаг для управления вежливым светом

// DRL------------------------------------------------------------------------------------------------
int Speed_DRL = 0;                   // Скорость при превышении которой включаются ДХО
int DoorKey = 5000;                 // Время, на которое включится вежливый свет при снятии охраны  5c
int DoorLock = 5000;               // Время, на которое включится вежливый свет при установке на охрану
boolean DoorKey_flag=true;         // Флаг вежливого света при снятии с охраны
boolean DoorLock_flag=true;        // Флаг вежливого света при установке на охраны
boolean Speed_DRL_flag=false;       // Флаг ДХО
unsigned long last_time_DoorKey; //Запоминает время когда установлена на охрану
unsigned long last_time_DoorLock; //Запоминает время когда снята охрана
//----------------------------------------------------------------------------------------------------

 void setup() 
 {
  Serial.begin (9600);
  
 
  pinMode(IGN,INPUT);                 digitalWrite(IGN, LOW);
  pinMode(Security,INPUT_PULLUP);     digitalWrite(Security, LOW);
  pinMode(DRL, OUTPUT);               digitalWrite(DRL, LOW);
  }

void loop()
{
     //DoorKey---------вежливый свет при снятии с охраны --------------------------------------------------
      if (DoorKey_flag==true && digitalRead(Security)==true) last_time_DoorKey=millis();   
      while(millis()<=DoorKey+last_time_DoorKey && digitalRead(Security)==false)
      {
       digitalWrite(DRL, HIGH); 
       Serial.println("ВЫКЛ");     
      }     
           
//----------------------------------------------------------------------------------------------------

//DoorLock---------вежливый свет при установке на охрану ---------------------------------------------
     
      if (DoorLock_flag==true && digitalRead(Security)==true && lock_key_flag==false) 
      {        
      lock_key_flag=true;      
      last_time_DoorLock=millis();    
      while(digitalRead(Security)&& (millis()<=DoorLock+last_time_DoorLock))
      {
       
       digitalWrite(DRL, HIGH);
       Serial.println("ВКЛ");
      }
                   
      }
      else
      {         
      lock_key_flag=digitalRead(Security);    
      digitalWrite(DRL, LOW);      
      }     
//----------------------------------------------------------------------------------------------------
      
      
     
    
     
 }

 

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

вроде как да :)

Если не бросите ардуину - через пару месяцев вернитесь к этому коду - уверен, найдете, что переделать.

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

можно еще по одному вопросу получить консультацию ????)))