На рисунке показана схема 8-и канального реле времени, в реле времени используется Arduino Nano, часы реального времени DS3231 (модуль), семисегментный четырех-разрядный индикатор на базе драйвера TM1637 (модуль TM1637) и четыре кнопки управления.
В каждом канале можно задать время включения и выключения реле, все значения времени включения и выключения реле сохраняются в энергонезависимой памяти.
Управление реле времени:
- Первая кнопка — «часы», она позволяет просматривать текущее время (по умолчанию), секунды, дату, месяц и год.
- Вторая кнопка — редактирование времени реле, при нажатии на кнопку поочередно появляются показания включения и выключения реле для каждого канала. Для выхода из режима редактирования можно поочередно пролистать все каналы или нажать на первую кнопку «часы».
При выходе из режима редактирования происходит сохранение в энергонезависимой памяти всех измененных значений времени реле.
- Третья кнопка «+HH» используется при редактировании времени реле для часов, четвертая «+MM» для минут. При нажатии на третью или четвертую кнопку показания меняются только в большую сторону, при достижении 23 часов или 59 минут показания обнуляются.
- При нажатии на кнопки три и четыре («+HH» «+MM») в режиме показания часов, можно изменить яркость свечения индикатора (0-7 уровней яркости).
Для управления нагрузкой можно использовать реле, подключение которого показано на рисунке или модуль реле которое можно подключать непосредственно к цифровым выходам Arduino.
#include <Wire.h> #include <EEPROM.h>//#include <EEPROMex.h> #include <TM1637Display.h> #include <DS3231.h> DS3231 clock;RTCDateTime DateTime; TM1637Display display(2, 3);// CLK,DIO int t,time,min,hour,write; int alarm1_on,alarm1_of,alarm2_on,alarm2_of,alarm3_on,alarm3_of,alarm4_on,alarm4_of,alarm5_on,alarm5_of,alarm6_on,alarm6_of,alarm7_on,alarm7_of,alarm8_on,alarm8_of; byte x,w,i,b,menu,alarm=16; uint8_t date_alarm1on[]{0x77,0x30,0x5c,0x54};uint8_t date_alarm2on[]{0x77,0x5b,0x5c,0x54};uint8_t date_alarm3on[]{0x77,0x4f,0x5c,0x54};uint8_t date_alarm4on[]{0x77,0x66,0x5c,0x54}; uint8_t date_alarm5on[]{0x77,0x6d,0x5c,0x54};uint8_t date_alarm6on[]{0x77,0x7d,0x5c,0x54};uint8_t date_alarm7on[]{0x77,0x07,0x5c,0x54};uint8_t date_alarm8on[]{0x77,0x7f,0x5c,0x54}; uint8_t date_alarm1of[]{0x77,0x30,0x5c,0x71};uint8_t date_alarm2of[]{0x77,0x5b,0x5c,0x71};uint8_t date_alarm3of[]{0x77,0x4f,0x5c,0x71};uint8_t date_alarm4of[]{0x77,0x66,0x5c,0x71}; uint8_t date_alarm5of[]{0x77,0x6d,0x5c,0x71};uint8_t date_alarm6of[]{0x77,0x7d,0x5c,0x71};uint8_t date_alarm7of[]{0x77,0x07,0x5c,0x71};uint8_t date_alarm8of[]{0x77,0x7f,0x5c,0x71}; uint8_t data[]{0x50,0x7b,0x58,0};// rec void setup(){ // clock.setDateTime(__DATE__, __TIME__);// установка времени DS3231, раскомментировать и залить скетч, далее закомментировать и залить скетч повторно Serial.begin(9600); Wire.begin(); clock.begin(); clock.setOutput(DS3231_1HZ); pinMode(4,INPUT);// SQW модуля часов реального времени подключить к D4 pinMode(A0,INPUT); pinMode(A1,INPUT); pinMode(A2,INPUT); pinMode(A3,INPUT);// кнопки управления А0 - часы, А1 - время реле, А2 - "часы +", А3 - "минуты +" pinMode(5,OUTPUT);pinMode(6,OUTPUT);pinMode(7,OUTPUT);pinMode(8,OUTPUT);pinMode(9,OUTPUT);pinMode(10,OUTPUT);pinMode(11,OUTPUT);pinMode(12,OUTPUT);// выходы реле alarm1_on=EEPROM.read(1)*100+EEPROM.read(2);alarm1_of=EEPROM.read(3)*100+EEPROM.read(4); alarm2_on=EEPROM.read(5)*100+EEPROM.read(6);alarm2_of=EEPROM.read(7)*100+EEPROM.read(8); alarm3_on=EEPROM.read(9)*100+EEPROM.read(10);alarm3_of=EEPROM.read(11)*100+EEPROM.read(12); alarm4_on=EEPROM.read(13)*100+EEPROM.read(14);alarm4_of=EEPROM.read(15)*100+EEPROM.read(16); alarm5_on=EEPROM.read(17)*100+EEPROM.read(18);alarm5_of=EEPROM.read(19)*100+EEPROM.read(20); alarm6_on=EEPROM.read(21)*100+EEPROM.read(22);alarm6_of=EEPROM.read(23)*100+EEPROM.read(24); alarm7_on=EEPROM.read(25)*100+EEPROM.read(26);alarm7_of=EEPROM.read(27)*100+EEPROM.read(28); alarm8_on=EEPROM.read(29)*100+EEPROM.read(30);alarm8_of=EEPROM.read(31)*100+EEPROM.read(32); } void loop(){Serial.println(write); display.setBrightness(b); DateTime=clock.getDateTime();t=DateTime.hour*100+DateTime.minute; if(analogRead(A0)>600&&alarm==16){menu++;delay(200);if(menu>3){menu=0;}} // кнопка часов if(analogRead(A1)>600){alarm++;w=1;delay(200);if(alarm>16){alarm=0;}} // кнопка времени реле switch(alarm){ // установка времение 1-8 реле case 0: x=0x40; if(w==1){hour=alarm1_on/100;min=alarm1_on-hour*100;time=alarm1_on;display.setSegments(date_alarm1on);delay(2000);} w=0;alarm1_on=time; break; case 1: x=0x40; if(w==1){hour=alarm1_of/100;min=alarm1_of-hour*100;time=alarm1_of;display.setSegments(date_alarm1of);delay(2000);} w=0;alarm1_of=time; break; case 2: x=0x40; if(w==1){hour=alarm2_on/100;min=alarm2_on-hour*100;time=alarm2_on;display.setSegments(date_alarm2on);delay(2000);} w=0;alarm2_on=time; break; case 3: x=0x40; if(w==1){hour=alarm2_of/100;min=alarm2_of-hour*100;time=alarm2_of;display.setSegments(date_alarm2of);delay(2000);} w=0;alarm2_of=time; break; case 4: x=0x40; if(w==1){hour=alarm3_on/100;min=alarm3_on-hour*100;time=alarm3_on;display.setSegments(date_alarm3on);delay(2000);} w=0;alarm3_on=time; break; case 5: x=0x40; if(w==1){hour=alarm3_of/100;min=alarm3_of-hour*100;time=alarm3_of;display.setSegments(date_alarm3of);delay(2000);} w=0;alarm3_of=time; break; case 6: x=0x40; if(w==1){hour=alarm4_on/100;min=alarm4_on-hour*100;time=alarm4_on;display.setSegments(date_alarm4on);delay(2000);} w=0;alarm4_on=time; break; case 7: x=0x40; if(w==1){hour=alarm4_of/100;min=alarm4_of-hour*100;time=alarm4_of;display.setSegments(date_alarm4of);delay(2000);} w=0;alarm4_of=time; break; case 8: x=0x40; if(w==1){hour=alarm5_on/100;min=alarm5_on-hour*100;time=alarm5_on;display.setSegments(date_alarm5on);delay(2000);} w=0;alarm5_on=time; break; case 9: x=0x40; if(w==1){hour=alarm5_of/100;min=alarm5_of-hour*100;time=alarm5_of;display.setSegments(date_alarm5of);delay(2000);} w=0;alarm5_of=time; break; case 10: x=0x40; if(w==1){hour=alarm6_on/100;min=alarm6_on-hour*100;time=alarm6_on;display.setSegments(date_alarm6on);delay(2000);} w=0;alarm6_on=time; break; case 11: x=0x40; if(w==1){hour=alarm6_of/100;min=alarm6_of-hour*100;time=alarm6_of;display.setSegments(date_alarm6of);delay(2000);} w=0;alarm6_of=time; break; case 12: x=0x40; if(w==1){hour=alarm7_on/100;min=alarm7_on-hour*100;time=alarm7_on;display.setSegments(date_alarm7on);delay(2000);} w=0;alarm7_on=time; break; case 13: x=0x40; if(w==1){hour=alarm7_of/100;min=alarm7_of-hour*100;time=alarm7_of;display.setSegments(date_alarm7of);delay(2000);} w=0;alarm7_of=time; break; case 14: x=0x40; if(w==1){hour=alarm8_on/100;min=alarm8_on-hour*100;time=alarm8_on;display.setSegments(date_alarm8on);delay(2000);} w=0;alarm8_on=time; break; case 15: x=0x40; if(w==1){hour=alarm8_of/100;min=alarm8_of-hour*100;time=alarm8_of;display.setSegments(date_alarm8of);delay(2000);} w=0;alarm8_of=time; break; case 16: write++; switch(menu){ // часы case 0: if(digitalRead(4)==HIGH){x=0x40;}else{x=0x00;} // мигание двоеточия time=t; break; // время case 1: x=0x00;time=DateTime.second;break; // секунды case 2: x=0x40;time=DateTime.day*100+DateTime.month; break; // число и месяц case 3: x=0x00;time=DateTime.year; break; } break;} // год if(analogRead(A2)>600&&alarm<16){hour++;delay(300);if(hour>23){hour=0;}time=hour*100+min;}// редактирование часов реле времени if(analogRead(A3)>600&&alarm<16){min++;delay(200);if(min>59){min=0;}time=hour*100+min;} // редактирование минут реле времени if(analogRead(A2)>600&&alarm==16){b++;delay(300);}if(analogRead(A3)>600&&alarm==16){b--;delay(300);}if(b>7){b=0;} // яркость TM1637 0-7 if(analogRead(A0)>600&&alarm<16){alarm=16;menu=0;w=1;write++;delay(200);} // возврат из времени реле в часы if(alarm<16||menu==0){i=true;}else{i=false;} if(alarm<16){write=0;} if(write>10000){write=2;} if(write==1){// запись в EEPROM значений времени реле при выходе из режима редактирования EEPROM.update(1, alarm1_on/100);EEPROM.update(2, alarm1_on-alarm1_on/100*100); EEPROM.update(3, alarm1_of/100);EEPROM.update(4, alarm1_of-alarm1_of/100*100); EEPROM.update(5, alarm2_on/100);EEPROM.update(6, alarm2_on-alarm2_on/100*100); EEPROM.update(7, alarm2_of/100);EEPROM.update(8, alarm2_of-alarm2_of/100*100); EEPROM.update(9, alarm3_on/100);EEPROM.update(10, alarm3_on-alarm3_on/100*100); EEPROM.update(11, alarm3_of/100);EEPROM.update(12, alarm3_of-alarm3_of/100*100); EEPROM.update(13, alarm4_on/100);EEPROM.update(14, alarm4_on-alarm4_on/100*100); EEPROM.update(15, alarm4_of/100);EEPROM.update(16, alarm4_of-alarm4_of/100*100); EEPROM.update(17, alarm5_on/100);EEPROM.update(18, alarm5_on-alarm5_on/100*100); EEPROM.update(19, alarm5_of/100);EEPROM.update(20, alarm5_of-alarm5_of/100*100); EEPROM.update(21, alarm6_on/100);EEPROM.update(22, alarm6_on-alarm6_on/100*100); EEPROM.update(23, alarm6_of/100);EEPROM.update(24, alarm6_of-alarm6_of/100*100); EEPROM.update(25, alarm7_on/100);EEPROM.update(26, alarm7_on-alarm7_on/100*100); EEPROM.update(27, alarm7_of/100);EEPROM.update(28, alarm7_of-alarm7_of/100*100); EEPROM.update(29, alarm8_on/100);EEPROM.update(30, alarm8_on-alarm8_on/100*100); EEPROM.update(32, alarm8_of/100);EEPROM.update(32, alarm8_of-alarm8_of/100*100); display.setSegments(data);delay(1000);// rec - запись } // активация 1-8 реле по времени if(t>=alarm1_on&&t<alarm1_of){digitalWrite(5,HIGH);}else{digitalWrite(5,LOW);} if(t>=alarm2_on&&t<alarm2_of){digitalWrite(6,HIGH);}else{digitalWrite(6,LOW);} if(t>=alarm3_on&&t<alarm3_of){digitalWrite(7,HIGH);}else{digitalWrite(7,LOW);} if(t>=alarm4_on&&t<alarm4_of){digitalWrite(8,HIGH);}else{digitalWrite(8,LOW);} if(t>=alarm5_on&&t<alarm5_of){digitalWrite(9,HIGH);}else{digitalWrite(9,LOW);} if(t>=alarm6_on&&t<alarm6_of){digitalWrite(10,HIGH);}else{digitalWrite(10,LOW);} if(t>=alarm7_on&&t<alarm7_of){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);} if(t>=alarm8_on&&t<alarm8_of){digitalWrite(12,HIGH);}else{digitalWrite(12,LOW);} display.showNumberDecEx(time,x,i); // вывод информации на индикатор TM1637 }
Дополнительные материалы
- Скетч — 8rele.ino
- Для управления радио-модулями используются выводы D9, D10, D11, D12. Также можно изменять длительность управляющего импульса.
Ничего не менял в ардуинке, решил залить скетч вылезла новая ошибка
«Arduino: 1.8.13 (Windows Store 1.8.42.0) (Windows 10), Плата:»Arduino Uno»
_8rele:1:1: error: stray ‘\357’ in program
_8rele:1:2: error: stray ‘\273’ in program
_8rele:1:3: error: stray ‘\277’ in program
_8rele:1:4: error: stray ‘#’ in program
_8rele:1:5: error: ‘include’ does not name a type
In file included from C:\Users\Артём\Desktop\_8rele\_8rele.ino:2:0:
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:97:5: error: ‘EERef’ does not name a type; did you mean ‘EERE’?
EERef operator*() { return index; }
^~~~~
EERE
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:119:5: error: ‘EERef’ does not name a type; did you mean ‘EERE’?
EERef operator[]( const int idx ) { return idx; }
^~~~~
EERE
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h: In member function ‘uint8_t EEPROMClass::read(int)’:
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:120:51: error: ‘EERef’ was not declared in this scope
uint8_t read( int idx ) { return EERef( idx ); }
^~~~~
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:120:51: note: suggested alternative: ‘EERE’
uint8_t read( int idx ) { return EERef( idx ); }
^~~~~
EERE
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h: In member function ‘void EEPROMClass::write(int, uint8_t)’:
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:121:45: error: ‘EERef’ was not declared in this scope
void write( int idx, uint8_t val ) { (EERef( idx )) = val; }
^~~~~
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:121:45: note: suggested alternative: ‘EERE’
void write( int idx, uint8_t val ) { (EERef( idx )) = val; }
^~~~~
EERE
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h: In member function ‘void EEPROMClass::update(int, uint8_t)’:
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:122:44: error: ‘EERef’ was not declared in this scope
void update( int idx, uint8_t val ) { EERef( idx ).update( val ); }
^~~~~
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:122:44: note: suggested alternative: ‘EERE’
void update( int idx, uint8_t val ) { EERef( idx ).update( val ); }
^~~~~
EERE
In file included from C:\Users\Артём\Desktop\_8rele\_8rele.ino:2:0:
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h: In member function ‘T& EEPROMClass::get(int, T&)’:
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:133:71: error: no match for ‘operator*’ (operand type is ‘EEPtr’)
for( int count = sizeof(T) ; count ; —count, ++e ) *ptr++ = *e;
^~
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h: In member function ‘const T& EEPROMClass::put(int, const T&)’:
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:140:63: error: no match for ‘operator*’ (operand type is ‘EEPtr’)
for( int count = sizeof(T) ; count ; —count, ++e ) (*e).update( *ptr++ );
^~
C:\Users\Артём\Desktop\_8rele\_8rele.ino: In function ‘void setup()’:
_8rele:40:3: error: ‘Wire’ was not declared in this scope
C:\Users\Артём\Desktop\_8rele\_8rele.ino:40:3: note: suggested alternative: ‘time’
C:\Users\Артём\Desktop\_8rele\_8rele.ino: In function ‘void loop()’:
_8rele:269:40: error: ‘pin5’ was not declared in this scope
C:\Users\Артём\Desktop\_8rele\_8rele.ino:269:40: note: suggested alternative: ‘pin9’
_8rele:269:58: error: ‘pin5’ was not declared in this scope
C:\Users\Артём\Desktop\_8rele\_8rele.ino:269:58: note: suggested alternative: ‘pin9’
C:\Users\Артём\Desktop\_8rele\_8rele.ino: In function ‘void timerInterrupt()’:
_8rele:305:8: error: ‘pin5’ was not declared in this scope
C:\Users\Артём\Desktop\_8rele\_8rele.ino:305:8: note: suggested alternative: ‘pin9’
_8rele:305:16: error: ‘prevPin5’ was not declared in this scope
C:\Users\Артём\Desktop\_8rele\_8rele.ino:305:16: note: suggested alternative: ‘prevPin9’
_8rele:307:5: error: ‘counterPin5’ was not declared in this scope
C:\Users\Артём\Desktop\_8rele\_8rele.ino:307:5: note: suggested alternative: ‘counterPin9’
_8rele:310:3: error: ‘counterPin5’ was not declared in this scope
C:\Users\Артём\Desktop\_8rele\_8rele.ino:310:3: note: suggested alternative: ‘counterPin9’
exit status 1
stray ‘\357’ in program
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»
«
разобрался, скетч скопировался с ошибкой, подскажите пожалуйста в каком виде дату и время прописать?
записал все через запятую «19, 01, 2021, 13, 32, 00»
подскажите значения на экране должны постоянно меняться?
// clock.setDateTime(__DATE__, __TIME__);// установка времени DS3231, раскомментировать и залить скетч, далее закомментировать и залить скетч повторно
так все же кто подскажет как выставить время. Спасибо.