Не работает таймер
- Войдите на сайт для отправки комментариев
Сб, 01/02/2020 - 00:01
Добрый вечер не работает как следует таймер для включения оптронов через радипульт yk08 уже перепробывал все варианты может кто-нибудь сможет увидеть мою ошибку.В итоге хотел добиться нажал кнопку(кнопки без фиксации) с приемника пришол сигнал на пин ардуино +5v а ардуино по программе вкл выкл свой пин.Пока не нажмут на ту же кнопку для отключения программы.
#define OPTRON_PIN 6 // Вывод к котрому подключена нагрузка #define TIME_ON_OPTRON 5000 // Время в течении, которого на выводе 1 #define TIME_OFF_OPTRON 5000 // Время в течении, которого на выводе 0 boolean state_optron = 0; // Переменная для хранения состояния вывода unsigned long new_millis_optron = millis(); // Переменная для хранения времени int flag = 0; void setup() { pinMode(OPTRON_PIN, OUTPUT); } void loop() { if(digitalRead(2)==HIGH&&flag==0)//если кнопка нажата // и перемення flag равна 0 , то ... { flag=1; //это нужно для того что бы с каждым нажатием кнопки } if(digitalRead(2)==LOW&&flag==1) //если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... { if (millis() > new_millis_optron) state_optron = !state_optron; digitalWrite(OPTRON_PIN, state_optron); if (state_optron){ new_millis_optron = millis() + TIME_ON_OPTRON; } else { new_millis_optron = millis() + TIME_OFF_OPTRON; } flag=0;//обнуляем переменную flag } }
через радипульт yk08 уже перепробывал все варианты может кто-нибудь сможет увидеть мою ошибку.В итоге хотел добиться нажал кнопку(кнопки без фиксации) с приемника пришол ...
Да легко. Их целых три. В слове "радиопульт" "о" пропущена, в слове "перепробывал" должна быть "о" вместо "ы", и в слове "пришел" тоже ашыпка. Исправляй.
Ну с этим понятно засыпал когда печатал я про скетч.
всё неправильно кроме setup
Условие в 30 строке срабатывает 1 раз. Следующий 1 раз после нажатие на кнопку. А как Вы хотели?
Хотел после нажатия на кнопку срабатывает условие в строке 30.И выполняется таймер до тех пор пока кнопку не нажмут еще раз после этого flag обнуляется .
Так нулите флаг после отработки Вашей программы т.е., похоже, после строки 41
То есть вот так?
Строки 34, 38, 41 не самое лучшее решение. В вашей задаче вряд ли скажется, на длительно работающих проектах, выстрелит. Используйте разницу, а не суммируйте.
А как это реализовать ? Просто это мой первый код.
Почитайте "Великое переполнение миллис", от ЕвгенийП.
Все равно нажимаю кнопку появляется +5v и не работает прерывание и не отключается +5v с контакта d6.
Подскажите пожалуйста уже измучился.
Чтобы заработало, надо делать так. Читать вдумчиво.
Я прочитал не могу понять как это относится к включение программы с кнопки и работы по таймеру и при повторном нажатие отключение программы?То есть в том случаи со светом нужно реагировать на человека включая свет а когда человека нет на месте считывать состояние датчика и включать свет но не как работа по времени.Или вы имели ввиду переделать программу чтобы вместо человека реагировало на нажатие кнопки? Через чур за умно для меня выходит.
Там великолепный пример не решения именно вашей задачи, а метода решения любой задачи. Прочтите вдумчиво еще раз и попробуйте сделать как там. Сперва продумать и расписать последовательность действий своими словами, а потом перевести их в код.
Хотел после нажатия на кнопку срабатывает условие в строке 30.И выполняется таймер до тех пор пока кнопку не нажмут еще раз после этого flag обнуляется .
Для этого нужен еще флаг. Тот флаг, что у вас есть - отвечает за то, чтоб кнопка при нажатии не срабатывала больше одного раза. А теперь добавьте еще флаг, который покажет программе, что нужно мигать диодом.