Помогите допилить или укажите на ошибку
- Войдите на сайт для отправки комментариев
Пнд, 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 нужно только при первом заходе в блок.
Исправил вот так. Вроде как заработало. Вы так имели в виду или еще вариант есть???
Исправил вот так. Вроде как заработало. Вы так имели в виду или еще вариант есть???
по этому куску не понятно, правильно или нет. Например, в какой момент устанавливается значение last_time_DoorKey ?
Исправил вот так. Вроде как заработало. Вы так имели в виду или еще вариант есть???
по этому куску не понятно, правильно или нет. Например, в какой момент устанавливается значение last_time_DoorKey ?
вроде как да :)
Если не бросите ардуину - через пару месяцев вернитесь к этому коду - уверен, найдете, что переделать.
можно еще по одному вопросу получить консультацию ????)))