Перейти к содержимому

Как остановить выполнение программы на ардуино

  • автор:

Как остановить выполнение кода?

Всем привет!
Для отладки нужно, чтобы ардуино останавливал выполнение скетча полностью. Есть ли какой-то путь для решения этой проблемы кроме delay с бешеным интервалом?

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

Надо загнать ардуино в пустой цикл:

ардуино для остановки не предназначен

если уж нужно игнорировать какой то код — то код выделяется в отдельную функцию/процедуру и перед её выполнением ставится условие на проверку флага =) флаг — глобальная переменная, которая для игнорирования кода должна быть выставлена в false

а цикл while(1) — это попытка загрузить ардуину пустым циклом.
в далёких 90х после таких команд компьютер зависал наглухо =)

Arduino.ru

Evgenii аватар

Здравствуйте, ардуино выполняет программу: опрашивает датчик и при удовлетворении условия выполняет действие.

1) как организовать опрос датчика с интервалом =1час

2) после выполнения действия остановить программу = 1 сутки

  • Войдите на сайт для отправки комментариев

Пт, 20/05/2016 — 22:20

Jeka_M аватар

Зарегистрирован: 06.07.2014

Программу нельзя остановить. Можно выполнять или не выполнять какие-либо действия при определенных условиях (например условие — прошло ли достаточно времени).

  • Войдите на сайт для отправки комментариев

Пт, 20/05/2016 — 21:22

Evgenii аватар

Зарегистрирован: 30.07.2012

как тогда реализовать такие длительные задержки?

  • Войдите на сайт для отправки комментариев

Пт, 20/05/2016 — 22:26

Jeka_M аватар

Зарегистрирован: 06.07.2014

Ну можно с помощью millis() время отсчитывать. Или модуль RTC использовать.

  • Войдите на сайт для отправки комментариев

Пт, 20/05/2016 — 22:01

Evgenii аватар

Зарегистрирован: 30.07.2012

а на delay возможны такие большие торможения програмы? delay(10000000)?

  • Войдите на сайт для отправки комментариев

Пт, 20/05/2016 — 22:25

Jeka_M аватар

Зарегистрирован: 06.07.2014

Забудь за delay, и научись использовать millis.

А можно и RTC прикрутить.

  • Войдите на сайт для отправки комментариев

Пт, 20/05/2016 — 22:32

ЕвгенийП аватар

Зарегистрирован: 25.05.2015
Evgenii пишет:

как тогда реализовать такие длительные задержки?

Завести прерывание по таймеру для пробуждения и перейти в режим power down. Контроллер будет «спать» и ничего не делать.

Evgenii пишет:

а на delay возможны такие большие торможения програмы? delay(10000000)?

Возможны почти до двух месяцев, но лучше делать, как я сказал выше, т.к. в режиме power down контроллер почти не ест электроэнергии, а при выполнении delay кушает по полной программе.

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

  • Войдите на сайт для отправки комментариев

Пт, 20/05/2016 — 22:37

Evgenii аватар

Зарегистрирован: 30.07.2012

думаю прикручивать RTC для такой простой задачи не целесообразно.

не сказал сразу, по питанию не критично, по этом не думал о «засыпании»

спасибо ребят, попробую на millis

  • Войдите на сайт для отправки комментариев

Пт, 20/05/2016 — 23:35
inspiritus
Зарегистрирован: 17.12.2012

Есть такая библиотека TimerOne ( ищется легко)

На ней можно запустить процессы с требуемой периодичностью

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

зы. Я использую, меня ( в основном) устраивает, чего и Вам желаю.

  • Войдите на сайт для отправки комментариев

Ср, 25/05/2016 — 15:05

Evgenii аватар

Зарегистрирован: 30.07.2012

Люди добрые, покритикуйте код (честно найденый на форуме и изменен)

1)Раз в сутки включется датчик

2)Если датчик включен смотрим влажность почвы

3) Если почва сухая включаем насос на 2мин

//**********************************/работа датчика влажности/************************************* #define SENSOR_PIN 10 // Вывод подключения питания датчика #define TIME_ON_SENSOR 120000 // Время в течении которого на выводе "1" #define TIME_OFF_SENSOR 86400000 //Время в течении которого на выводе "0" boolean state_sensor = 0; // Переменная для хранения состояния вывода unsigned long new_millis_sensor = millis(); // Переменная для хранения времени //***********************************/работа водяной помпы/**************************************** #define NASOS_PIN 13 // Вывод подключения питания насоса #define TIME_ON_NASOS 140000 // Время в течении которого насос работает boolean state_nasos = 0; // Переменная для хранения состояния вывода unsigned long new_millis_nasos = millis(); // Переменная для хранения времени //************************************************************************************************** int sensorAnalog = A0; int sensorValue = 0; const int soil_min = 35; // Минимально сухая почва //******************************/Зададим начальную конфигурацию/************************************ void setup() < Serial.begin(9600); // Инициализация последовательного порта на скорость 9600 бод pinMode(NASOS_PIN, OUTPUT); // Установим вывод 13 как выход pinMode(SENSOR_PIN, OUTPUT); // Устанавливаем вывод 10 как выход pinMode(sensorAnalog, INPUT); >void loop() < if (millis() >new_millis_sensor) < state_sensor = ! state_sensor; // меняем состояние state_sensor на противоположное, если был 0, то меняем на 1 и наоборот. digitalWrite(SENSOR_PIN, state_sensor); // устанавливаем вывод в соответствующее состояние >if (state_sensor) // если state_svet равен 1 (больше нуля, истина. ), то < new_millis_sensor = millis() + TIME_ON_SENSOR; >else < new_millis_sensor = millis() + TIME_OFF_SENSOR; >//************************************************************************************************** if (state_sensor == HIGH) < sensorValue = analogRead(sensorAnalog); if ((sensorValue >soil_min) && (millis() > new_millis_nasos)) < state_nasos = ! state_nasos; digitalWrite (NASOS_PIN, state_nasos); if (state_nasos) < new_millis_nasos = millis() + TIME_ON_SENSOR; >> > >
  • Войдите на сайт для отправки комментариев

Функция delay()

Функция delay() позволяет остановить выполнение программы на определенное количество миллисекунд (в 1 секунде — 1 000 миллисекунд).

Синтаксис

void delay(unsigned long ms)

Параметры

  • ms — количество миллисекунд, на которое приостанавливается выполнение программы.

Что возвращает

Ничего

Пример использования функции delay

void setup() < Serial.begin(9600); Serial.println(millis()); // Выводим количество миллисекунд, прошедших после запуска МК delay(500); // Приостанавливаем работу МК на 500 миллисекунд Serial.println(millis()); // Выводим количество миллисекунд, прошедших после запуска МК >void loop() <>

Для демонстрации работы функции delay в ардуино мы использовали простой скетч. В разделе setup() Инициализировали Serial-порт со скоростью 9600 бод. Затем вывели в порт количество миллисекунд, прошедших после включения микроконтроллера, функцией millis(). А далее приостановили работу на 500 миллисекунд функцией delay и снова вывели время работы МК после включения. Результат выполнения можно увидеть на рисунке ниже.

Функция delay() в arduino ide

Код функции delay

void delay(unsigned long ms) < uint16_t start = (uint16_t)micros(); while (ms >0) < if (((uint16_t)micros() - start) >= 1000) < ms--; start += 1000; >> >

Arduino.ru

Доброе время суток. Прошу помощи в корректировки кода, идея такова при нажатии и удержании PIN_BUTTON1, analogOutPin2 становиться HIGH на время outputValue, после чего код останавливается и ждет повторного нажатия PIN_BUTTON1, но у меня получился только блинк при удержании PIN_BUTTON1. Прошу Вашей помощи.

const int analogInPin1 = A0; // потенциометр к A0 const int analogOutPin1 = 13; // светодиод на выводе 13 const int analogOutPin2 = 12; // светодиод на выводе 12 const int PIN_BUTTON1 = 2; // кнопка 1 uint32_t myTimer; // таймер int sensorValue = 0; // значения от потенциометра int outputValue = 0; // значения для PWM int buttonState = 0; // переменная кнопки void setup() < pinMode(12, OUTPUT); pinMode(13, OUTPUT); Serial.begin(9600); >void loop() < buttonState = digitalRead(PIN_BUTTON1); sensorValue = analogRead(analogInPin1); outputValue = map(sensorValue, 0, 1023, 100, 3000); // печатаем результаты в Serial Monitor Serial.print("sensor = "); Serial.print(sensorValue); Serial.print("\t output forum-post-footer clear-block">

Верх
    Войдите на сайт для отправки комментариев
Вс, 13/12/2020 — 23:24

#1

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

Непонятно, как возможно повторное нажатие на кнопку, которую еще не отпустили.

Верх
    Войдите на сайт для отправки комментариев
Вс, 13/12/2020 — 23:59

#2

Oksymoron
Offline
Зарегистрирован: 28.01.2017

Извините. как только отпустили кнопку код должен ждать следующего нажатия.

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 00:06

#3

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

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

И, кстати, осталось непонятным, почему в исходном сообщении Вы пишете о нажатии и удержании.

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 00:20

#4

Oksymoron
Offline
Зарегистрирован: 28.01.2017

Это только часть кода(начало), надо чтобы таймер начинал отсчет именно когда кнопка удерживается и значение менялось на LOW даже если время вышло но кнопка нажата. Когда время вышло но кнопка нажата надо ожидать следующего нажатия и удержания.

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 00:43

#5

sadman41
Offline
Зарегистрирован: 19.10.2016

Не следующего нажатия, а отпускания и последующего нажатия с удержанием.

andriano на это и выводит — если вы сумеете описать все действия формальным языком, когда все детали операции будут вербализованы, а не домысливаться — тогда и сможете перевести свой алгоритм в исходный код. А до того времени ничего и не получится, ибо МК не собирается гадать, что вы за картинку у себя в голове нарисовали.

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 08:30

#6

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

Это только часть кода(начало), надо чтобы таймер начинал отсчет именно когда кнопка удерживается и значение менялось на LOW даже если время вышло но кнопка нажата. Когда время вышло но кнопка нажата надо ожидать следующего нажатия и удержания.

Еще раз:

andriano пишет:

Непонятно, как возможно повторное нажатие на кнопку, которую еще не отпустили.

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

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 09:41

#7

Гриша
Offline
Зарегистрирован: 27.04.2014

еще один подход к решению задачи: если вы смотрели ДШ на какой нить лог элемент там часто встречается картинка график с логикой работы по шкале времени ну или таблица истинности. В вашем случае нужно нарисовать логику работы, а потом составить таблицу истинности — будет значительно проще, как для написания , так и для понимания.

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 10:49

#8

Oksymoron
Offline
Зарегистрирован: 28.01.2017

Все понял. Проблема в отслеживании состояния кнопки, а если её не отслеживается, а как ещё можно остановить ход выполнения программы по условию?

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 12:29

#9

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

Остановить выполнение программы нельзя. Но можно сделать так, чтобы работающая программа не совершала никаких полезных действий.

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 12:33

#10

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

как ещё можно остановить ход выполнения программы по условию?

По простому:

while(условие) ;

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 13:02

#11

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

Остановить выполнение программы нельзя.

Почему нельзя? Закрыть прерывания и завалиться спать в режиме POWER_DOWN. Это разве не «остановить»?

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 14:51

#12

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
ЕвгенийП пишет:

andriano пишет:

Остановить выполнение программы нельзя.

Почему нельзя? Закрыть прерывания и завалиться спать в режиме POWER_DOWN. Это разве не «остановить»?

Ну, вообще говоря, существуют и более радикальные методы, начиная с простого обесточивания, и заканчивая электроинструментом и взрывчатыми веществами.

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 15:05

#13

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

Вот про последнее не надо — мы люди законопослушные и нам ст. 223.1 УК тут нафиг не нужна.

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 15:07

#14

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

Хорошо, мы по простому

while(условие) abort();

Верх
    Войдите на сайт для отправки комментариев
Пнд, 14/12/2020 — 21:56

#15

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
Oksymoron пишет:

Доброе время суток. Прошу помощи в корректировки кода, идея такова при нажатии и удержании PIN_BUTTON1, analogOutPin2 становиться HIGH на время outputValue, после чего код останавливается и ждет повторного нажатия PIN_BUTTON1, но у меня получился только блинк при удержании PIN_BUTTON1. Прошу Вашей помощи.

const int analogInPin1 = A0; // потенциометр к A0 const int analogOutPin1 = 13; // светодиод на выводе 13 const int analogOutPin2 = 12; // светодиод на выводе 12 const int PIN_BUTTON1 = 2; // кнопка 1 bool f_button = 0; uint32_t myTimer; // таймер int sensorValue = 500; // значения от потенциометра int outputValue = 0; // значения для PWM int buttonState = 0; // переменная кнопки void setup() < pinMode(12, OUTPUT); pinMode(13, OUTPUT); pinMode(2, INPUT); Serial.begin(9600); >void loop() < buttonState = digitalRead(PIN_BUTTON1); sensorValue = analogRead(analogInPin1); outputValue = map(sensorValue, 0, 1023, 100, 3000); // печатаем результаты в Serial Monitor Serial.print("sensor = "); Serial.print(sensorValue); Serial.print("\t output forum-post-footer clear-block">

  • Войдите на сайт для отправки комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *