Простое реле времени на ATtiny13 (Arduino)

Для простых и компактных проектов разработанных в среде Ardino IDE, таких как например простое реле времени, логичней применять простые и недорогие микроконтроллеры. Так как Arduino IDE поддерживает микроконтроллеры серии ATtiny, мной для этого проекта был выбран микроконтроллер ATtiny13.

ATtiny13 — низкопотребляющий 8 битный КМОП микроконтроллер с AVR RISC архитектурой. Выполняя команды за один цикл, ATtiny13 достигает производительности 1 MIPS при частоте задающего генератора 1 МГц, что позволяет разработчику оптимизировать отношение потребления к производительности.

Микроконтроллер ATtiny13 отлично подходит для маленьких и дешевых проектов, а поддержка средой программирования Arduino IDE заметно упрощает работу с микроконтроллером.

Реле времени помимо микроконтроллера содержит индикатор TM1637 (часовой), модуль реле и две тактовые кнопки.

Кнопками (+/-) можно задавать время от 1 до 99 минут, при установки времени таймера сразу же активируется реле, при обнулении таймера реле отключает нагрузку.

Для поддержки 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 UP   PB3 // BUTTON +++
#define DOWN PB4 // BUTTON ---
#define OUT  PB2 // RELAY
 
char i,tic;
bool w,w1=0,cl;
unsigned long times;
 
void setup(){
  DDRB |= (1 << OUT);
  PORTB &= ~(1 << OUT);
  PORTB |= (1 << UP) | (1 << DOWN);
}
 
void loop(){
   cl=0;
   if(((PINB >> UP) & 1) == 0){i++;if(i>99){i=99;}cl=1;}
   if(((PINB >> DOWN) & 1) == 0){i--;if(i<0){i=0;tic=0;}cl=1;}
 
   if(i>0 || (i==0 && tic>0)){PORTB |= (1 << OUT);w=1;w1=1;}
    else{PORTB &= ~(1 << OUT);w=0;w1=0;}
 
   if(w==1&&cl==0){
    if(millis()-times>999){times=millis();tic--;}
     if(tic<0){tic=59;i--;}
    }  
   tm_print(i*100+tic,w1,5);      
}// end loop
 
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);}

Скетч использует 830 байт (81%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 14 байт (21%) динамической памяти, оставляя 50 байт для локальных переменных. Максимум: 64 байт.

attiny13_rele.ino_attiny13a_9600000L.hex (L = 0x7A, H = 0xFB, LB = 0x3B, 187.5kHz)

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

Войти с помощью: