Помогите допилить или укажите на ошибку
- Войдите на сайт для отправки комментариев
Пнд, 04/12/2017 - 11:58
Суть такова: при установке на охрану (пока имитируем нажатием кнопки), загорается диод на 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);
}
//----------------------------------------------------------------------------------------------------
}
Логику надо внятно расписать, тогда проще самому будет написать, а не склеивать 2 текста из инета, не понимая, как оне работають.
ИМХО, блоки и по отдельности работать не должны. Например, в первом у вас условия в строках 31 и 36 противоречат другу другу, попадание программы в цикл while в строке 36 практически невозможно.
Главная ошибка - вы обновляете last_time_DoorKey и last_time_Doorlock при каждом проходе loop. поэтому задержки 5 секунд вы никогда не получите. Запоминать millis нужно только при первом заходе в блок.
ИМХО, блоки и по отдельности работать не должны. Например, в первом у вас условия в строках 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); } //----------------------------------------------------------------------------------------------------Исправил вот так. Вроде как заработало. Вы так имели в виду или еще вариант есть???
по этому куску не понятно, правильно или нет. Например, в какой момент устанавливается значение last_time_DoorKey ?
Исправил вот так. Вроде как заработало. Вы так имели в виду или еще вариант есть???
по этому куску не понятно, правильно или нет. Например, в какой момент устанавливается значение 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); } //---------------------------------------------------------------------------------------------------- }вроде как да :)
Если не бросите ардуину - через пару месяцев вернитесь к этому коду - уверен, найдете, что переделать.
можно еще по одному вопросу получить консультацию ????)))