Кнопка ОСТАНОВА всех действий

toxa_xip
Offline
Зарегистрирован: 03.11.2020

Всем доброго вечера. Нужна помощь.

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

Алгоритм работы. 

Нажали кнопку "СТАРТ", запустился цикл из 6 действий.  

Нажали кнопку "СТОП" (в любой момент времени), программа прекратила выполнение, ждет нажатия кнопки "СТАРТ".

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Как цикл выглядит?

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

Кнопка reset уже есть, я слышал.

toxa_xip
Offline
Зарегистрирован: 03.11.2020

Если кнопка "СТАРТ" нажата

1. Запускаем аудио трек

2. Зажигаем красный цвет

3. Зажигаем желтый цвет

4. Зажигаем желтый цвет

5. Зажигаем зеленый цвет

6. Опускаем ворота

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Цикла не вижу в этом описании. В программе как он выглядит?

toxa_xip
Offline
Зарегистрирован: 03.11.2020
Данный участок кода пока не цикл, будет в будущем.
 
void loop()
{
  if (digitalRead(START)==HIGH&&start_flag==0)        // если кнопка нажата и переменная flag = 0, то выполняем цикл
  digitalWrite(START,!digitalRead(START));
  start_flag=1;                                     //это нужно для того что бы с каждым нажатием кнопки происходило только одно действие плюс защита от "дребезга"  100%
 
  delay(5000);
  
// Включаем трек "Ok riders. Random start", время выполнения - 1,50 сек
// Включаем трек "Riders ready. Watch the gate", время выполнения - 2 сек
 
// ОСТАНОВА ВСЕГО
 
// Включаем красный цвет светофора
  tone(BUZZER, 632);               // Воспроизводим тон частотой 632 Гц
  delay(60);                       // ВОПРОС! ВОЗМОЖНО ЕЁ НУЖНО ПЕРЕМЕСТИТЬ ПОСЛЕ ЗАГОРАНИЯ СВЕТОФОРА
  noTone(BUZZER);                  // Остановили звучание
  digitalWrite(COL_RED, LOW);      // Включаем красный цвет светофора       
  delay(60);                       // Ждем
 
// ОСТАНОВА ВСЕГО
 
// Включаем желтый цвет светофора
  tone(BUZZER, 632);                  // Воспроизводим тон частотой 632 Гц
  delay(60);                          // ВОПРОС! ВОЗМОЖНО ЕЁ НУЖНО ПЕРЕМЕСТИТЬ ПОСЛЕ ЗАГОРАНИЯ СВЕТОФОРА
  noTone(BUZZER);                     // Остановили звучание
  digitalWrite(COL_YELLOW1, LOW);     // Включаем первый желтый цвет светофора       
  delay(60);                          // Ждем
 
// ОСТАНОВА ВСЕГО
 
//Включаем желтый цвет светофора
  tone(BUZZER, 632);                  // Воспроизводим тон частотой 632 Гц
  delay(60);                          // ВОПРОС! ВОЗМОЖНО ЕЁ НУЖНО ПЕРЕМЕСТИТЬ ПОСЛЕ ЗАГОРАНИЯ СВЕТОФОРА
  noTone(BUZZER);                     // Остановили звучание
  digitalWrite(COL_YELLOW2, LOW);     // Включаем второй желтый цвет светофора       
  delay(60);                          // Ждем
 
// ОСТАНОВА ВСЕГО
 
// Включаем зелёный цвет светофора
  tone(BUZZER, 632, 1000);             // Воспроизводим тон частотой 632 Гц
  digitalWrite(COL_GREEN, LOW);        // Включаем второй желтый цвет светофора       
  delay(1000);                         // ВОПРОС! ВОЗМОЖНО ЕЁ НУЖНО ПЕРЕМЕСТИТЬ ПОСЛЕ ЗАГОРАНИЯ СВЕТОФОРА
  noTone(BUZZER);                      // Остановили звучание
  delay(2250);                          // Ждем
 
// ОСТАНОВА ВСЕГО
 
// Теперь отключаем все цвета светофора
  digitalWrite(COL_GREEN, HIGH); 
  digitalWrite(COL_YELLOW1, HIGH); 
  digitalWrite(COL_YELLOW2, HIGH); 
  digitalWrite(COL_RED, HIGH); 
 
// ОСТАНОВА ВСЕГО
 
// Теперь опускаем ворота
 digitalWrite(VOROTA, LOW);           // Опускаем ворота  
}                                         //Закончили if 
 
  if(digitalRead(START)==LOW&&start_flag==1)     //если кнопка НЕ нажата и переменная flag равна - 1 ,то ...
     {
  start_flag=0;                                  //обнуляем переменную flag
     }
  if (digitalRead(GATE_UP)==HIGH&&down_flag==0) // если нажата Поднять ворота и переменная down_flag = 0, то выполняем цикл опускания ворот
  digitalWrite(GATE_UP,!digitalRead(GATE_UP));
  down_flag=1;                                  //это нужно для того что бы с каждым нажатием кнопки происходило только одно действие плюс защита от "дребезга"  100%
 
  digitalWrite(VOROTA, LOW);              // Поднимаем ворота в исходное положение   
 
  tone(BUZZER, 1150);                     // Воспроизводим тон частотой 1150 Гц
  delay(250);                             // Задержка 250 мс
  noTone(BUZZER);                         // Остановили звучание
  delay(250);                             // Задержка 250 мс
 
  tone(BUZZER, 1150);                     // Воспроизводим тон частотой 1150 Гц
  delay(250);                             // Задержка 250 мс
  noTone(BUZZER);                         // Остановили звучание
  delay(250);                             // Задержка 250 мс
 
  tone(BUZZER, 1150);                    // Воспроизводим тон частотой 1150 Гц
  delay(250);                            // Задержка 250 мс
  noTone(BUZZER);                        // Остановили звучание
  delay(250);                            // Задержка 250 мс
 
  tone(BUZZER, 1150);                   // Воспроизводим тон частотой 1150 Гц
  delay(250);                           // Задержка 250 мс
  noTone(BUZZER);                       // Остановили звучание
  delay(250);                           // Задержка 250 мс
 
  tone(BUZZER, 1150);                  // Воспроизводим тон частотой 1150 Гц
  delay(250);                          // Задержка 250 мс
  noTone(BUZZER);                      // Остановили звучание
}                                      // Закончили if  
 
if(digitalRead(GATE_UP)==LOW&&down_flag==1)  // Если кнопка НЕ нажата и переменная flag равна - 1 ,то ...
{
  down_flag=0;                               // Обнуляем переменную flag
sadman41
Онлайн
Зарегистрирован: 19.10.2016

До тех пор, пока delay натыканы везде - только reset поможет.

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

toxa_xip
Offline
Зарегистрирован: 03.11.2020

Спасибо.

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

toxa_xip пишет:

Нажали кнопку "СТАРТ", запустился цикл из 6 действий.  

Поставьте эту кнопку в цепь питания.

vanila
Offline
Зарегистрирован: 25.08.2015

sadman41 пишет:
До тех пор, пока delay натыканы везде - только reset поможет.

а кнопка на прерывании тоже не поможет? 

вообще кмк в данном случае действительно проще всего кнопкой резет воспользоваться

inspiritus
Offline
Зарегистрирован: 17.12.2012

toxa_xip пишет:

Всем доброго вечера. Нужна помощь.

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

Алгоритм работы. 

Нажали кнопку "СТАРТ", запустился цикл из 6 действий.  

Нажали кнопку "СТОП" (в любой момент времени), программа прекратила выполнение, ждет нажатия кнопки "СТАРТ".

а что происходит после нажатия СТАРТ? Продолжение или запуск с начала?

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

С таким кодом на ворота, убьет кого нить нафиг

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

vanila пишет:

вообще кмк в данном случае действительно проще всего кнопкой резет воспользоваться

Да не проще ни грамма.

Боролись-то за что?

vanila пишет:
Нажали кнопку "СТОП" (в любой момент времени), программа прекратила выполнение, ждет нажатия кнопки "СТАРТ"

А с ресетом будет "нажали, отпустили - она попёрла дальше работать"! 

Сказано же Вам в линию питания ставьте кнопки!

vanila
Offline
Зарегистрирован: 25.08.2015

ну а если сделать что бы запускалось только после нажатия кнопки старт? 

 

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

Вот и думайте, как Вы это с ресетом сделаете

SLKH
Offline
Зарегистрирован: 17.08.2015

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

 

Сказано же Вам в линию питания ставьте кнопки!

тумблер.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

vanila пишет:

sadman41 пишет:
До тех пор, пока delay натыканы везде - только reset поможет.

а кнопка на прерывании тоже не поможет? 

вообще кмк в данном случае действительно проще всего кнопкой резет воспользоваться

А вот «кмк» это что такое? Мне кажется сокращение от «как мне кажется»? Неужели несколько буковок допечатать сложно?

vanila
Offline
Зарегистрирован: 25.08.2015

BOOM пишет:

А вот «кмк» это что такое? Мне кажется сокращение от «как мне кажется»? Неужели несколько буковок допечатать сложно?

ну да

vanila
Offline
Зарегистрирован: 25.08.2015

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

Вот и думайте, как Вы это с ресетом сделаете

как то не очевидно 

в чем проблема резета? 

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

vanila пишет:

в чем проблема резета? 

В том, что Вам надо либо держать его постоянно прижатым к земле, либо, как только Вы его отпустите, контроллер начнёт работать дальше ничего не ожидая.

vanila
Offline
Зарегистрирован: 25.08.2015

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

никакого цикла там нет, а тупо ожидание нажатия кнопки и выполнение действие после нажатия. 

тоесть по идее нажатие кнопки резет приведет к перезагрузке и ожидании нажатия кнопки. 

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

Может быть я и ошибся. Я понял, что при запуске программа ничего не ждёт.

vanila
Offline
Зарегистрирован: 25.08.2015

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

Может быть я и ошибся. Я понял, что при запуске программа ничего не ждёт.

по крайней мере так в его программе написанно

хотя если честно код больше для гильотины подойдет)

если когото зажало в воротах, и нажали резет, то чтобы их поднять нужно сначала нажать кнопку опустить

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

vanila пишет:

в чем проблема резета? 

В том, что Вам надо либо держать его постоянно прижатым к земле, либо, как только Вы его отпустите, контроллер начнёт работать дальше ничего не ожидая.

Так кто не дает при каждом рестарте обновлять булев флаг в EEPROM.

toxa_xip
Offline
Зарегистрирован: 03.11.2020

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

По алгоритму, пока в коде выше нет цикла, но он появится)