while;

gena321
Offline
Зарегистрирован: 19.01.2019
 
Добрый день 
Есть так :
Мигает LED3, нажимаем кнопку PB12, LED3 мигает в течение 2 секунд и выключается, начинает мигать  LED2 и загорается LED1.
Отпускаем кнопку,  мигает LED3 и выключается LED1.
Все правильно.
Нужно чтобы это происходило только при нажатии кнопки, значит чтобы "loop" включался когда кнопка нажата и выключался когда ее отпустишь.
Для этого применил  функцию " while", все работает как надо за исключением LED1, он не выключается после того когда отпускаю кнопку , пробовал поставить  " break; " в разные  места но не получилось.
 
Как исправить ? 
int LED1 = PB15; //
int LED2 = PB14;
int LED3 = PC13;


int button = PB12;


boolean LED1State = false;
boolean LED2State = false;


long buttonTimer = 0;
//long longPressTime = 2500;
long longPressTime = 1000;


boolean buttonActive = false;
boolean longPressActive = false;


void setup() {
  pinMode(button, INPUT_PULLDOWN);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
}




void loop() {
// while ((digitalRead(button)) == HIGH)


  {


    if (digitalRead(button))


    {
      if (buttonActive == false)
      {
        buttonActive = true;
        buttonTimer = millis();
      }


      if ((millis() - buttonTimer > longPressTime) && (longPressActive == false))
      {
        longPressActive = true;
        LED1State = 1;
        digitalWrite(LED1, LED1State);
     
      }
    }
    else
    {
      LED1State = 0;
      digitalWrite(LED1, LED1State);
      if (buttonActive == true)
      {
        if (longPressActive == true)


        {
          longPressActive = false;
       
        }
        else
          buttonActive = false;
      }
    }


    if (LED1State == 1)


    {
      delay(1);
      Serial.print(1);
      digitalWrite(LED2, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);                       // wait for a second
      digitalWrite(LED2, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);


    }
    else
    {


      digitalWrite(LED3, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(500);                       // wait for a second
      digitalWrite(LED3, LOW);    // turn the LED off by making the voltage LOW
      delay(500);


    }
  }
}

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

gena321 пишет:

Нужно чтобы это происходило только при нажатии кнопки, значит чтобы "loop" включался когда кнопка нажата и выключался когда ее отпустишь.
Для этого применил  функцию " while", все работает как надо за исключением LED1, он не выключается после того когда отпускаю кнопку , пробовал поставить  " break; " в разные  места но не получилось.

Плохая идея, бороться с циклом другим циклом. Анализируйте нажатие в начале луп и выполняйте-невыполняйте какие-либо действия.

gena321 пишет:

Мигает LED3, нажимаем кнопку PB12, LED3 мигает в течение 2 секунд и выключается, начинает мигать  LED2 и загорается LED1.
Отпускаем кнопку,  мигает LED3 и выключается LED1.
Все правильно.

И это, неправильно. Куда делся LED2, после отпускания? Алгоритм причешите.

 

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

На чём Вы всё это запускаете? Что за плата?

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

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

На чём Вы всё это запускаете? Что за плата?

стм32дуино, судя по пинам. НО код простой, от платы не зависит... кроме подтяжки

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

Простой - не простой, но такие вещи надо писать. Для порядка. А то темы, подобные вот этой уже нормой стали. Стоит спросить схему или код - сразу злостный тролль и обижатель цыплят.

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

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

Простой - не простой, но такие вещи надо писать. Для порядка. А то темы, подобные вот этой уже нормой стали. Стоит спросить схему или код - сразу злостный тролль и обижатель цыплят.

не увидел обиды в теме - а это самое интересное :) Или потерли уже?

gena321
Offline
Зарегистрирован: 19.01.2019

плата stm32f103, на неё есть кнопка ресет, когда  её нажать LED1  выключаетьста , надо добавит функцию ресет после отпускания кнопки, что-то подобное:

 while ((digitalRead(button)) ==LOW)  do reset ????

 

gena321
Offline
Зарегистрирован: 19.01.2019

bwn пишет:

gena321 пишет:

Нужно чтобы это происходило только при нажатии кнопки, значит чтобы "loop" включался когда кнопка нажата и выключался когда ее отпустишь.
Для этого применил  функцию " while", все работает как надо за исключением LED1, он не выключается после того когда отпускаю кнопку , пробовал поставить  " break; " в разные  места но не получилось.

Плохая идея, бороться с циклом другим циклом. Анализируйте нажатие в начале луп и выполняйте-невыполняйте какие-либо действия.

gena321 пишет:

Мигает LED3, нажимаем кнопку PB12, LED3 мигает в течение 2 секунд и выключается, начинает мигать  LED2 и загорается LED1.
Отпускаем кнопку,  мигает LED3 и выключается LED1.
Все правильно.

И это, неправильно. Куда делся LED2, после отпускания? Алгоритм причешите.

 

лооп останавливается , LED2 не мигает = хорошо  - горит постоянно

gena321
Offline
Зарегистрирован: 19.01.2019
нашел такое:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
  Serial.begin(9600);//initialize the serial port
}
void(* resetFunc) (void) = 0; //declare reset function @ address 0


// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  Serial.println("on");
  delay(1000);               // wait for a second

  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  Serial.println("off");
  delay(1000);               // wait for a second
  Serial.println("resetting");
  resetFunc();  //call reset
  
  delay(100);
  Serial.println("never happens");
}

 

 но есть ошибка:
Arduino: 1.8.9 (Mac OS X), Board: "Generic STM32F103C series, STM32F103C8 (20k RAM. 64k Flash), STLink, 72Mhz (Normal), Smallest (default)"
 
while:25:28: error: cannot convert '<unnamed enum>' to 'void (*)()' in initialization
 void(* resetFunc) (void) = PB12; //declare reset function @ address 0
                            ^~~~
exit status 1
cannot convert '<unnamed enum>' to 'void (*)()' in initialization
 
negavoid
Offline
Зарегистрирован: 09.07.2016

Есть вероятность, что для STM32 ресет делается так:

nvic_sys_reset();

 

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

gena321, простите, но это полный бред - останавливать LOOP ресетом :) Это почти тоже самое, как лечить мигрень гильотиной.

Ваша задачка яйца выеденного не стоит и запрсто решается в рамках обычных операторов

gena321
Offline
Зарегистрирован: 19.01.2019
#8 - ошибку исправил, но пока не работает.
#9 - почти работает, LED3 не выключаерся полностью , еле горит= проверяю 
gena321
Offline
Зарегистрирован: 19.01.2019

b707 пишет:

gena321, простите, но это полный бред - останавливать LOOP ресетом :) Это почти тоже самое, как лечить мигрень гильотиной.

Ваша задачка яйца выеденного не стоит и запрсто решается в рамках обычных операторов

лооп останавливается функций - while, ресет для выключения LED1

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

gena321 пишет:

лооп останавливается функций - while, ресет для выключения LED1

«Всё страньше и страньше! Всё чудесатее и чудесатее!»

«Бред (лат. dēlīrium) – расстройство содержания мышления с возникновением не соответствующих реальности болезненных представлений, рассуждений и выводов, в которых больной полностью, непоколебимо убеждён и которые не поддаются коррекции» - триада Ясперса.

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

gena321 пишет:

лооп останавливается функций - while, ресет для выключения LED1

а выключать LED молотком по сороконожке - гораздо гораздее. 

gena321
Offline
Зарегистрирован: 19.01.2019

добавил  

if (buttonState != lastButtonState)

 и всё работает как надо 

спасибо negavoid

 

negavoid
Offline
Зарегистрирован: 09.07.2016

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