помогите вынести блинк в отдельную функцию

Panek
Offline
Зарегистрирован: 11.05.2021



[code]
 // обьявление глобальных переменных и констант
byte led_pin = 0;
int time_delay = 0;
byte variable = 0;
byte val = 0;
byte state = 0;
boolean a_flag = 0;
boolean b_flag = 0;
byte last_pin=0;

     byte chek_button() // обработчик кнопки 
 {
     byte button = 8;
     pinMode(button,INPUT_PULLUP);  // устанавливаем пин с кнопкой на вход включ встроенный подтяг резистор
 
     a_flag = !digitalRead(button); // читаем состояние кнопки вкл/выкл
  if(a_flag == 1 && b_flag == 0)    // кнопка нажата
  { 
    b_flag = 1; val++;
  }
    if(val>3)
  {
    val = 0;
  }
  if(a_flag == 0 && b_flag == 1) // кнопка отпущена
  {
     b_flag = 0;
  }
 return(val);
}

   void led_blink(int led_pin,int time_delay) // функция мигание светодиода
{
  pinMode(led_pin,OUTPUT);  // устанавливаем пин на вывод  
  unsigned long lastTime=0; 
  digitalWrite(led_pin,state);  // включаем/выключаем светодиод
  digitalWrite(last_pin,0);     // выключаем предыдущий светодиод
    if(millis()- lastTime > time_delay)
  {  lastTime = millis();   // сохраняем текущее время
 state =!state;          
    last_pin=led_pin; 
  }
}
void setup() 
{ 
}

void loop() 
{
  variable = chek_button(); 
  time_delay = 200;  // задержка
    switch(variable) // при нажатии кнопки перелистываем пины
  {
    case 1:
             led_pin = 3;
             break;
    case 2:
             led_pin = 4;
             break;
    case 3:
             led_pin = 5;
             break;
  }
   led_blink(led_pin,time_delay); // передаем функции блинк номер пина и задержку
 }
[/code]
 сейчас код работает так:
при нажатии кнопки загорается очередной светодиод, но не мигает =( 
не могу понять как это реализовать 

 

Panek
Offline
Зарегистрирован: 11.05.2021


 

[code]
                                             // обьявление глобальных переменных и констант
uint8_t led_pin=2, last_pin;  
uint8_t b_flag;

     int8_t chek_button()                     // обработчик кнопки 
 {
  uint8_t button = 8;
     pinMode(button,INPUT_PULLUP);           // устанавливаем пин с кнопкой на вход включ встроенный подтяг резистор
     uint8_t a_flag = !digitalRead(button);  // читаем состояние кнопки вкл/выкл
                           
  if(a_flag == 1 && b_flag == 0)              // кнопка нажата
  { 
    b_flag = 1;  led_pin++;
  }
    if(led_pin>5)
  {
    led_pin = 0;
  }
  if(a_flag == 0 && b_flag == 1)              // кнопка отпущена
  {
     b_flag = 0; 
  }
 return(led_pin);
}

   void led_blink(uint8_t led_pin,uint8_t time_delay) // функция мигание светодиода
{ 
  uint8_t state=1;
  pinMode(led_pin,OUTPUT);                    // устанавливаем пин на вывод  
  uint32_t lastTime=0; 
  digitalWrite(led_pin,state);                // включаем/выключаем светодиод
  digitalWrite(last_pin,0);                   // выключаем предыдущий светодиод
    if(millis()- lastTime > time_delay)
   {
    lastTime = millis();                     // сохраняем текущее время
 state =!state;          
    last_pin=led_pin;
}
  
  }

void setup() 
{ 
}

void loop() 
{ 
 chek_button(); 
 uint16_t time_delay = 200;                   // задержка
    led_blink(led_pin,time_delay);           // передаем функции блин номер пина и задержку
 }
[/code]

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Переменные объявленные внутри функций уничтожаются при выходе из функции.
Что бы этого не происходило их нужно объявлять с атрибутом static