Как остановить выполнение программы на ардуино
Приостанавливает выполнение программы на указанный промежуток времени (в миллисекундах). (В 1 секунде — 1000 миллисекунд.)
Синтаксис
delay(ms)
Параметры
ms: количество миллисекунд, на которые необходимо приостановить программу (unsigned long)
Возвращаемые значения
Пример
int ledPin = 13; // Светодиод подсоединен к цифровому выводу 13 void setup() < pinMode(ledPin, OUTPUT); // Конфигурируем цифровой вывод как выход >void loop() < digitalWrite(ledPin, HIGH); // включаем светодиод delay(1000); // ждем секунду digitalWrite(ledPin, LOW); // выключаем светодиод delay(1000); // ждем секунду >
Предупреждение
С помощью функции delay() заставить мигать светодиод достаточно просто. Помимо этого, во многих программах функция задержки используется для таких задач, как обработка дребезга контактов и пр. Несмотря на это, использование функции delay() в коде программы имеет существенные недостатки. В процессе действия delay() такие операции, как считывание данных с датчиков, математические вычисления или операции с выводами не могут выполняться. Фактически, функция delay() приводит к остановке практически всех операций. Альтернативный способ контролировать время — использование функции millis() (смотрите пример кода, приведенный ниже). Опытные программисты обычно избегают использования delay() для установки временных интервалов больше нескольких десятков миллисекунд (за исключением очень простых программ Arduino).
Тем не менее, некоторые события и участки кода могут работать и в процессе выполнения микроконтроллером функции delay(), т.к. эта функция не влияет на работу прерываний. Так, по прежнему будут срабатывать прерывания, записываться данные, поступающие на вывод RX по последовательному интерфейсу, а также будет поддерживаться ШИМ-сигнал, формируемый функцией analogWrite().
Смотрите также
- millis()
- micros()
- delayMicroseconds()
- Пример: Мигание без Delay
Как остановить выполнение кода?

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

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


ардуино для остановки не предназначен
если уж нужно игнорировать какой то код — то код выделяется в отдельную функцию/процедуру и перед её выполнением ставится условие на проверку флага =) флаг — глобальная переменная, которая для игнорирования кода должна быть выставлена в false
а цикл while(1) — это попытка загрузить ардуину пустым циклом.
в далёких 90х после таких команд компьютер зависал наглухо =)
Arduino.ru

Здравствуйте, ардуино выполняет программу: опрашивает датчик и при удовлетворении условия выполняет действие.
1) как организовать опрос датчика с интервалом =1час
2) после выполнения действия остановить программу = 1 сутки
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 22:20

Зарегистрирован: 06.07.2014
Программу нельзя остановить. Можно выполнять или не выполнять какие-либо действия при определенных условиях (например условие — прошло ли достаточно времени).
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 21:22

Зарегистрирован: 30.07.2012
как тогда реализовать такие длительные задержки?
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 22:26

Зарегистрирован: 06.07.2014
Ну можно с помощью millis() время отсчитывать. Или модуль RTC использовать.
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 22:01

Зарегистрирован: 30.07.2012
а на delay возможны такие большие торможения програмы? delay(10000000)?
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 22:25

Зарегистрирован: 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

Зарегистрирован: 30.07.2012
думаю прикручивать RTC для такой простой задачи не целесообразно.
не сказал сразу, по питанию не критично, по этом не думал о «засыпании»
спасибо ребят, попробую на millis
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 23:35
inspiritus
Зарегистрирован: 17.12.2012
Есть такая библиотека TimerOne ( ищется легко)
На ней можно запустить процессы с требуемой периодичностью
имеются некоторые допущения и противопоказания, требует испытаний для конкретных применений.
зы. Я использую, меня ( в основном) устраивает, чего и Вам желаю.
- Войдите на сайт для отправки комментариев
Ср, 25/05/2016 — 15:05

Зарегистрирован: 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
void delay(unsigned long ms) < uint16_t start = (uint16_t)micros(); while (ms >0) < if (((uint16_t)micros() - start) >= 1000) < ms--; start += 1000; >> >