Millis + Button

Evgen_Bolbes
Evgen_Bolbes аватар
Offline
Зарегистрирован: 10.08.2017

Имеется код. Логика планировалась след: при нажатии и удержание кнопки через 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");
      }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Може быть меньше вплоть до 0.

Вы не хотите в момент нажатия кнопки запомнить время нажатия в timebutton1? Или Вы 5 сек не от момента нажатия, а от включения ардуины считаете?

Evgen_Bolbes
Evgen_Bolbes аватар
Offline
Зарегистрирован: 10.08.2017

нет мне именно нужно от нажатия кнопки считать время .

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну так и делайте! Нажали кнопку - запоминайте время в переменной timebutton1!

Сейчас-то Вы этого не делаете, вот и считаете от включения ардуины.

Evgen_Bolbes
Evgen_Bolbes аватар
Offline
Зарегистрирован: 10.08.2017

Телерь светодиод загорается сразу по нажатию, а не через 5 сек как планировалось. что сделал не так ??? Если можно по конкретнее, а не прото ТЫ НУБ СДЕЛАЛ НЕ ПРАВИЛЬНО, СДЕЛАЙ ПРАВИЛЬНО !!!

Evgen_Bolbes
Evgen_Bolbes аватар
Offline
Зарегистрирован: 10.08.2017
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);  
}

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Evgen_Bolbes пишет:

Телерь светодиод загорается сразу по нажатию, а не через 5 сек как планировалось. что сделал не так ??? Если можно по конкретнее, а не прото ТЫ НУБ СДЕЛАЛ НЕ ПРАВИЛЬНО, СДЕЛАЙ ПРАВИЛЬНО !!!

Так у Вас опять 23-я строчка написана для красы. Поэтому, естественно, 24-я выполняется сразу.

Где волшебное слово if ?

Evgen_Bolbes
Evgen_Bolbes аватар
Offline
Зарегистрирован: 10.08.2017

kalapanga пишет:

Так у Вас опять 23-я строчка написана для красы. Поэтому, естественно, 24-я выполняется сразу.

Где волшебное слово if ?

видно и в правду Нуб, слона то и не заметил. Спасибо за помощь

GarryC
Offline
Зарегистрирован: 08.08.2016

А вот если бы была включена проверка на MISRA, вам бы сразу компилятор сделал предупреждение насчет строки 23.

kalapanga
Offline
Зарегистрирован: 23.10.2016

GarryC пишет:

А вот если бы была включена проверка на MISRA, вам бы сразу компилятор сделал предупреждение насчет строки 23.

Мне вот любопытно, а для чего вообще в Си разрешены такие конструкции? Может есть какое-то неочевидное применение? Сам я придумать не могу.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

GarryC пишет:

А вот если бы была включена проверка на MISRA, вам бы сразу компилятор сделал предупреждение насчет строки 23.

та, да - без МИСРА никак

warning: value computed is not used [-Wunused-value]

     millis()- timebutton1 >= interval1; //тек.время - врем. нажатия >= 5 сек

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

kalapanga пишет:

Мне вот любопытно, а для чего вообще в Си разрешены такие конструкции? Может есть какое-то неочевидное применение? Сам я придумать не могу.

а, что криминального в конструкции?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GarryC пишет:

А вот если бы была включена проверка на MISRA, вам бы сразу компилятор сделал предупреждение насчет строки 23.

Он бы и так сделал предупреждение, если бы не совпали два обстоятельства:

1. разработчики IDE выключили нахрен ВСЕ предупреждения, чтобы не пугать лоха-юзера
2. ТС подтвердил, что он лох и предупреждения не включил. А зачем? Меньше знаешь - крепче спишь.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Клапауций 112 пишет:

а, что криминального в конструкции?

Я, честно признаюсь, в Си совсем не специалист. Так уж получилось, что мне Паскаль роднее. Вот там такая строчка вызовет ошибку. Не предупреждение - ошибку. А здесь нет.

Вот мне и интересно, это просто так уж вот описан синтаксис языка что эта запись ему не противоречит или подобный оператор всё-таки может нести какую-то полезную функцию?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kalapanga пишет:

так уж вот описан синтаксис языка что эта запись ему не противоречит или подобный оператор всё-таки может нести какую-то полезную функцию?

Конечно, может.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Evgen_Bolbes пишет:

видно и в правду Нуб

Неужели, были сомнения? :)

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

kalapanga пишет:

Вот мне и интересно, это просто так уж вот описан синтаксис языка что эта запись ему не противоречит или подобный оператор всё-таки может нести какую-то полезную функцию?

Нормальный логический оператор. Можно поместить в условие if, можно сохранить результат в переменной, можно передать в функцию.

Скорее удивительно. что такая контрукция вызывает ошибку в Паскале...

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

kalapanga пишет:

Вот мне и интересно, это просто так уж вот описан синтаксис языка что эта запись ему не противоречит или подобный оператор всё-таки может нести какую-то полезную функцию?

ну, я же процитировал, что по этому поводу думает компиллятор - is not used

не запрещено писать код, который не используется

kalapanga
Offline
Зарегистрирован: 23.10.2016

Клапауций 112 пишет:

не запрещено писать код, который не используется

Ну я так и понял. Всем спасибо!

Evgen_Bolbes
Evgen_Bolbes аватар
Offline
Зарегистрирован: 10.08.2017

ЕвгенийП пишет:

Неужели, были сомнения? :)

не на мгновение не сомневался  )))