Остановить выполнение программы
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 - 21:07
Здравствуйте, ардуино выполняет программу: опрашивает датчик и при удовлетворении условия выполняет действие.
1) как организовать опрос датчика с интервалом =1час
2) после выполнения действия остановить программу = 1 сутки
Программу нельзя остановить. Можно выполнять или не выполнять какие-либо действия при определенных условиях (например условие - прошло ли достаточно времени).
как тогда реализовать такие длительные задержки?
Ну можно с помощью millis() время отсчитывать. Или модуль RTC использовать.
а на delay возможны такие большие торможения програмы? delay(10000000)?
Забудь за delay, и научись использовать millis.
http://arduino.ru/tutorials/BlinkWithoutDelay
http://robocraft.ru/blog/arduino/385.html
А можно и RTC прикрутить.
как тогда реализовать такие длительные задержки?
Завести прерывание по таймеру для пробуждения и перейти в режим power down. Контроллер будет "спать" и ничего не делать.
а на delay возможны такие большие торможения програмы? delay(10000000)?
Возможны почти до двух месяцев, но лучше делать, как я сказал выше, т.к. в режиме power down контроллер почти не ест электроэнергии, а при выполнении delay кушает по полной программе.
Правда, чтобы реально получить выгоду от этого режима, нужно питать контроллер не через стабилизатор, а напрямую, подавая 5 вольт на соответствующий пин. Иначе на линейном стабилизаторе всё равно будет дофига отжираться.
думаю прикручивать RTC для такой простой задачи не целесообразно.
не сказал сразу, по питанию не критично, по этом не думал о "засыпании"
спасибо ребят, попробую на millis
Есть такая библиотека TimerOne ( ищется легко)
На ней можно запустить процессы с требуемой периодичностью
имеются некоторые допущения и противопоказания, требует испытаний для конкретных применений.
зы. Я использую, меня ( в основном) устраивает, чего и Вам желаю.
Люди добрые, покритикуйте код (честно найденый на форуме и изменен)
алгоритм:
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; } } } }Спасибо, прочитал у Джереми Блюм про использование этой библиотеке. Возьму на заметку.