Простой таймер

SLONik_24
SLONik_24 аватар
Offline
Зарегистрирован: 27.12.2015

Доброго времени суток!!!

Я новичок в ваших рядах, поэтому не судите строго...

Рашил выложить пост потому, как проделал большую работу(для новичка конечно). Долго пытался разобраться с таймероми и никак не мог победить т.к. слишком сложная терминалогия, короче потихоньку разобрался с простейшим. Итак:

Задачу которую я поставил для себя:

Включать, выключать исполнительное уст-во на время, через заданный интервал. (не использую delay, по понятным причинам)

В роли устойства конечно светодиод подключенный к выводу 13)))

В ролях:

1. Arduino Nano

2. Авторский бредборд

3. Светодиод + разистор

4. Перемычки



unsigned long time;//переменная хранение текущих данных в милисекундах
unsigned long t;   //переменная хранения промежуточных данных в милисекундах
unsigned long s;   //переменная хранения кол-ва секунд с начала старта
unsigned long a;   //переменная хранения промежуточных данных в секундах
unsigned long ON1; //переменная для установки времени включения после старта в секундах
unsigned long OFF1;//переменная для установки времени выключения после включения
int flag1;         //переменная хранения значения текущего состояния вкл. или выкл.("flag1" = "1" или "flag1" = "0" соответсвенно)
int Out1 = 13;     //переименование пин13, как "Out1"

void setup()
{
  pinMode(Out1, OUTPUT); //Устанавливаем "Out1", как выход (для подключения усполнительного уст-ва)
  Serial.begin(9600);    //Устанавливаем скорость последовательного порта
  t = time;              //Уравниваем значение "t" и "time" т.е "0" при старте
  s = 0;                 //Устанавливаем "s" = "0", для начала отсчета
  a = s;                 //Уравниваем значение "a" и "s"
  ON1 = 10;              //устанавливаем значение включения "Out1" в секундах с начала старта
  OFF1 = 5;              //устанавливаем значение выключения "Out1" в секундах с начала включения
  flag1 = 0;             //устанавливаем значение "flag1" = "0", для начального "Out1", как выключенно 
}
                    //идем перекурить и продолжим

                    
void tim()                        //создаем функцию "tim" для обработки таймера
{
time = millis();                  //переменная "time" = "milles"(в милесикундах)
if(time >= (t + 1000))            //если значение "time" станет больше или ровно "(t + 1000)"(в реальности это случиться, через 1000 милисекунд)
   {s++, t=time, prin(), inta();} //то: 1). Значение "s" увеличется на 1. 2). "t" уровняется с "time". 3). Запуститься функция "prin". 4). Запуститься функция "inta".
}

void inta()                            //создаем функцию "inta" для обработки интервала вкл. и выкл. "Out1"
{
   if (s == (a + ON1) && flag1 == 0)   //если значение "s" сравнивается с "(a + ON1)" и значение "flag1" = "0"(в реальности это произойдет через 10 секунд после старта)
   {a = s, flag1=1;}                   //то "a" уравниваем с "s" и "flag1" устанавливаем в "1"
   if (s == (a + OFF1) && flag1 == 1)  //если значение "s" сравнивается с "(a + OFF1)" и значение "flag1" = "1"(в реальности это произойдет через 5 секунд после установки "flag1" в "1")
   {a = s, flag1=0;}                   //то "a" уравниваем с "s" и "flag1" устанавливаем в "0"
}                                      //дальше все будет происходить циклично

void prin()                            //создаем функцию prin для вывода данных на экран компьютера, для диагностики происходящего
{
   Serial.println(s);                  //Отправляем на экран значение переменной "s"
   Serial.println(a);                  //Отправляем на экран значение переменной "a"
}
 
void loop()                            //Теперь наслаждаемся результатом
{
  tim();                               //Запускаем функцию "tim"
  if(flag1 == 1)                       //если значение "flag1" = "1"(в реальности это произойдет через 10секунд после старта)
  {digitalWrite(Out1,HIGH);}           //то Out1 включаем
  if(flag1 == 0)                       //если значение "flag1" = "0"(в реальности это произойдет через 5секунд после включения Out1)
  {digitalWrite(Out1,LOW);}            //то Out1 выключаем
}

 

vk007
Offline
Зарегистрирован: 16.06.2015

SLONik_24 пишет:

не использую delay, по понятным причинам

Причины как раз и не понятны.

У Вас нет ничего такого "критичного". И кнопки никакие Вы не опрашиваете. Если только для саморазвития, дальнейшего апгрейда устройства, то да. А так с delay это уместилось бы в несколько строк.

SLONik_24
SLONik_24 аватар
Offline
Зарегистрирован: 27.12.2015

Это конечно Вы правы, но и правы в том, что я заморочился этим не для того, чтобы диодом моргать))) делал я устройства и значительно сложней по железу и вот там, как раз delay мешается...в разработке стенд для проверки форсунок. Там тебе и кнопки и дисплей 16х2 и включение на время и ШИМ и обратная связь по датчику давления...

И написал я этот пост потому, как сам долго искал, что то подобное...

Как Вам бредборд авторский?

vk007
Offline
Зарегистрирован: 16.06.2015

SLONik_24 пишет:

Как Вам бредборд авторский?

Впечатляет, есть где развернуться :)