| Ваш IP: 54.158.248.112 | Online(19) - гости: 11, боты: 8 | Загрузка сервера: 3.12 ::::::::::::

4-х канальное реле времени (Arduino)

Реле времени позволяет коммутировать 4 реле, для этого необходимо указать для каждого реле время включения и время выключения. Перед установкой времени срабатывания реле необходимо установить правильное время на часах, корректировка времени часов включается одновременным нажатием кнопок «+» и «-«, далее при нажатии кнопки «К» производится установка минут, а при повторном нажатии кнопки часов. Аналогично происходит установка времени срабатывания реле. При много кратном нажимании кнопки «К» (надо выйти из режима коррекции часов), приходит перебор параметров установки времени реле.

Параметры времени реле включаются в себя несколько повторяющихся пунктов:

  • 1 on 00:00 kor_m — установки минут для времени включения первого реле
  • 1 on 00:00 kor_h — установки часов для времени включения первого реле
  • 1 off 00:00 kor_m — установки минут для времени выключения первого реле
  • 1 off 00:00 kor_h — установки часов для времени выключения первого реле

и далее аналогично для всех реле.

При помощи кнопок «+» и «-» производится установка времени срабатывания реле.

Информация о времени и состоянии реле выводится на индикатор:

  •  19:45:00 TIME — первая строка время (установка времени)
  •     0   1   0   1    — вторая строка, индикатор состояние реле, коррекция времени реле

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
#include <MsTimer2.h>
unsigned long time0;
byte korr_time,s, m, h, m0,h0;
byte m_1_on,h_1_on,m_1_off,h_1_off;
byte m_2_on,h_2_on,m_2_off,h_2_off;
byte m_3_on,h_3_on,m_3_off,h_3_off;
byte m_4_on,h_4_on,m_4_off,h_4_off;
int kn,kn1,kn2,korr,korr_rele;
void setup()
{ 
  lcd.begin(16, 2);// LCD 16X2
  MsTimer2::set(1000, to_Timer);// задаем период 1с
  MsTimer2::start();// старт таймера
  pinMode(6,OUTPUT);//реле1
  pinMode(5,OUTPUT);//реле2
  pinMode(4,OUTPUT);//реле3
  pinMode(3,OUTPUT);//реле4
  pinMode(A3,INPUT);// кнопка К
  pinMode(A4,INPUT);// кнопка +
  pinMode(A5,INPUT);// кнопка -
}

void to_Timer(){ s++;} // отсчет 1 с // функция таймера

void loop(){
  kn=analogRead(A3);// опрос кнопки, если значение больше 600 считать его HIGH
  kn1=analogRead(A4);// опрос кнопки, если значение больше 600 считать его HIGH
  kn2=analogRead(A5);// опрос кнопки, если значение больше 600 считать его HIGH
  // ВКЛЮЧЕНИЕ КОРРЕКЦИИ ВРЕМЕНИ = НАЖАТЬ ОДНОВРЕМЕННО КНОПКИ + И -
  if(kn1>600 && kn2>600){korr_time=1;}
  if(kn>600 && korr_time==1){korr++;if(korr>=3){korr=0;korr_time=0;time0=millis();}}
  if(time0-millis()<=200){kn=0;}
/// КОРРЕКЦИЯ ВРЕМЕНИ ЧАСОВ /////////
  if(kn1>600 && korr==1){m++;}
  if(kn1>600 && korr==2){h++;}
  if(kn2>600 && korr==1){m--;if(m>60){m=0;}}
  if(kn2>600 && korr==2){h--;}
/// ОТСЧЕТ ВРЕМЕНИ ЧАСОВ ///////
  if(s > 59){s = 0;++m;} // отсчет 1 мин
  if(m > 59){m = 0;++h;} // отсчет 1 час
  if(h > 23){h = 0;}
/// УСТАНОВКА ВРЕМЕНИ СРАБАТЫВАНИЯ РЕЛЕ ////////////////////////////
  if(korr_time==0){ 
  if(kn>600){korr_rele++;if(korr_rele>=17){korr_rele=0;}}
  if(korr_rele>=1 && korr_rele<=2){m0=m_1_on;h0=h_1_on;}
  if(korr_rele>=3 && korr_rele<=4){m0=m_1_off;h0=h_1_off;}
  if(korr_rele>=5 && korr_rele<=6){m0=m_2_on;h0=h_2_on;}
  if(korr_rele>=7 && korr_rele<=8){m0=m_2_off;h0=h_2_off;}
  if(korr_rele>=9 && korr_rele<=10){m0=m_3_on;h0=h_3_on;}
  if(korr_rele>=11 && korr_rele<=12){m0=m_3_off;h0=h_3_off;}
  if(korr_rele>=13 && korr_rele<=14){m0=m_4_on;h0=h_4_on;}
  if(korr_rele>=15 && korr_rele<=16){m0=m_4_off;h0=h_4_off;}
/// КОРРЕКЦИЯ ВРЕМЕНИ РЕЛЕ /////////
  if(kn1>600 && (korr_rele==1 || korr_rele==3 || korr_rele==5 || korr_rele==7 || korr_rele==9 || korr_rele==11  || korr_rele==13 || korr_rele==15)){
    m0++;if(m0>59){m0=0;}}
  if(kn1>600 && (korr_rele==2 || korr_rele==4 || korr_rele==6 || korr_rele==8 || korr_rele==10 || korr_rele==12 || korr_rele==14 || korr_rele==16)){
    h0++;if(h0>23){h0=0;}}
  if(kn2>600 && (korr_rele==1 || korr_rele==3 || korr_rele==5 || korr_rele==7 || korr_rele==9 || korr_rele==11  || korr_rele==13 || korr_rele==15)){
    m0--;if(m0>60){m0=0;}}
    if(kn2>600 && (korr_rele==2 || korr_rele==4 || korr_rele==6 || korr_rele==8 || korr_rele==10 || korr_rele==12 || korr_rele==14 || korr_rele==16)){
    h0--;if(h0>24){h0=0;}}
  }
  // вывод информации на экран 1 строка
  lcd.setCursor(1,0); 
  if(h < 10){lcd.print("0");}
  lcd.print(h); // часы
  lcd.print(":");
  if(m < 10 ){lcd.print("0");}
  lcd.print(m); // минуты
  lcd.print(":");
  if(s < 10){lcd.print("0");}
  lcd.print(s);// секунды
  if(korr_time==1 && korr==0){ lcd.print(" kor_T");}
  if(korr==1){lcd.print(" kor_m");}
  if(korr==2){lcd.print(" kor_h");}
  if(korr==0){lcd.print(" TIME");}
  
  // вывод информации на экран 2 строка
  lcd.setCursor(1,1); 
  if(korr_rele==1 || korr_rele==2){lcd.print("1-ON  ");}
  if(korr_rele==3 || korr_rele==4){lcd.print("1-OFF ");}
  if(korr_rele==5 || korr_rele==6){lcd.print("2-ON  ");}
  if(korr_rele==7 || korr_rele==8){lcd.print("2-OFF ");}
  if(korr_rele==9 || korr_rele==10){lcd.print("3-ON  ");}
  if(korr_rele==11 || korr_rele==12){lcd.print("3-OFF ");}
  if(korr_rele==13 || korr_rele==14){lcd.print("4-ON  ");}
  if(korr_rele==15 || korr_rele==16){lcd.print("4-OFF ");}
  
  if(korr_rele>0){ 
  if(h0 < 10){lcd.print("0");}
  lcd.print(h0); // часы
  lcd.print(":");
  if(m0 < 10 ){lcd.print("0");}
  lcd.print(m0); // минуты
  }
  
  if(korr_rele==1 || korr_rele==3 || korr_rele==5 || korr_rele==7 || korr_rele==9 || korr_rele==11 || korr_rele==13 || korr_rele==15){lcd.print(" k_m");}
  if(korr_rele==2 || korr_rele==4 || korr_rele==6 || korr_rele==8 || korr_rele==10 || korr_rele==12 || korr_rele==14 || korr_rele==16 ){lcd.print(" k_h");}
  if(korr_rele>=1 && korr_rele<=2){m_1_on= m0;h_1_on=h0;}
  if(korr_rele>=3 && korr_rele<=4){m_1_off= m0;h_1_off=h0;}
  if(korr_rele>=5 && korr_rele<=6){m_2_on= m0;h_2_on=h0;}
  if(korr_rele>=7 && korr_rele<=8){m_2_off= m0;h_2_off=h0;}
  if(korr_rele>=9 && korr_rele<=10){m_3_on= m0;h_3_on=h0;}
  if(korr_rele>=11 && korr_rele<=12){m_3_off= m0;h_3_off=h0;}
  if(korr_rele>=13 && korr_rele<=14){m_4_on= m0;h_4_on=h0;}
  if(korr_rele>=15 && korr_rele<=16){m_4_off= m0;h_4_off=h0;}
  // срабатывание реле по времени
  if((h*60+m)>=(h_1_on*60+m_1_on) && (h*60+m)<(h_1_off*60+m_1_off)){digitalWrite(6,HIGH);}
  if((h*60+m)>=(h_1_off*60+m_1_off)){digitalWrite(6,LOW);}
  if((h*60+m)>=(h_2_on*60+m_2_on) && (h*60+m)<(h_2_off*60+m_2_off)){digitalWrite(5,HIGH);}
  if((h*60+m)>=(h_2_off*60+m_2_off)){digitalWrite(5,LOW);}
  if((h*60+m)>=(h_3_on*60+m_3_on) && (h*60+m)<(h_3_off*60+m_3_off)){digitalWrite(4,HIGH);}
  if((h*60+m)>=(h_3_off*60+m_3_off)){digitalWrite(4,LOW);}
  if((h*60+m)>=(h_4_on*60+m_4_on) && (h*60+m)<(h_4_off*60+m_4_off)){digitalWrite(3,HIGH);}
  if((h*60+m)>=(h_4_off*60+m_1_off)){digitalWrite(3,LOW);}
  // опрос сотояния выходов
  if(digitalRead(6)==HIGH){lcd.print("1  ");}else{lcd.print("0  ");}
  if(digitalRead(5)==HIGH){lcd.print(" 1  ");}else{lcd.print(" 0  ");}
  if(digitalRead(4)==HIGH){lcd.print(" 1  ");}else{lcd.print(" 0  ");}
  if(digitalRead(3)==HIGH){lcd.print(" 1 ");}else{lcd.print(" 0 ");}
  delay(200);
  lcd.clear();
}
Библиотека MsTimer2.h - MsTimer2.zip

Вторая версия 4-х канального реле времени функционально аналогична первой, но в ней улучшена процедура коррекции времени часов и времени реле, а так же все настройки времени реле сохраняются в энергонезависимой памяти.

#include <LiquidCrystal.h>
#include <EEPROMex.h> // https://github.com/thijse/Arduino-EEPROMEx 
// #include <EEPROM.h> - для более позних  версий Arduino IDE
#include <MsTimer2.h> // https://github.com/PaulStoffregen/MsTimer2
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
unsigned long time0;
byte korr_time,korr,korr_rele,s,m,h,i,z,h0,m0,pause,value[16];
byte m_1_on,h_1_on,m_1_off,h_1_off;
byte m_2_on,h_2_on,m_2_off,h_2_off;
byte m_3_on,h_3_on,m_3_off,h_3_off;
byte m_4_on,h_4_on,m_4_off,h_4_off;
int kn,kn1,kn2;
void setup()
{ 
  lcd.begin(16, 2);// LCD 16X2
  MsTimer2::set(1000, to_Timer);// задаем период 1с
  MsTimer2::start();// старт таймера
  Serial.begin(9600);
  pinMode(A3,INPUT);// кнопка К
  pinMode(A4,INPUT);// кнопка +
  pinMode(A5,INPUT);// кнопка -
  for(int n=0;n<16;n++){
  value[n] = EEPROM.read(n);// ЧТЕНИЕ EEPROM - ЗНАЧЕНИЯ УСТАНОВОК ВРЕМЕНИ РЕЛЕ 
  if(value[n]==255){value[n]=0;}
}
m_1_on=value[0],h_1_on=value[1],m_1_off=value[2],h_1_off=value[3];
m_2_on=value[4],h_2_on=value[5],m_2_off=value[6],h_2_off=value[7];
m_3_on=value[8],h_3_on=value[9],m_3_off=value[10],h_3_off=value[11];
m_4_on=value[12],h_4_on=value[13],m_4_off=value[14],h_4_off=value[15];
}

void to_Timer(){ if(korr_time==0){s++;}else{s=0;} /// ОТСЧЕТ ВРЕМЕНИ ЧАСОВ ///////
  if(s > 59){s = 0;m++;} // отсчет 1 мин
  if(m > 59){m = 0;h++;} // отсчет 1 час
  if(h > 23){h = 0;}} 
void korr_Time(){  kn=analogRead(A3); kn1=analogRead(A4); kn2=analogRead(A5);
  // ВКЛЮЧЕНИЕ КОРРЕКЦИИ ВРЕМЕНИ = НАЖАТЬ ОДНОВРЕМЕННО КНОПКИ + И -
  if(kn1>600 && kn2>600){korr_time=1;korr=1;}
  if(kn>600 && korr_time==1 && korr<=2){korr++;if(korr>=3){korr=0;korr_time=0;pause=s+1;if(s<pause){kn=0;}}}
  /// КОРРЕКЦИЯ ВРЕМЕНИ ЧАСОВ /////////
  if(kn1>600 && korr==1){m++;}
  if(kn1>600 && korr==2){h++;}
  if(kn2>600 && korr==1){m--;if(m>60){m=0;}}
  if(kn2>600 && korr==2){h--;}}

void loop(){
korr_Time();

/// УСТАНОВКА ВРЕМЕНИ СРАБАТЫВАНИЯ РЕЛЕ ////////////////////////////
  if(korr_time==0){ 
  if(kn>600){korr_rele++;if(korr_rele>=17){korr_rele=0;}}
  if(korr_rele>=1 && korr_rele<=2){m0=m_1_on;h0=h_1_on;}
  if(korr_rele>=3 && korr_rele<=4){m0=m_1_off;h0=h_1_off;}
  if(korr_rele>=5 && korr_rele<=6){m0=m_2_on;h0=h_2_on;}
  if(korr_rele>=7 && korr_rele<=8){m0=m_2_off;h0=h_2_off;}
  if(korr_rele>=9 && korr_rele<=10){m0=m_3_on;h0=h_3_on;}
  if(korr_rele>=11 && korr_rele<=12){m0=m_3_off;h0=h_3_off;}
  if(korr_rele>=13 && korr_rele<=14){m0=m_4_on;h0=h_4_on;}
  if(korr_rele>=15 && korr_rele<=16){m0=m_4_off;h0=h_4_off;}
/// КОРРЕКЦИЯ ВРЕМЕНИ РЕЛЕ /////////
  if(kn1>600 && (korr_rele==1 || korr_rele==3 || korr_rele==5 || korr_rele==7 || korr_rele==9 || korr_rele==11  || korr_rele==13 || korr_rele==15)){
    m0++;if(m0>59){m0=0;}}
  if(kn1>600 && (korr_rele==2 || korr_rele==4 || korr_rele==6 || korr_rele==8 || korr_rele==10 || korr_rele==12 || korr_rele==14 || korr_rele==16)){
    h0++;if(h0>23){h0=0;}}
  if(kn2>600 && (korr_rele==1 || korr_rele==3 || korr_rele==5 || korr_rele==7 || korr_rele==9 || korr_rele==11  || korr_rele==13 || korr_rele==15)){
    m0--;if(m0>60){m0=0;}}
    if(kn2>600 && (korr_rele==2 || korr_rele==4 || korr_rele==6 || korr_rele==8 || korr_rele==10 || korr_rele==12 || korr_rele==14 || korr_rele==16)){
    h0--;if(h0>24){h0=0;}}
  }

  // вывод информации на экран 1 строка
  lcd.setCursor(1,0);
  if(korr==2 && i==1){lcd.print("  ");}else{ 
  if(h < 10){lcd.print("0");}
  lcd.print(h);} // часы
  lcd.print(":");
  if(korr==1 && i==1){lcd.print("  ");}else{
  if(m < 10 ){lcd.print("0");}
  lcd.print(m);} // минуты
  lcd.print(":");
  if(s < 10){lcd.print("0");}
  lcd.print(s);// секунды
  if(korr==0){lcd.print(" TIME");}
  
   // вывод информации на экран 2 строка
  lcd.setCursor(1,1); 
  if(korr_rele>=1 && korr_rele<=4){lcd.print("1 ");}
  if(korr_rele>=5 && korr_rele<=8){lcd.print("2 ");}
  if(korr_rele>=9 && korr_rele<=12){lcd.print("3 ");}
  if(korr_rele>=13 && korr_rele<=16){lcd.print("4 ");}
  if(korr_rele==0) {  // опрос сотояния выходов
  if(digitalRead(6)==HIGH){lcd.print("1  ");}else{lcd.print("0  ");}
  if(digitalRead(5)==HIGH){lcd.print(" 1  ");}else{lcd.print(" 0  ");}
  if(digitalRead(4)==HIGH){lcd.print(" 1  ");}else{lcd.print(" 0  ");}
  if(digitalRead(3)==HIGH){lcd.print(" 1 ");}else{lcd.print(" 0 ");}}
  
  if(korr_rele>0){ z=0;
  if((korr_rele==2 || korr_rele==4 || korr_rele==6 || korr_rele==8 || korr_rele==10 || korr_rele==12 || korr_rele==14 || korr_rele==16) && i==1){lcd.print("  ");}else{ 
  if(h0 < 10){lcd.print("0");}
  lcd.print(h0);} // часы
  lcd.print(":");
  if((korr_rele==1 || korr_rele==3 || korr_rele==5 || korr_rele==7 || korr_rele==9 || korr_rele==11 || korr_rele==13 || korr_rele==15) && i==1){lcd.print("  ");}else{ 
  if(m0 < 10 ){lcd.print("0");}
  lcd.print(m0);} // минуты
  }
  
  if(korr_rele==1 || korr_rele==2 || korr_rele==5 || korr_rele==6 || korr_rele==9 || korr_rele==10 || korr_rele==13 || korr_rele==14){lcd.print(" ON     ");}
  if(korr_rele==3 || korr_rele==4 || korr_rele==7 || korr_rele==8 || korr_rele==11 || korr_rele==12 || korr_rele==15 || korr_rele==16 ){lcd.print(" OFF   ");}
  if(korr_rele>=1 && korr_rele<=2){m_1_on= m0;h_1_on=h0;}
  if(korr_rele>=3 && korr_rele<=4){m_1_off= m0;h_1_off=h0;}
  if(korr_rele>=5 && korr_rele<=6){m_2_on= m0;h_2_on=h0;}
  if(korr_rele>=7 && korr_rele<=8){m_2_off= m0;h_2_off=h0;}
  if(korr_rele>=9 && korr_rele<=10){m_3_on= m0;h_3_on=h0;}
  if(korr_rele>=11 && korr_rele<=12){m_3_off= m0;h_3_off=h0;}
  if(korr_rele>=13 && korr_rele<=14){m_4_on= m0;h_4_on=h0;}
  if(korr_rele>=15 && korr_rele<=16){m_4_off= m0;h_4_off=h0;}
  
  if(korr_rele==0 && z==0){z=1; // запись в EEPROM КАЖДЫЙ РАЗ ПРИ ВЫХОДЕ ИЗ РЕЖИМА РЕДАКТИРОВАНИЯ ВРЕМЕНИ РЕЛЕ
  // ДЛЯ ЗАПИСИ ИСПОЛЬЗУЕТСЯ update вместо write ДЛЯ ЭКОНОМИИ РЕСУРСА ЗАПИСИ EEPROM
EEPROM.update(0,m_1_on);EEPROM.update(1,h_1_on);EEPROM.update(2,m_1_off);EEPROM.update(3,h_1_off);
EEPROM.update(4,m_2_on);EEPROM.update(5,h_2_on);EEPROM.update(6,m_2_off);EEPROM.update(7,h_2_off);
EEPROM.update(8,m_3_on);EEPROM.update(9,h_3_on);EEPROM.update(10,m_3_off);EEPROM.update(11,h_3_off);
EEPROM.update(12,m_4_on);EEPROM.update(13,h_4_on);EEPROM.update(14,m_4_off);EEPROM.update(15,h_4_off);
}
  
  // срабатывание реле по времени
  if((h*60+m)>=(h_1_on*60+m_1_on) && (h*60+m)<(h_1_off*60+m_1_off)){digitalWrite(6,HIGH);}
  if((h*60+m)>=(h_1_off*60+m_1_off)){digitalWrite(6,LOW);}
  if((h*60+m)>=(h_2_on*60+m_2_on) && (h*60+m)<(h_2_off*60+m_2_off)){digitalWrite(5,HIGH);}
  if((h*60+m)>=(h_2_off*60+m_2_off)){digitalWrite(5,LOW);}
  if((h*60+m)>=(h_3_on*60+m_3_on) && (h*60+m)<(h_3_off*60+m_3_off)){digitalWrite(4,HIGH);}
  if((h*60+m)>=(h_3_off*60+m_3_off)){digitalWrite(4,LOW);}
  if((h*60+m)>=(h_4_on*60+m_4_on) && (h*60+m)<(h_4_off*60+m_4_off)){digitalWrite(3,HIGH);}
  if((h*60+m)>=(h_4_off*60+m_1_off)){digitalWrite(3,LOW);}

  i++;if(i==3){i=0;}
  delay(200);
  
  lcd.clear();
}

Добавить комментарий

Случайные статьи

  • Сторожевое устройство

    Для защиты дачного участка от непрошенных гостей, для ограждения опасных объектов можно использовать сторожевое устройство. Схема такого устройства (первый вариант) показана на рис. Объект, нуждающийся в охране, окружают по периметру медным обмоточным проводом диаметром 0,1… 0,3 мм. Этот охранный шлейф может быть прикреплен к забору или к вбитым в землю …Подробнее...
  • Регулируемый источник питания с защитой по току

    На рис.1 изображена схема стабилизатора, от которой можно питать не только автомобильный магнитофон, но и любую радиолюбительскую конструкцию с напряжением от 1 до 35 В и которой не страшны большие токи нагрузки, поскольку введена токовая защита. Регулятор напряжения собран на микросхеме DA1, которая дополнена мощным транзистором, который может отдать в …Подробнее...
  • Импульсные регуляторы напряжения MC34063A, MC33063A, NCV33063A

    Импульсные регуляторы напряжения MC34063A, MC33063A, NCV33063A

    Импульсные регуляторы напряжения MC34063A, MC33063A, NCV33063A — специально разработанные микросхемы для DC-DC преобразователей с минимальным количеством внешних элементов. Технические параметры Диапазон входных напряжений 3…40 В Диапазон выходных напряжений 1.25…40 В Максимальный выходной ток 1.5 А Рабочая частота 33 кГц На рисунках показаны типовые схемы подключения регуляторов напряжения, повышающий, понижающий и инверсный. Основные элементы …Подробнее...
  • Переключатель гирлянд с плавным изменением яркости

    Предложенный переключатель гирлянд собран на 2-х микросхемах. На DD1 выполнен симметричный мультивибратор, частоту которого можно регулировать в пределах от 195 до 205 Гц переменным резистором R2. Через инверторы DD1.3 DD1.4 прямоугольные импульсы мультивибратора поступают на триггеры DD2.1-DD2.2 которые выполняют роль делителей частоты. Выходные сигналы триггеров поступают на усилители тока VT1-VT4 …Подробнее...
  • Импульсный стабилизатор напряжения 5 В с высоким КПД

    В этом стабилизаторе используется специализированная ИМС LM2575-5,0. Его выходное напряжение составляет 5 В и задано типом примененной ИМС. Входное напряжение стабилизатора может составлять от 7 до 40 В. Выходной сигнал ИМС на выв. 2 представляет собой серию широтно-модулированных импульсов. После фильтрации цепью L1С2 это напряжение поступает на нагрузку и на …Подробнее...