Arduino IDE поддерживает множество различных микроконтроллеров, в том числе ATmega8. Микроконтроллер ATmega8 выполнен по технологии CMOS, 8-разрядный, основан на AVR архитектуре RISC. За один такт выполняется одна инструкция, на микроконтроллера ATmega8 достигается производительность в 1MIPS на МГц, и тем самым достигается наиболее оптимальная производительность и потребляемая энергия.
Как программировать или прошить микроконтроллер Atmega8 в среде Arduino IDE можно узнать из — http://rcl-radio.ru/?p=82486
Часы на ATmega8 в своем составе имеют индикатор TM1637(модуль), часы реального времени DS3231(модуль) и две кнопки для корректировки времени.
В микроконтроллере ATmega8 имеется внутренний RC генератор работающий на частоте от 1 до 8 МГц, если Вам не нужна большая точность важна частота некоторых временных функций (например delay), то во внешний кварцевый резонатор можно не подключать. В моем случае в наличии был кварц на 4 МГц который я установил для использования в других проектах, в часах внешний кварцевый резонатор можно не использовать.
Так же учитывайте что ATmega8 имеет диапазон питающего напряжения от 4.5 до 5.5 В и тактовую до 16 МГц, а ATmega8L имеет диапазон питающего напряжения от 2.7 до 5.5 В и тактовую частоту до 8 МГц.
Настройка частоты тактирования в Arduino IDE
External — внешний кварцевый резонатор
Internal — внутренний RC генератор
#include <DS3231.h> #include <Wire.h> #include <STM32_TM1637.h> DS3231 clock; RTCDateTime DateTime; STM32_TM1637 tm(PD2,PD3);// CLK, DIO int timer; byte hour,minut; bool w; // PD0, PD1(2, 3) = RXD TXD // PC3(26) = SQW DS3231 // PC2(25) = HOUR+ // PC1(24) = MINUTE+ // PC4(27) = SDA // PC5(28) = SCL // PD2, PD3(4, 5) = CLK DIO TM1637 void setup(){ Wire.begin(); clock.begin(); tm.brig(7); clock.setOutput(DS3231_1HZ); PORTC |= (1 << 2)|(1 << 1); // INPUT_PULLUP PC1 PC2 } void loop(){ DateTime = clock.getDateTime(); hour = DateTime.hour; minut = DateTime.minute; timer = hour*100 + minut; tm.print_time(timer, ((PINC >> 3) & 1)); if(((PINC >> 2) & 1) == LOW){ /////// BUTTON PC2 w=1; hour++; if(hour>23){hour=0;} delay(300);} if(((PINC >> 1) & 1) == LOW){ /////// BUTTON PC1 w=1; minut++; if(minut>59){minut=0;} delay(300);} ////////// SET CLOCK if(w == 1){w=0; clock.setDateTime(2020, 8, 20, hour, minut, 0);} delay(100); }
Так же можно дополнить часы простым будильником. Управление часами состоит из трех кнопок, кнопка SET позволяет менять режимы:
- Основной режим (секундное двоеточие мигает в такт секундам) — кнопка + и — отключают или включают будильник, при этом загорается и гаснет светодиод — индикатор включения будильника
- Второй режим (секундное двоеточие горит постоянно) — режим корректировки времени (кнопки + и — корректируют часы и минуты)
- Третий режим (секундное двоеточие не горит) — режим корректировки времени будильника (кнопки + и — корректируют часы и минуты)
#include <EEPROM.h> #include <DS3231.h> #include <Wire.h> #include <STM32_TM1637.h> DS3231 clock; RTCDateTime DateTime; STM32_TM1637 tm(PD2,PD3);// CLK, DIO int timer; byte hour,minut,hh,mm,sett; bool w,ww,alarm; // PD0, PD1(2, 3) = RXD TXD // PC3(26) = SQW DS3231 // PC2(25) = HOUR+ // PC1(24) = MINUTE+ // PC0(23) = SETTING // PC4(27) = SDA // PC5(28) = SCL // PD2, PD3(4, 5) = CLK DIO TM1637 // PB5(19) = LED ALARM // PD6(12) = BYZZER ALARM void setup(){ Wire.begin(); clock.begin(); tm.brig(7); clock.setOutput(DS3231_1HZ); PORTC |= (1 << 2)|(1 << 1)|(1 << 0); // INPUT_PULLUP PC0 PC1 PC2 DDRB |= (1 << 5); hh = EEPROM.read(0);mm = EEPROM.read(1);alarm = EEPROM.read(2); } void loop(){ DateTime = clock.getDateTime(); hour = DateTime.hour; minut = DateTime.minute; timer = hour*100 + minut; if(sett == 0) {tm.print_time(timer, ((PINC >> 3) & 1));} if(sett == 1) {tm.print_time(timer, 1);} if(sett == 2) {tm.print_time(hh*100+mm, 0);} if(((PINC >> 2) & 1) == LOW && sett == 1){ /////// BUTTON PC2 = HOUR+ w=1; hour++; if(hour>23){hour=0;} delay(300);} if(((PINC >> 1) & 1) == LOW && sett == 1){ /////// BUTTON PC1 = MINUTE+ w=1; minut++; if(minut>59){minut=1;} delay(300);} if(((PINC >> 2) & 1) == LOW && sett == 2){ /////// BUTTON ALARM PC2 = HOUR+ ww=1; hh++; if(hh>23){hh=0;} delay(300);} if(((PINC >> 1) & 1) == LOW && sett == 2){ /////// BUTTON ALARM PC1 = MINUTE+ ww=1; mm++; if(mm>59){mm=0;} delay(300);} if(((PINC >> 2) & 1) == LOW && sett == 0){ /////// BUTTON PC2 = alarm on alarm = 1; EEPROM.update(2,alarm);delay(300);} if(((PINC >> 1) & 1) == LOW && sett == 0){ /////// BUTTON PC1 = alarm off alarm = 0; EEPROM.update(2,alarm);delay(300);} if(alarm == 1){PORTB |= (1 << 5);}else{PORTB &= ~(1 << 5);} //// setting if(((PINC >> 0) & 1) == LOW){sett++;if(sett > 2){sett=0;}delay(300);} ////////// SET if(w == 1){w=0; clock.setDateTime(2020, 8, 20, hour, minut, 0);} if(ww == 1){ww=0; EEPROM.update(0,hh);EEPROM.update(1,mm);} if((hh*100+mm == hour*100+minut) && alarm==1){tone(6,1500,150);} // delay(100); }
Библиотеки: