Hibernasi pada ATTiny13A
Kode ini merupakan program untuk mikrokontroler ATTiny13A yang bertujuan untuk mengontrol LED. Di awal, kita mendefinisikan PIN_LED yang terhubung dengan LED pada mikrokontroler. Program ini memiliki dua fungsi utama: blink() dan hibernasi(). Fungsi blink() akan mengaktifkan LED selama 250 milidetik, kemudian mematikannya selama 250 milidetik. Hal ini menciptakan efek kedipan pada LED.
Fungsi hibernasi() adalah inti dari program ini. Fungsi ini mengatur mikrokontroler untuk masuk ke mode tidur yang paling hemat energi, yaitu 'power down'. Selama dalam mode ini, mikrokontroler hampir tidak mengkonsumsi daya. Fungsi ini juga mengaktifkan interrupt global dan memasuki mode tidur. Mikrokontroler akan terbangun setiap dua detik, yang ditandai dengan interrupt dari Watchdog Timer (WDT).
Di bagian setup(), kita mengkonfigurasi pin LED sebagai output dan mengatur WDT untuk timeout selama dua detik. Kita juga mengatur WDT untuk beroperasi dalam mode interrupt, bukan reset.
Bagian loop() akan menjalankan fungsi blink() sekali, kemudian memanggil hibernasi() sebanyak 300 kali. Ini berarti mikrokontroler akan berada dalam mode hibernasi selama total 10 menit (karena 2 detik x 300 = 600 detik atau 10 menit). Setelah 10 menit, siklus ini akan diulang: LED akan berkedip lagi, diikuti oleh periode hibernasi selama 10 menit.
Kode ini efektif untuk aplikasi yang memerlukan penggunaan daya yang sangat rendah, dengan LED sebagai indikator visual bahwa mikrokontroler masih aktif dan berfungsi.
#include < avr/sleep.h >
#include < avr/wdt.h >
#include < avr/interrupt.h >
#define PIN_LED 0 // Sesuaikan dengan pin LED di ATTiny13A
int loop_hibernasi=300; //10 menit = 10 menit * 60 detik / 2 detik
void blink() {
digitalWrite(PIN_LED, HIGH); // Menghidupkan LED setelah bangun
delay(250); // Menunggu sejenak
digitalWrite(PIN_LED, LOW); // Mematikan LED
delay(250); // Menunggu sejenak
}
void hibernasi() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Mengatur sleep mode ke power down
sleep_enable(); // Mengizinkan sleep mode
sei(); // Mengaktifkan interrupt
sleep_mode(); // Masuk ke sleep mode
// Mikrokontroler akan melanjutkan dari sini setelah bangun
sleep_disable(); // Menonaktifkan sleep mode
}
// ISR untuk Watchdog Timer
ISR(WDT_vect) {
// Tidak perlu melakukan apa-apa di sini untuk kasus ini
}
void setup() {
pinMode(PIN_LED, OUTPUT);
// Mengatur Watchdog Timer untuk 2 detik
wdt_enable(WDTO_2S);
// Mengatur WDT untuk interrupt mode, bukan reset
WDTCR |= _BV(WDTIE);
}
void loop() {
blink();
for (int i = 0; i < loop_hibernasi; i++) hibernasi(); // hibernasi 10 menit
}