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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

http://arduino.ru/tutorials/BlinkWithoutDelay
http://robocraft.ru/blog/arduino/385.html

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

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

Evgenii пишет:

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

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

Evgenii пишет:

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

Спасибо, прочитал у Джереми Блюм про использование этой библиотеке. Возьму на заметку.