Помогите пожалуйста, не могу разобраться с кодом.

MNXA
Offline
Зарегистрирован: 25.08.2021

Здравствуйте, я новичок в пользовании Ардуино, решил написать код, чтобы при нажатии тактовой кнопки моргал светодиод, при повторном отключался, с выключателем работает, а с кнопкой не так, как нужно.

Вот мой код, который писал

void setup() {
  pinMode(3, OUTPUT);
  pinMode(13, INPUT) ;
}

            
uint32_t ms, ms1 = 0;
bool led_stat    = true;

void loop() {
   if (digitalRead(13) == 1) {
    ms = millis();
    if( ( ms - ms1 ) > 500 || ms < ms1 ){
      ms1 = ms;
      digitalWrite(3, led_stat);
      led_stat = !led_stat; 
      }

   
         
  
       
   }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Лучше, наоборот, читай с 3 ноги, зажигай 13-ю

И скажи мне, когда наступит тот мифический случай в условии 

if( ( ms - ms1 ) > 500 || ms < ms1 )

когда ms будет меньше ms1?  Видимо, когда millis взад пойдёт?

MNXA
Offline
Зарегистрирован: 25.08.2021

Да это просто не мой код, скопировал, вставил про милес, дальше доделывал

MNXA
Offline
Зарегистрирован: 25.08.2021

но оно работает, каждые полсекунды зажигает

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

MNXA пишет:

но оно работает, каждые полсекунды зажигает

а вот так попробуй, кнопка на 3 пине, лед на плате

int LED = 13;
int BUTTON = 3;
bool flag_blink = 0;
uint32_t old_millis;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);
  old_millis = 0;
  digitalWrite(LED, LOW);
}

void blinks(int my_led)
{
  // Здесь процедурка моргания
  if(millis() - old_millis >=200)
  {
    digitalWrite(my_led,!digitalRead(my_led));
    old_millis = millis();
  }

}

void button(int my_button,int my_led)
{
  // Здесь процедура обработки кнопки
  if (!digitalRead(BUTTON)) // нажали
  {
    flag_blink = !flag_blink;
    delay(100); // защита от дребезга контактов
    old_millis = millis();
  }
  if (!flag_blink)digitalWrite(my_led, LOW);
}

void loop() {
  button(BUTTON, LED);
  if (flag_blink) blinks(LED);
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

MNXA пишет:

Вот мой код, который писал

MNXA пишет:

Да это просто не мой код, скопировал, вставил про милес, дальше доделывал

Понятненько

MNXA
Offline
Зарегистрирован: 25.08.2021

Спасибо, но не работает, но я уже нашёл решение и моргать при помощи таймеров

 

Green
Offline
Зарегистрирован: 01.10.2015

DetSimen пишет:

И скажи мне, когда наступит тот мифический случай в условии 

if( ( ms - ms1 ) > 500 || ms < ms1 )

когда ms будет меньше ms1?  Видимо, когда millis взад пойдёт?


Через 50 суток же! А тогда и блинк может быть короче предыдущих... Как то не аккуратненько!)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Green пишет:
Через 50 суток же!

А, так это фича такая. Прости, ТС, что я влез.