Цикл поворотов Servo (Влево-Вправо) на заданной скорости

Otto
Offline
Зарегистрирован: 26.06.2016

Конструкция такова: переделал напольный дешёвый вентилятор. Работает через ИК пульт. На вентиляторе можно с пульта включить/переключить любой из 3-х режимов скорости + поставить на каждый режим скорости таймер через который отключится вентилятор. В вентиляторе переделал системы поворотов и теперь можно так же с пульта через Servo-привод поворачивать вентилятор влево-вправо (при зажатии на пульте кнопуки - осуществляется поворот в нужную сторону).

Всё работает достаточно хорошо. Вот только в ступор ввела простая мысль. Хочу ещё добавить автоповороты вентилятора (влево-вправо) при коротком нажатии одной кнопки (с небольшой скоростью, что бы происходили плавные повороты) и отключение данного режима при нажатии другой кнопки.

Помогите пожалуйста сделать часть кода ручного управления серво с небольшой плавной скоростью. Так же может кому пригодятся мои наработки с вентилятором, код так же выложу, получилось в реале классно!

вот часть кода отвечающая за вращения серво при нажатии кнопок:

#include <Servo.h>      //библиотека для Servo
#include <IRremote.h>   // библиотека IRremote для ИК пульта

int RECV_PIN = 11; //вход ИК инфракрасного приемника 
IRrecv irrecv(RECV_PIN);
decode_results results;

Servo servoPovorot; //даём имя servo

// переменные для контроля за процессом поворотов Servo
bool Right_Pin_1 = false;
bool Left_Pin_1  = false;


/* Переменная для плавного вращения servo,чтобы не использовать delay.
промежуточная переменная для хранения (увеличенного диапазона от 0 до 20000)значений (увеличения или уменьшения)PWM,
с последующей конвертации в переменную(val_1) диапазон градусов поворота доступных для servo.*/
int L = 0;

//переменная для конвертации (увеличенного диапазона значений от 0 до 20000) (L),в значения требуемые для поворота servo.
int val_1; 

//переменная для (увеличения или уменьшения)скорости поворота servo.
int speed_PWM = 1;

//переменная eventTime, для паузы, вместо delay,будем использовать функцию millis.
unsigned long eventTime = 0;


void setup() {              
  irrecv.enableIRIn(); // включить ИК приёмник
  servoPovorot.attach(9); // серво подключён на цифровой вход (pin 9)
}

void loop() {
   /* Делаем, что бы система работала в режиме удержания кнопки для Серво.
  После приёма определённого кода кнопки,сразу перехватывать идущий за ним (кодом), (пустой инфракрасный сигнал)
  и считать его - (пустой инфракрасный сигнал), за код кнопки. 
  После пропадания (пустого инфракрасного сигнала) - будем считать, что код перестал слаться.*/

  /* 1. После приёма определённого кода кнопки, перехватывать (пустой инфракрасный сигнал).
     2. Конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.
  После появления и пропадания сигнала, состояние сразу не меняется! а ждет  100 миллисекунд.
  Если 100 миллисекунд не прошло, и поступил еще один ИК сигнал с пульта,
  тогда таймер заново запускается на 100 миллисекунд.*/
  
  if (digitalRead(RECV_PIN) == LOW)     
    eventTime=millis();  
  if(millis()-eventTime>100) (Right_Pin_1 = false),(Left_Pin_1 = false);


  /* Если Right_Pin_1) ==, выставляем ограничение для переменной(L) до (&& L<30000) и начинаем увеличивать
  значения переменной(L), на значение переменной speed_PWM,
  и также выставляем ограничение при убывании (&& a>0).*/
  if(Right_Pin_1 == true && L<20000  ) L=L+speed_PWM;
  if(Left_Pin_1  == true && L>0  ) L=L-speed_PWM;


  //читаем значение (L) и конвертируем его в значение val_1, то бишь в значение поворота в градусов доступных для servo.
  val_1 = L;           
  val_1 = map(val_1, 0, 20000, 1, 130);     // (углы поворота от 1 до 130 градусов)
  servoPovorot.write(val_1);                // Положение Серво в соответствии с val_1.


// 2 Команды с пульта отвечающие за ручные повороты Серво.
  if(results.value == 0xFFC23D) Right_Pin_1  = true;   // Поворот Вправо
  if(results.value == 0xFF22DD) Left_Pin_1   = true;   // Поворот Влуво


    irrecv.resume(); 
  }
}

Вот полный рабочий код для вентилятора:

/*
 За основу взят скетч Дмитрия Осипова:
 "урок от Дмитрия Осипова - управление arduino ИК пультом" - ссылка: https://www.youtube.com/watch?v=PjR9jlP4644

 Данный скетч сделан для переключения режимов напольного вентилятора с ИК пульта через реле.
 Скетч расчитан на переключения 3-х режима скорости + индикация светодиодами 3-мя цветами на каждый режим и кнопка - Выключить ВСЁ.
 При переключении режимов, предыдущий режим выключается, дабы избежать одновременного включения 2-х и более режимов!
 Так же для каждого из трёх режимов есть по 3 таймера с отключением по: 15, 30, 45 минут.
 Автор: Otto
 Версия изменения: 0.3 beta
 Создан: 16 Сентября 2016 года        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 */
#include <Servo.h>         // Библиотека для Servo-Мотора
#include <IRremote.h>      // Библиотека для ИК приёмника

#define REJ1 2   // режим  1
#define REJ2 3   // режим  2
#define REJ3 4   // режим  3

#define GREAN 5  // Зелёный
#define BLUE 6   // Синий
#define RED 7    // Красный


byte RECV_PIN = 11;       // вход ИК приемника
IRrecv irrecv(RECV_PIN);  // Объект ИК
decode_results results;

Servo servoPovorot; //даём имя servo

// переменные для контроля за процессом поворотов Servo
bool Right_Pin_1   = false;
bool Left_Pin_1    = false;


/* Переменная для плавного вращения servo,чтобы не использовать delay.
промежуточная переменная для хранения (увеличенного диапазона от 0 до 20000)значений (увеличения или уменьшения)PWM,
с последующей конвертации в переменную(val_1) диапазон градусов поворота доступных для servo.*/
int L = 0;

//переменная для конвертации (увеличенного диапазона значений от 0 до 20000) (L),в значения требуемые для поворота servo.
int val_1; 

//переменная для (увеличения или уменьшения)скорости поворота servo.
int speed_PWM = 1;

//переменная eventTime, для паузы, вместо delay,будем использовать функцию millis.
unsigned long eventTime = 0;



// переменные переключения режимов, при нажатии кнопок они принимают значения +1
bool a = 0; // Режим 1, кнопка на пульте 1 (БЕЗ ТАЙМЕРА)
bool b = 0; // Режим 2, кнопка на пульте 2 (БЕЗ ТАЙМЕРА)
bool c = 0; // Режим 3, кнопка на пульте 3 (БЕЗ ТАЙМЕРА)
bool d = 0; // Для выключения ВСЕХ режимов!

// переменные 1 режима для включения по таймеру:
bool e = 0; // Режим 1, кнопка на пульте 4 (ТАЙМЕР НА 15 МИНУТ)
bool f = 0; // Режим 1, кнопка на пульте 7 (ТАЙМЕР НА 30 МИНУТ)
bool g = 0; // Режим 1, кнопка на пульте * (ТАЙМЕР НА 45 МИНУТ)

// переменные 2 режима для включения по таймеру:
bool h = 0; // Режим 2, кнопка на пульте 5 (ТАЙМЕР НА 15 МИНУТ)
bool i = 0; // Режим 2, кнопка на пульте 8 (ТАЙМЕР НА 30 МИНУТ)
bool j = 0; // Режим 2, кнопка на пульте 0 (ТАЙМЕР НА 45 МИНУТ)

// переменные 3 режима для включения по таймеру:
bool k = 0; // Режим 3, кнопка на пульте 6 (ТАЙМЕР НА 15 МИНУТ)
bool l = 0; // Режим 3, кнопка на пульте 9 (ТАЙМЕР НА 30 МИНУТ)
bool m = 0; // Режим 3, кнопка на пульте # (ТАЙМЕР НА 45 МИНУТ)

// переменные для переключений переменных в режимах с таймером
bool f_e = 0;
bool f_f = 0;
bool f_g = 0;

bool f_h = 0;
bool f_i = 0;
bool f_j = 0;

bool f_k = 0;
bool f_l = 0;
bool f_m = 0;


//Далее идёт код для таймера...
unsigned long millis_old[9];                      //массив для хранения последних данных о времени срабатывания таймера.Количество элементов соответствует количеству таймеров
bool my_timer(unsigned long time, byte nomer)     //функция таймер, time-время задержки, nomer-номер таймера
{
  unsigned long current_millis;                   //текущее значение миллисекунды
  current_millis = millis();
  if (current_millis - millis_old[nomer] > time)  //если время срабатывания таймера наступило
  {
    millis_old[nomer] = current_millis;           //перезаписываем время последнего срабатывания таймера
    return true;                                  //возвращаем true
  } else return false;                            //возвращаем false
}


void setup() {
irrecv.enableIRIn();    // включить ИК приёмник
servoPovorot.attach(9); // Servo подключён на цифровой вход (pin 9)

  // назначаем все необходимые pin'ы как ВЫХОДЫ
  pinMode(REJ1, OUTPUT);  // режим 1 ВЫХОД
  pinMode(REJ2, OUTPUT);  // режим 2 ВЫХОД
  pinMode(REJ3, OUTPUT);  // режим 3 ВЫХОД

  pinMode(GREAN, OUTPUT); // Зелёный цвет к режиму 1
  pinMode(BLUE, OUTPUT);  // Синий  цвет  к режиму 2
  pinMode(RED, OUTPUT);   // Красный свет к Режиму 3

  // При включении Arduino на всех пинах LOW.
  // ВНИМАНИЕ!!! ИНВЕРСИЯ питания для ЭЛЕКТРОМАГНИТНЫХ Реле!!! (HIGH - выключено реле, LOW - включено).
  digitalWrite(REJ1, HIGH); // режим 1 Off
  digitalWrite(REJ2, HIGH); // режим 2 Off
  digitalWrite(REJ3, HIGH); // режим 3 Off

  digitalWrite(GREAN, LOW); // Зелёный цвет Off
  digitalWrite(BLUE, LOW);  // Синий  цвет  Off
  digitalWrite(RED, LOW);   // Красный цвет Off
}

void off()      // Функция выключения всех режимов и светодиодов + отсчёт времени
{
  // выключаем все реле
  digitalWrite(REJ1, HIGH); // режим 1 Off
  digitalWrite(REJ2, HIGH); // режим 2 Off
  digitalWrite(REJ3, HIGH); // режим 3 Off
  // выключаем все светодиоды
  digitalWrite(GREAN, LOW); // Зелёный цвет Off
  digitalWrite(BLUE, LOW);  // Синий  цвет  Off
  digitalWrite(RED, LOW);   // Красный цвет Off
  millis_old[0] = millis();
  millis_old[1] = millis();
  millis_old[2] = millis();
  millis_old[3] = millis();
  millis_old[4] = millis();
  millis_old[5] = millis();
  millis_old[6] = millis();
  millis_old[7] = millis();
  millis_old[8] = millis();
}


void loop() {
    /* Делаем, что бы система работала в режиме удержания кнопки для Серво.
  После приёма определённого кода кнопки,сразу перехватывать идущий за ним (кодом), (пустой инфракрасный сигнал)
  и считать его - (пустой инфракрасный сигнал), за код кнопки. 
  После пропадания (пустого инфракрасного сигнала) - будем считать, что код перестал слаться.*/

  /* 1. После приёма определённого кода кнопки, перехватывать (пустой инфракрасный сигнал).
     2. Конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.
  После появления и пропадания сигнала, состояние сразу не меняется! а ждет  100 миллисекунд.
  Если 100 миллисекунд не прошло, и поступил еще один ИК сигнал с пульта,
  тогда таймер заново запускается на 100 миллисекунд.*/

  if (digitalRead(RECV_PIN) == LOW)     
    eventTime=millis();
  if(millis()-eventTime>100) (Right_Pin_1 = false),(Left_Pin_1 = false);

 /* Если Right_Pin_1) ==, выставляем ограничение для переменной(L) до (&& L<30000) и начинаем увеличивать
  значения переменной(L), на значение переменной speed_PWM,
  и также выставляем ограничение при убывании (&& a>0).*/
  
  if(Right_Pin_1 ==  true && L<20000  ) L=L+speed_PWM;
  if(Left_Pin_1  ==  true && L>0  ) L=L-speed_PWM;


//читаем значение (L) и конвертируем его в значение val_1, то бишь в значение поворота в градусов доступных для servo.
  val_1 = L;
  val_1 = map(val_1, 0, 20000, 1, 130);     // Задаём диапазон скорости и поворота Серво (углы поворота от 1 до 130 градусов)
  servoPovorot.write(val_1);                // Положение Серво в соответствии с val_1.

  
if (irrecv.decode(&results)) {

// 2 Команды с пульта отвечающие за ручные повороты Серво.
  if(results.value == 0xFFC23D) Right_Pin_1  = true;   // Поворот Вправо
  if(results.value == 0xFF22DD) Left_Pin_1   = true;   // Поворот Влуво


// далее идут коды кнопок и режимы вентилятора...    
// всегда во всех режимах включен только один режим, остальные - off
if (results.value == 0xFF6897) {a=1; b=0; c=0; e=0; f=0; g=0; h=0; i=0; j=0; k=0; l=0; m=0;}   // a
if (results.value == 0xFF9867) {a=0; b=1; c=0; e=0; f=0; g=0; h=0; i=0; j=0; k=0; l=0; m=0;}   // b
if (results.value == 0xFFB04F) {a=0; b=0; c=1; e=0; f=0; g=0; h=0; i=0; j=0; k=0; l=0; m=0;}   // c
if (results.value == 0xFF02FD) {a=0; b=0; c=0; d=1; e=0; f=0; g=0; h=0; i=0; j=0; k=0; l=0; m=0;} // Выключить всё! - d

// 1 режим по таймеру
if (results.value == 0xFF30CF) {a=0; b=0; c=0; e=1; f=0; g=0; h=0; i=0; j=0; k=0; l=0; m=0;}  // e - 15 мин
if (results.value == 0xFF10EF) {a=0; b=0; c=0; e=0; f=1; g=0; h=0; i=0; j=0; k=0; l=0; m=0;}  // f - 30 мин
if (results.value == 0xFF42BD) {a=0; b=0; c=0; e=0; f=0; g=1; h=0; i=0; j=0; k=0; l=0; m=0;}  // g - 45 мин

// 2 режим по таймеру
if (results.value == 0xFF18E7) {a=0; b=0; c=0; e=0; f=0; g=0; h=1; i=0; j=0; k=0; l=0; m=0;}  // h - 15 мин
if (results.value == 0xFF38C7) {a=0; b=0; c=0; e=0; f=0; g=0; h=0; i=1; j=0; k=0; l=0; m=0;}  // i - 30 мин
if (results.value == 0xFF4AB5) {a=0; b=0; c=0; e=0; f=0; g=0; h=0; i=0; j=1; k=0; l=0; m=0;}  // j - 45 мин

// 3 режим по таймеру
if (results.value == 0xFF7A85) {a=0; b=0; c=0; e=0; f=0; g=0; h=0; i=0; j=0; k=1; l=0; m=0;}  // k - 15 мин
if (results.value == 0xFF5AA5) {a=0; b=0; c=0; e=0; f=0; g=0; h=0; i=0; j=0; k=0; l=1; m=0;}  // l - 30 мин
if (results.value == 0xFF52AD) {a=0; b=0; c=0; e=0; f=0; g=0; h=0; i=0; j=0; k=0; l=0; m=1;}  // m - 45 мин

  irrecv.resume(); // получаем следующие значения
}


// действия БЕЗ ТАЙМЕРА:
if (a==1){      // Если "a" равер 1, то...
    //выключаем все остальные режимы и светодиоды
  digitalWrite(REJ2, HIGH);   // режим 2 Off
  digitalWrite(BLUE, LOW);    // Синий цвет Off
  digitalWrite(REJ3, HIGH);   // режим 3 Off
  digitalWrite(RED, LOW);     // Красный цвет Off  
  // включаем 1 режим
  digitalWrite(REJ1, LOW);    // режим 1 On
  digitalWrite(GREAN, HIGH);  // Зелёный цвет On
  } else {      // Иначе...
  // выключаем 1 режим
  digitalWrite(REJ1, HIGH);   // режим 1 Off
  digitalWrite(GREAN, LOW);   // Зелёный цвет Off
  a=0;  //возвращаем переменную "a" в исходное состояние
  }

if (b==1){      // Если "b" равер 1, то...
    //выключаем все остальные режимы и светодиоды
  digitalWrite(REJ1, HIGH);   // режим 1 Off
  digitalWrite(GREAN, LOW);   // Зелёный цвет Off
  digitalWrite(REJ3, HIGH);   // режим 3 Off
  digitalWrite(RED, LOW);     // Красный цвет Off
  // включаем 2 режим  
  digitalWrite(REJ2, LOW);    // режим 2 On
  digitalWrite(BLUE, HIGH);   // Синий цвет On
  } else {      // Иначе...
  // выключаем 2 режим
  digitalWrite(REJ2, HIGH);   // режим 2 Off
  digitalWrite(BLUE, LOW);    // Синий цвет Off
  b=0;  //возвращаем переменную "b" в исходное состояние
  }
  
if (c==1){      // Если "c" равер 1, то...
    //выключаем все остальные режимы и светодиоды
  digitalWrite(REJ1, HIGH);   // режим 1 Off
  digitalWrite(GREAN, LOW);   // Зелёный цвет Off
  digitalWrite(REJ2, HIGH);   // режим 2 Off
  digitalWrite(BLUE, LOW);    // Синий цвет Off
  // включаем 3 режим  
  digitalWrite(REJ3, LOW);    // режим 3 On
  digitalWrite(RED, HIGH);    // Красный цвет On
  } else {      // Иначе...
  // выключаем 3 режим
  digitalWrite(REJ3, HIGH);   // режим 3 Off
  digitalWrite(RED, LOW);     // Красный цвет Off
  c=0;  //возвращаем переменную "c" в исходное состояние
  }



// действия по таймеру:

/////////////////////////////////////////////////////////////////////////

  // ТАЙМЕРЫ ДЛЯ РЕЖИМА 1
  if (e == 1) {       // Если "e" равер 1, то...
    if (f_e == 0)  //Выполняется 1 раз при e=1
    {
      off();  //Отключаем ВСЕ
      //Отключаем остальные режимы и готовим их на случай Включеня
    f_e = 1;
    f_f = 0;
    f_g = 0;
    f_h = 0;
    f_i = 0;
    f_j = 0;
    f_k = 0;
    f_l = 0;
    f_m = 0;
    
      a = 0;
      b = 0;
      c = 0;
      e = 1;
      f = 0;
      g = 0;
      h = 0;
      i = 0;
      j = 0;
      k = 0;
      l = 0;
      m = 0;
    }
    
      // включаем 1 режим на 15 минут
      digitalWrite(REJ1, LOW);    // режим 1 On
      digitalWrite(GREAN, HIGH);  // Зелёный цвет On
   
    if (my_timer(900000, 0)) {    // Имя_Таймера(Время_В_Миллисикундах, Номер_Таймера)
      off();    //Отключаем ВСЕ
      e = 0;  //возвращаем переменную "e" в исходное состояние
    }
  }


  if (f == 1) {       // Если "f" равер 1, то...
    if (f_f == 0)  //Выполняется 1 раз при f=1
    {
      off();  //Отключаем ВСЕ
      //Отключаем остальные режимы и готовим их на случай Включеня
    f_e = 0;
    f_f = 1;
    f_g = 0;
    f_h = 0;
    f_i = 0;
    f_j = 0;
    f_k = 0;
    f_l = 0;
    f_m = 0;
    
      a = 0;
      b = 0;
      c = 0;
      e = 0;
      f = 1;
      g = 0;
      h = 0;
      i = 0;
      j = 0;
      k = 0;
      l = 0;
      m = 0;
    }
    
      // включаем 1 режим на 30 минут
      digitalWrite(REJ1, LOW);    // режим 1 On
      digitalWrite(GREAN, HIGH);  // Зелёный цвет On
   
    if (my_timer(1800000, 1)) {    // Имя_Таймера(Время_В_Миллисикундах, Номер_Таймера)
      off();    //Отключаем ВСЕ
      f = 0;  //возвращаем переменную "f" в исходное состояние
    }
  }


  if (g == 1) {       // Если "g" равер 1, то...
    if (f_g == 0)  //Выполняется 1 раз при g=1
    {
      off();  //Отключаем ВСЕ
      //Отключаем остальные режимы и готовим их на случай Включеня
    f_e = 0;
    f_f = 0;
    f_g = 1;
    f_h = 0;
    f_i = 0;
    f_j = 0;
    f_k = 0;
    f_l = 0;
    f_m = 0;
    
      a = 0;
      b = 0;
      c = 0;
      e = 0;
      f = 0;
      g = 1;
      h = 0;
      i = 0;
      j = 0;
      k = 0;
      l = 0;
      m = 0;
    }
    
      // включаем 1 режим на 45 минут
      digitalWrite(REJ1, LOW);    // режим 3 On
      digitalWrite(GREAN, HIGH);  // Зелёный цвет On
   
    if (my_timer(2700000, 2)) {    // Имя_Таймера(Время_В_Миллисикундах, Номер_Таймера)
      off();    //Отключаем ВСЕ
      g = 0;  //возвращаем переменную "g" в исходное состояние
    }
  }


/////////////////////////////////////////////////////////////////////////


  // ТАЙМЕРЫ ДЛЯ РЕЖИМА 2
  if (h == 1) {       // Если "h" равер 1, то...
    if (f_h == 0)  //Выполняется 1 раз при h=1
    {
      off();  //Отключаем ВСЕ
      //Отключаем остальные режимы и готовим их на случай Включеня
    f_e = 0;
    f_f = 0;
    f_g = 0;
    f_h = 1;
    f_i = 0;
    f_j = 0;
    f_k = 0;
    f_l = 0;
    f_m = 0;
    
      a = 0;
      b = 0;
      c = 0;
      e = 0;
      f = 0;
      g = 0;
      h = 1;
      i = 0;
      j = 0;
      k = 0;
      l = 0;
      m = 0;
    }
    
      // включаем 2 режим на 15 минут
      digitalWrite(REJ2, LOW);    // режим 2 On
      digitalWrite(BLUE, HIGH);   // Синий цвет On
   
    if (my_timer(900000, 3)) {    // Имя_Таймера(Время_В_Миллисикундах, Номер_Таймера)
      off();    //Отключаем ВСЕ
      h = 0;  //возвращаем переменную "h" в исходное состояние
    }
  }


  if (i == 1) {       // Если "i" равер 1, то...
    if (f_i == 0)  //Выполняется 1 раз при i=1
    {
      off();  //Отключаем ВСЕ
      //Отключаем остальные режимы и готовим их на случай Включеня
    f_e = 0;
    f_f = 0;
    f_g = 0;
    f_h = 0;
    f_i = 1;
    f_j = 0;
    f_k = 0;
    f_l = 0;
    f_m = 0;
    
      a = 0;
      b = 0;
      c = 0;
      e = 0;
      f = 0;
      g = 0;
      h = 0;
      i = 1;
      j = 0;
      k = 0;
      l = 0;
      m = 0;
    }
    
      // включаем 2 режим на 30 минут
      digitalWrite(REJ2, LOW);    // режим 2 On
      digitalWrite(BLUE, HIGH);   // Синий цвет On
   
    if (my_timer(1800000, 4)) {    // Имя_Таймера(Время_В_Миллисикундах, Номер_Таймера)
      off();    //Отключаем ВСЕ
      i = 0;  //возвращаем переменную "i" в исходное состояние
    }
  }


  if (j == 1) {       // Если "j" равер 1, то...
    if (f_j == 0)  //Выполняется 1 раз при j=1
    {
      off();  //Отключаем ВСЕ
      //Отключаем остальные режимы и готовим их на случай Включеня
    f_e = 0;
    f_f = 0;
    f_g = 0;
    f_h = 0;
    f_i = 0;
    f_j = 1;
    f_k = 0;
    f_l = 0;
    f_m = 0;
    
      a = 0;
      b = 0;
      c = 0;
      e = 0;
      f = 0;
      g = 0;
      h = 0;
      i = 0;
      j = 1;
      k = 0;
      l = 0;
      m = 0;
    }
    
      // включаем 2 режим на 45 минут
      digitalWrite(REJ2, LOW);    // режим 2 On
      digitalWrite(BLUE, HIGH);   // Синий цвет On
   
    if (my_timer(2700000, 5)) {    // Имя_Таймера(Время_В_Миллисикундах, Номер_Таймера)
      off();    //Отключаем ВСЕ
      j = 0;  //возвращаем переменную "j" в исходное состояние
    }
  }


/////////////////////////////////////////////////////////////////////////


  // ТАЙМЕРЫ ДЛЯ РЕЖИМА 3
  if (k == 1) {       // Если "k" равер 1, то...
    if (f_k == 0)  //Выполняется 1 раз при k=1
    {
      off();  //Отключаем ВСЕ
      //Отключаем остальные режимы и готовим их на случай Включеня
    f_e = 0;
    f_f = 0;
    f_g = 0;
    f_h = 0;
    f_i = 0;
    f_j = 0;
    f_k = 1;
    f_l = 0;
    f_m = 0;
    
      a = 0;
      b = 0;
      c = 0;
      e = 0;
      f = 0;
      g = 0;
      h = 0;
      i = 0;
      j = 0;
      k = 1;
      l = 0;
      m = 0;
    }
    
      // включаем 3 режим на 15 минут
      digitalWrite(REJ3, LOW);    // режим 3 On
      digitalWrite(RED, HIGH);    // Красный цвет On
   
    if (my_timer(900000, 6)) {    // Имя_Таймера(Время_В_Миллисикундах, Номер_Таймера)
      off();    //Отключаем ВСЕ
      k = 0;  //возвращаем переменную "k" в исходное состояние
    }
  }


  if (l == 1) {       // Если "l" равер 1, то...
    if (f_l == 0)  //Выполняется 1 раз при l=1
    {
      off();  //Отключаем ВСЕ
      //Отключаем остальные режимы и готовим их на случай Включеня
    f_e = 0;
    f_f = 0;
    f_g = 0;
    f_h = 0;
    f_i = 0;
    f_j = 0;
    f_k = 0;
    f_l = 1;
    f_m = 0;
    
      a = 0;
      b = 0;
      c = 0;
      e = 0;
      f = 0;
      g = 0;
      h = 0;
      i = 0;
      j = 0;
      k = 0;
      l = 1;
      m = 0;
    }
    
      // включаем 3 режим на 30 минут
      digitalWrite(REJ3, LOW);    // режим 3 On
      digitalWrite(RED, HIGH);    // Красный цвет On
   
    if (my_timer(1800000, 7)) {    // Имя_Таймера(Время_В_Миллисикундах, Номер_Таймера)
      off();    //Отключаем ВСЕ
      l = 0;  //возвращаем переменную "l" в исходное состояние
    }
  }


  if (m == 1) {       // Если "m" равер 1, то...
    if (f_m == 0)  //Выполняется 1 раз при m=1
    {
      off();  //Отключаем ВСЕ
      //Отключаем остальные режимы и готовим их на случай Включеня
    f_e = 0;
    f_f = 0;
    f_g = 0;
    f_h = 0;
    f_i = 0;
    f_j = 0;
    f_k = 0;
    f_l = 0;
    f_m = 1;
    
      a = 0;
      b = 0;
      c = 0;
      e = 0;
      f = 0;
      g = 0;
      h = 0;
      i = 0;
      j = 0;
      k = 0;
      l = 0;
      m = 1;
    }
    
      // включаем 3 режим на 45 минут
      digitalWrite(REJ3, LOW);    // режим 3 On
      digitalWrite(RED, HIGH);    // Красный цвет On
   
    if (my_timer(2700000, 8)) {    // Имя_Таймера(Время_В_Миллисикундах, Номер_Таймера)
      off();    //Отключаем ВСЕ
      m = 0;  //возвращаем переменную "m" в исходное состояние
    }
  }

  

// Внопка Выключения любого режима
  if (d == 1) {   // Если "d" равер 1, то - ВЫКЛЮЧАЕМ ВСЁ!!!
    off();
    f_e = 0;
    f_f = 0;
    f_g = 0;
    f_h = 0;
    f_i = 0;
    f_j = 0;
    f_k = 0;
    f_l = 0;
    f_m = 0;
    
      a = 0;
      b = 0;
      c = 0;
      e = 0;
      f = 0;
      g = 0;
      h = 0;
      i = 0;
      j = 0;
      k = 0;
      l = 0;
      m = 0;
    d = 0;  //возвращаем переменную "d" в исходное состояние
  }

}

 

Otto
Offline
Зарегистрирован: 26.06.2016

Во всём коде не используется delay(), т.к. при его использовании всё может стать клином...