Millis + Button
- Войдите на сайт для отправки комментариев
Пт, 18/08/2017 - 16:34
Имеется код. Логика планировалась след: при нажатии и удержание кнопки через 5 сек загорается светодиод и горит пока не отпустить кнопку, если не нажимать или отпустить кнопку раньше 5 сек то светодиот гаснет\не горит. Загвоздка в точ что при удерживание кнопки,точнее при ее нажатии и послед удержание задержка может быть меньше запланированных 5 сек. подскажите где ощибка в коде.
Спасибо.
unsigned long timebutton1; //хранение времени нажатия кнопки
const byte led1=9; //pin светодиод
long interval01 = 5000;
void setup(){
Serial.begin(9600);
pinMode(led1,OUTPUT); //пин как выход
pinMode(5,INPUT_PULLUP); // пин как вход
}
void loop(){
boolean button1 = !digitalRead(5); // при нажатие кнопки получаем 1
if (button1 == 1){ //кнопка нажата и удерживается
Serial.print("timebutton1: ");Serial.println(button1); //смотрим состояние кнопки (1)
timer01();
}
else {
digitalWrite(led1,0); // если не прошло 5 сек или кнопка отпушена не вкл светодиод
Serial.print("timebutton1: ");Serial.println(button1); //смотрим состояние кнопки (0)
}
}
void timer01() {
if (millis() - timebutton1 >= interval01){ //еслим прошло 5 сек после нажатия и удержиния то
timebutton1 = millis();
digitalWrite(led1,1); //вкл светодиод
Serial.print("Светодиод горит: ");Serial.println("ON");
}
}
Може быть меньше вплоть до 0.
Вы не хотите в момент нажатия кнопки запомнить время нажатия в timebutton1? Или Вы 5 сек не от момента нажатия, а от включения ардуины считаете?
нет мне именно нужно от нажатия кнопки считать время .
Ну так и делайте! Нажали кнопку - запоминайте время в переменной timebutton1!
Сейчас-то Вы этого не делаете, вот и считаете от включения ардуины.
Телерь светодиод загорается сразу по нажатию, а не через 5 сек как планировалось. что сделал не так ??? Если можно по конкретнее, а не прото ТЫ НУБ СДЕЛАЛ НЕ ПРАВИЛЬНО, СДЕЛАЙ ПРАВИЛЬНО !!!
unsigned long timebutton1; //хранение времени нажатия кнопки unsigned long interval1 = 5000; //задержка в сек boolean button1_flag = false; //переключатель состояния кнопки 1 boolean button1; byte led1=9; //pin светодиод 1 void setup(){ Serial.begin(9600); pinMode(led1,OUTPUT); //пин светодиод 1 pinMode(5,INPUT_PULLUP); // пин кнопка 1 } void loop(){ button1 = !digitalRead(5); if (button1 == 1 && button1_flag == false ){ //кнопка нажата button1_flag = true; //поднять флаг timebutton1=millis(); // записать состояние миллис } //------------------------------------------------ if (button1 == 1 && button1_flag == true ) { //кнопка нажата и была нажата millis()- timebutton1 >= interval1; //тек.время - врем. нажатия >= 5 сек digitalWrite(led1,1); //вкл светодиод } //----------------------------------------------- if (button1 == 0 && button1_flag == true) { //кнопка не нажата button1_flag = false; //опустить флаг timebutton1=0; // записать состояние миллис 0 digitalWrite(led1,0); //выкл светодиод } Serial.print("Состояние кнопки: ");Serial.print(button1);Serial.print(" "); Serial.print("Время нажатия кнопки: ");Serial.println(timebutton1); }Телерь светодиод загорается сразу по нажатию, а не через 5 сек как планировалось. что сделал не так ??? Если можно по конкретнее, а не прото ТЫ НУБ СДЕЛАЛ НЕ ПРАВИЛЬНО, СДЕЛАЙ ПРАВИЛЬНО !!!
Так у Вас опять 23-я строчка написана для красы. Поэтому, естественно, 24-я выполняется сразу.
Где волшебное слово if ?
Так у Вас опять 23-я строчка написана для красы. Поэтому, естественно, 24-я выполняется сразу.
Где волшебное слово if ?
видно и в правду Нуб, слона то и не заметил. Спасибо за помощь
А вот если бы была включена проверка на MISRA, вам бы сразу компилятор сделал предупреждение насчет строки 23.
А вот если бы была включена проверка на MISRA, вам бы сразу компилятор сделал предупреждение насчет строки 23.
Мне вот любопытно, а для чего вообще в Си разрешены такие конструкции? Может есть какое-то неочевидное применение? Сам я придумать не могу.
А вот если бы была включена проверка на MISRA, вам бы сразу компилятор сделал предупреждение насчет строки 23.
та, да - без МИСРА никак
warning: value computed is not used [-Wunused-value] millis()- timebutton1 >= interval1; //тек.время - врем. нажатия >= 5 секМне вот любопытно, а для чего вообще в Си разрешены такие конструкции? Может есть какое-то неочевидное применение? Сам я придумать не могу.
а, что криминального в конструкции?
А вот если бы была включена проверка на MISRA, вам бы сразу компилятор сделал предупреждение насчет строки 23.
Он бы и так сделал предупреждение, если бы не совпали два обстоятельства:
1. разработчики IDE выключили нахрен ВСЕ предупреждения, чтобы не пугать лоха-юзера
2. ТС подтвердил, что он лох и предупреждения не включил. А зачем? Меньше знаешь - крепче спишь.
а, что криминального в конструкции?
Я, честно признаюсь, в Си совсем не специалист. Так уж получилось, что мне Паскаль роднее. Вот там такая строчка вызовет ошибку. Не предупреждение - ошибку. А здесь нет.
Вот мне и интересно, это просто так уж вот описан синтаксис языка что эта запись ему не противоречит или подобный оператор всё-таки может нести какую-то полезную функцию?
так уж вот описан синтаксис языка что эта запись ему не противоречит или подобный оператор всё-таки может нести какую-то полезную функцию?
Конечно, может.
видно и в правду Нуб
Неужели, были сомнения? :)
Вот мне и интересно, это просто так уж вот описан синтаксис языка что эта запись ему не противоречит или подобный оператор всё-таки может нести какую-то полезную функцию?
Нормальный логический оператор. Можно поместить в условие if, можно сохранить результат в переменной, можно передать в функцию.
Скорее удивительно. что такая контрукция вызывает ошибку в Паскале...
Вот мне и интересно, это просто так уж вот описан синтаксис языка что эта запись ему не противоречит или подобный оператор всё-таки может нести какую-то полезную функцию?
ну, я же процитировал, что по этому поводу думает компиллятор - is not used
не запрещено писать код, который не используется
не запрещено писать код, который не используется
Ну я так и понял. Всем спасибо!
Неужели, были сомнения? :)
не на мгновение не сомневался )))