ATtiny Dijital Saat Yapımı
ATtiny son yıllarda çokça kullanılan mini bir işlemcidir.Atmel firması tarafından geliştirilip üretilen 8-bit lik bir işlemcidir.Devre iken programlanabilme özelliklerine sahiptir.Bu projemizde basit bir dijital saat uygulaması yapacağız.İşlemci olarakta ATtiny85 kullanacağız.Basit gibi görünün bu proje aslında bu işe yeni başlayan makerlar için biraz uğraştırıcı olabilir.Çünkü ATtiny85 i programlamak sanıldığı kadar kolay değil ATtiny Programlama yı buradan öğrenebilirsiniz.
Projemizde Kullanılan Malzemeler
Öncelikle yukarıdaki malzemeleri temin ediniz.Daha sonra yazımızın başında belirttiğimiz konudan ATtiny işlemcinizi programlayınız.
- ATtiny85
- SSD1306 Oled Ekran
- CR1220 Lityum Para Pil
- Pil tutucu
- Push buton (x2)
- Açma -Kapama Düğmesi
- Delikli plaket ve kablolar
Öncelikle yukarıdaki malzemeleri temin ediniz.Daha sonra yazımızın başında belirttiğimiz konudan ATtiny işlemcinizi programlayınız.
Oled ekran üzerinde 4 adet pin mevcut SDA ve SCL pinleri veri alışverişi için,ATtiny85 bağlantışarı aşağıdaki gibidir.
- ATtiny85 (Pin 1) Boş
- ATtiny85 (Pin 2) Birinci butona (butonun diğer ucu GND ye bağlanacak)
- ATtiny85 (Pin 3) İkinci butona (butonun diğer ucu GND ye bağlanacak)
- ATtiny85 (Pin 4) GND
- ATtiny85 (Pin 5) Oled Ekran SDA
- ATtiny85 (Pin 6) Boş
- ATtiny85 (Pin 7) Oled Ekran SCL
- ATtiny85 (Pin 8) VCC
ATtiny yi arduino ile programlarken kullanmanız gereken saat kodları
Kod:
#include <avr/sleep.h></span>
#include <TinyWireM.h>
#include "ssd1306.h"
#include "WDT_Time.h"
#define TIMEOUT 5000 // 5 seconds
static uint32_t display_timeout;
#define UNUSEDPIN 1
#define SETBUTTON 3
#define UPBUTTON 4
SSD1306 oled;
bool sleeping = false;
**** setup() {
pinMode(UNUSEDPIN, INPUT_PULLUP);
pinMode(SETBUTTON, INPUT_PULLUP);
pinMode(UPBUTTON, INPUT_PULLUP);
wdt_setup();
TinyWireM.begin();
oled.begin();
oled.fill(0x00); // clear in black
set_display_timeout();
}
**** loop() {
if (sleeping) {
system_sleep();
} else {
if (millis() > display_timeout) {
enter_sleep();
} else {
draw_oled();
}
}
}
**** enter_sleep() {
oled.fill(0x00); // clear screen to a**** show old time when wake up
oled.off();
delay(2); // wait oled stable
sleeping = true;
}
**** wake_up() {
sleeping = false;
delay(2); // wait oled stable
oled.on();
set_display_timeout();
}
**** set_display_timeout() {
display_timeout = millis() + TIMEOUT;
}
/*
* UI related
*/
// 0: time; 1: debug
static uint8_t display_mode = 0;
static uint8_t last_display_mode = 0;
// 0: none; 1: year; 2: month; 3: day; 4: hour; 5: minute
static uint8_t selected_field = 0;
**** draw_oled() {
if (display_mode != last_display_mode) {
oled.fill(0x00);
last_display_mode = display_mode;
}
if (display_mode == 0) {
// 1st rows: print date
/* print_digits(col, page, size, factor, digits) */
oled.print_digits(0, 0, 1, 1000, year(), (selected_field == 1) ? true : false);
/* draw_pattern(col, page, width, pattern) */
oled.draw_pattern(29, 0, 2, 0b00010000); // dash
oled.print_digits(32, 0, 1, 10, month(), (selected_field == 2) ? true : false);
oled.draw_pattern(47, 0, 2, 0b00010000); // dash
oled.print_digits(50, 0, 1, 10, day(), (selected_field == 3) ? true : false);
// 2nd-4th rows: print time
oled.print_digits(0, 1, 3, 10, hour(), (selected_field == 4) ? true : false);
oled.draw_pattern(31, 2, 2, (second() & 1) ? 0b11000011 : 0); // blink colon
oled.print_digits(34, 1, 3, 10, minute(), (selected_field == 5) ? true : false);
} else if (display_mode == 1) {
oled.print_digits(0, 0, 1, 10000, wdt_get_interrupt_count(), false);
oled.print_digits(0, 1, 1, 10000, readVcc(), false);
}
}
// PIN CHANGE interrupt event function
ISR(PCINT0_vect)
{
sleep_disable();
if (sleeping) {
wake_up();
} else {
if (digitalRead(SETBUTTON) == LOW) { // SET button pressed
selected_field++;
if (selected_field > 5) selected_field = 0;
if (selected_field > 0) display_mode = 0;
} else if (digitalRead(UPBUTTON) == LOW) { // UP button pressed
if (selected_field == 0) {
display_mode++; // toggle mode;
if (display_mode > 1) display_mode = 0;
} else {
int set_year = year();
int set_month = month();
int set_day = day();
int set_hour = hour();
int set_minute = minute();
if (selected_field == 1) {
set_year++; // add year
if (set_year > 2069) set_year = 1970; // loop back
} else if (selected_field == 2) {
set_month++; // add month
if (set_month > 12) set_month = 1; // loop back
} else if (selected_field == 3) {
set_day++; // add day
if (set_day > getMonthDays(CalendarYrToTm(set_year), set_month)) set_day = 1; // loop back
} else if (selected_field == 4) {
set_hour++; // add day
if (set_hour > 23) set_hour = 0; // loop back
} else if (selected_field == 5) {
set_minute++; // add day
if (set_minute > 59) set_minute = 0; // loop back
}
setTime(set_hour, set_minute, second(), set_day, set_month, set_year);
}
}
}
set_display_timeout(); // extent display timeout while user input
sleep_enable();
}