Для простых и компактных проектов разработанных в среде Ardino IDE, таких как например простое реле времени, логичней применять простые и недорогие микроконтроллеры. Так как Arduino IDE поддерживает микроконтроллеры серии ATtiny, мной для этого проекта был выбран микроконтроллер ATtiny13.
ATtiny13 — низкопотребляющий 8 битный КМОП микроконтроллер с AVR RISC архитектурой. Выполняя команды за один цикл, ATtiny13 достигает производительности 1 MIPS при частоте задающего генератора 1 МГц, что позволяет разработчику оптимизировать отношение потребления к производительности.
Микроконтроллер ATtiny13 отлично подходит для маленьких и дешевых проектов, а поддержка средой программирования Arduino IDE заметно упрощает работу с микроконтроллером.
Реле времени помимо микроконтроллера содержит индикатор TM1637 (часовой), модуль реле и две тактовые кнопки.
Управление реле времени осуществляется двумя кнопками:
- SET — кнопка выбора фиксированного значение времени таймера.
- START / STOP — кнопка запуска / сбора таймера на начальное значение.
При нажатии кнопки SET осуществляется перебор фиксированных значений таймера, значения таймера (в минутах) казаны в скетче:
byte set_time[]={1,3,5,7,10,15,20,25,30,45,60};
Вы может установить свои значения которые должны находится в диапазоне от 1 до 99 минут.
После выбора времени таймера, необходимо нажать кнопку START / STOP для активации таймера и реле управления нагрузкой, при завершении отсчета, отключается нагрузка, время таймера снова устанавливается на исходное значение. Во время работы таймера, можно его отключить (перезапустить), для этого нужно нажать кнопку START / STOP.
Выбранное фиксированное время таймера сохраняется в энергонезависимой памяти.
Для поддержки ATtiny13 в Arduino IDE необходимо выполнить несколько простых операций:
- Добавление поддержки платы
Откройте в Arduino IDE вкладку Файл > Настройки и добавьте ссылку для менеджера плат
https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json
Далее перейдите во вкладку Инструменты > Плата > Менеджер плат
Выберите и установите новую плату MicroCore by MCUdude.
Далее в Инструменты > Плата выберите плату ATtiny13.
- Для прошивки скетча Вам понадобится программатор USBAsp
В моем случае я использую микроконтроллер который установлен на плату переходник, схема подключения достаточно простая:
Распиновка программатора USBAsp
В настройках платы нужно выбрать поддержку Attiny13 и установить частоту 9.6 MHz internal, в пункте EEPROM выберите EEPROM not retanied, в пункте ‘Расчет времени’ выберите Micros disabled .
Далее необходимо выставить нужные фьюзы для микроконтроллера, чтобы он всегда работал на выбранной Вами частоте. Для этого в настройках Arduino IDE выберите программатор USBasb и нажмите Инструменты > Записать загрузчик. Эту операцию необходимо проводить всего один и снова повторить если Вы будете менять частоту работы микроконтроллера.
Для загрузки скетча в настройках Arduino IDE выберите программатор USBasb и во вкладке Скетч нажмите на Загрузить через программатор (или просто нажать кнопку — Загрузить).
#define CLK PB1 // TM1637 #define DIO PB0 // TM1637 #define SET PB3 // BUTTON SET #define START PB4 // BUTTON START/STOP #define OUT PB2 // RELAY char i=1,tic,n; bool w,w1=0; unsigned long times; byte set_time[]={1,3,5,7,10,15,20,25,30,45,60}; void setup(){ DDRB |= (1 << OUT); PORTB &= ~(1 << OUT); PORTB |= (1 << SET) | (1 << START); n = EEPROM_read(0); i=set_time[n]; } void loop(){ if(((PINB >> SET) & 1) == 0){n++;if(n>10){n=0;}i=set_time[n];EEPROM_write(0,n);delay(200);} if(((PINB >> START) & 1) == 0 && w==0){w=1;delay(200);} if(((PINB >> START) & 1) == 0 && w==1){w=0;i=set_time[n];tic=0;delay(200);} if(w==1 && (i>0 || (i==0 && tic>0))){PORTB |= (1 << OUT);w1=1;} else{PORTB &= ~(1 << OUT);w=0;w1=0;i=set_time[n];} if(w==1){ if(millis()-times>999){times=millis();tic--;} if(tic<0){tic=59;i--;} } tm_print(i*100+tic,w1,5); }// end loop unsigned char EEPROM_read(unsigned int uiAddress){ while(EECR & (1<<EEPE)); // проверка готовности EEPROM EEAR = uiAddress; // регистр адреса EECR |= (1<<EERE);// чтение EEPROM return EEDR; // вывод значения } void EEPROM_write(unsigned int uiAddress, unsigned char ucData){ while(EECR & (1<<EEPE)); // проверка готовности EEPROM EEAR = uiAddress; // регистр адреса EEDR = ucData; // регистр данных EECR |= (1<<EEMPE);// Разрешение записи в EEPROM EECR |= (1<<EEPE); // Запись в EEPROM } void tm_dec(byte dig){ for(byte i = 0; i < 8; i++) { DDRB |= (1 << CLK);del(); if (dig & 0x01) DDRB &= ~(1 << DIO); else DDRB |= (1 << DIO);del(); DDRB &= ~(1 << CLK);del(); dig = dig >> 1; } DDRB |= (1 << CLK); DDRB &= ~(1 << DIO);del(); DDRB &= ~(1 << CLK);del(); if (((PINB >> DIO) & 1) == 0) DDRB |= (1 << DIO);del(); DDRB |= (1 << CLK);del(); } void tm_stop(){ DDRB |= (1 << DIO);del(); DDRB &= ~(1 << CLK);del(); DDRB &= ~(1 << DIO);del(); } void tm_start(){ DDRB |= (1 << DIO);del(); } void tm_print(int t, bool pd_t, byte br){ tm_start();tm_dec(0b10001000 + br); tm_dec(0x40);tm_stop();tm_start(); int data0 = t / 1000; int data1 = t / 100 % 10; int data2 = t / 10 % 10; int data3 = t % 10; for(byte n = 0; n < 4; n++){ int data; switch(n){ case 0: data = data0;break; case 1: data = data1;break; case 2: data = data2;break; case 3: data = data3;break; } switch(data){ // XGFEDCBA case 0: data = 0b00111111;break; // 0 case 1: data = 0b00000110;break; // 1 case 2: data = 0b01011011;break; // 2 case 3: data = 0b01001111;break; // 3 case 4: data = 0b01100110;break; // 4 case 5: data = 0b01101101;break; // 5 case 6: data = 0b01111101;break; // 6 case 7: data = 0b00000111;break; // 7 case 8: data = 0b01111111;break; // 8 case 9: data = 0b01101111;break; // 9 } if(n == 0){data0 = data;} if(n == 1){data1 = data;} if(n == 2){data2 = data;} if(n == 3){data3 = data;} } if(pd_t==1){data1 = data1+0b10000000;} tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop(); } void del(){delay(1);}
Скетч использует 994 байт (97%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 25 байт (39%) динамической памяти, оставляя 39 байт для локальных переменных. Максимум: 64 байт.
attiny13_timer_rele.ino_attiny13a_9600000L.hex (L = 0x7A, H = 0xFB, LB = 0x3B, 187.5kHz)
Работает но за 1 минуту убегает примерно на 5 секунд. А как поправить не знаю. буду признателен за помощь. Шил HEX программатором TL866
if(millis()-times>999){times=millis();tic—;}
Если убегают за 1 минуту на 5 сек, то эта строка будет такой:
if(millis()-times>1082){times=millis();tic—;}
Я Вас благодарю за такой быстрый ответ. Тогда подбирая значения я смогу подобрать более точный интервал.
Это в милисекундах? Не могу понять зависимость.
В мс, чем больше число, тем медленней счет
Понял. Благодарю тебя добрый человек!