Цикл поворотов Servo (Влево-Вправо) на заданной скорости
- Войдите на сайт для отправки комментариев
Конструкция такова: переделал напольный дешёвый вентилятор. Работает через ИК пульт. На вентиляторе можно с пульта включить/переключить любой из 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" в исходное состояние } }
Во всём коде не используется delay(), т.к. при его использовании всё может стать клином...