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

Всем привет!
Для отладки нужно, чтобы ардуино останавливал выполнение скетча полностью. Есть ли какой-то путь для решения этой проблемы кроме 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; >> >
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">
- Войдите на сайт для отправки комментариев


