Блок управления автоматикой. Не могу разобраться с таймером. Не реагирует на команды.
- Войдите на сайт для отправки комментариев
Вс, 18/12/2016 - 01:55
// Блок управления домашней автоматикой на 12В для распашных ворот.
// Не могу разобраться с таймером. Не реагирует на команды с кнопки. Описал в первом режиме.
// Мой первый код. Прошу сильно не пинать")))"
int regim=1;
int flag=0;
int relayM1 = 8; // Открытие первой створки
int relayM2 = 9; // Открытие второй створки
int relayM1R = 10; // R - реверс (закрытие первой створки)
int relayM2R = 11; // R - реверс (закрытие второй створки)
int swPin = 7; // Кнопка упрвления (открыть, стоп, закрыть, стоп)
int runTimer = 1;
int runFor = 3; //Таймер в сек. (время задержки одного из двигателей)
int data = 0;
int LED = 12; // Сигнальная лампа(моргает пока работает хотя-бы один из двигателей)
int sens = 6; // Контакты для фотоэлементов внутри арки. При замыкании контактов двигатели останавливаются на некоторое время (2-5с) и идут в реверс (открыватся)
/* Из таймеров должены быть:
1- Время работы системы на открытие
2- Время работы системы на закрытие
3- Задержка первой створки (двигателя)
4- Задержка второй створки (двигателя)
*/
void setup()
{
pinMode(relayM1, OUTPUT);
pinMode(relayM2, OUTPUT);
pinMode(relayM1R, OUTPUT);
pinMode(relayM2R, OUTPUT);
pinMode(swPin, INPUT);
pinMode(LED, OUTPUT);
pinMode(sens, INPUT);
digitalWrite(swPin, HIGH);//включаем внутренний pull-up резистор
}
void loop()
{
if(digitalRead(swPin) == HIGH && flag==0)//если кнопка нажата
// и перемення flag равна 0 , то ...
{
regim ++;
flag = 1;
if(regim>4)//ограничим количество режимов
{
regim=1;//так как мы используем только одну кнопку, то переключать режимы будем циклично
}
}
if(digitalRead(swPin) == LOW && flag == 1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
flag = 0;//обнуляем переменную "knopka"
}
if(regim == 1)//первый режим
{
/*----------Задержка на открытие для мотора M1 ---------------*/
int val = digitalRead(swPin);
if (val == 1)
{
digitalWrite(relayM1,LOW);
timer();
}
else {digitalWrite(relayM1,HIGH);}
runTimer=0;
// !!! Задержка происходит как надо, но пока включена задержка видимо из-за delay не реагирует на кнопку swPin. Т.е. ворота не остановить.
// И при повторном запуске кода таймер уже не работает. Как буд-то уже отсчитал и запомнил как сделанное.
/*-----------------------------------------------------------------------*/
digitalWrite(relayM2,LOW);
digitalWrite(relayM1R,HIGH);
digitalWrite(relayM2R,HIGH);
delay(50);
}
if(regim == 2)//Второй режим. Ворота остановились.
{
digitalWrite(relayM1,HIGH);
digitalWrite(relayM2,HIGH);
digitalWrite(relayM1R,HIGH);
digitalWrite(relayM2R,HIGH);
delay(50);
}
if(regim == 3)//Третий режим. Ворота закрываются.
{
/*---------------Задержка на закрытие для мотора М2--------------------*/
int val = digitalRead(swPin);
if (val == 1)
{
digitalWrite(relayM2R,LOW);
timer();
}
else {digitalWrite(relayM2R,HIGH);}
runTimer=0;
digitalWrite(relayM1,HIGH);
digitalWrite(relayM2,HIGH);
digitalWrite(relayM1R,LOW);
delay(50);
}
if(regim == 4)//Третий режим. Ворота остановились.
{
digitalWrite(relayM1,HIGH);
digitalWrite(relayM2,HIGH);
digitalWrite(relayM1R,HIGH);
digitalWrite(relayM2R,HIGH);
delay(50);
}
}
void timer()
{
for(int timer=runFor;timer>0;--timer)
{delay(1000);}
}