Pengendali Daya ATTiny13A
Kode C yang ditulis untuk mikrokontroler ATTiny13A ini dirancang untuk mengendalikan sebuah perangkat elektronik, seperti relay atau MOSFET, dengan memantau tegangan baterai dan menggunakan mekanisme hibernasi untuk menghemat energi.
Kode ini dimulai dengan inisialisasi Analog-to-Digital Converter (ADC) untuk membaca tegangan pada pin PB2. Ada dua fungsi calculateVoltage, satu untuk Vcc 5V dan satu untuk Vcc 3.3V, tetapi yang digunakan di sini adalah untuk Vcc 3.3V. Fungsi calculateVoltage menghitung tegangan sebenarnya dengan memperhitungkan pembagi tegangan yang terdiri dari resistor R1 dan R2.
Setelah inisialisasi, mikrokontroler memantau tegangan baterai menggunakan fungsi readVoltage. Jika tegangan baterai di atas 3.6V, mikrokontroler akan mengaktifkan LED dan relay atau MOSFET selama 5 menit, yang mungkin digunakan untuk mengaktifkan perangkat tertentu atau menjalankan proses. Setelah proses selesai, mikrokontroler mematikan LED dan relay atau MOSFET.
Selanjutnya, kode tersebut menggunakan mekanisme hibernasi untuk menghemat energi. Mikrokontroler masuk ke mode hibernasi 'power down' untuk waktu yang telah ditentukan (di sini, 10 menit), yang dikendalikan oleh Watchdog Timer (WDT). WDT diatur untuk membangunkan mikrokontroler setiap 2 detik. Saat WDT mengaktifkan interrupt, tidak ada tindakan khusus yang dilakukan, tetapi hal ini memungkinkan mikrokontroler untuk keluar dari mode hibernasi dan melanjutkan operasi.
Dalam loop utama, setiap kali mikrokontroler terbangun dari hibernasi, ia akan memeriksa tegangan baterai lagi dan mengulangi proses jika perlu. Setelah itu, mikrokontroler kembali masuk ke mode hibernasi. Mekanisme ini memastikan bahwa mikrokontroler hanya aktif ketika perlu, sehingga menghemat energi baterai.
Kode ini sangat berguna untuk aplikasi yang membutuhkan pemantauan tegangan baterai dan pengendalian perangkat dengan efisiensi energi yang tinggi, seperti dalam sistem otomatisasi rumah atau aplikasi IoT yang menggunakan baterai.
#include < avr/sleep.h >
#include < avr/wdt.h >
#include < avr/interrupt.h >
#define PIN_LED 1 // LED
#define PIN_POWER 0 // Ke mosfet/relay
int loop_hibernasi=300; //10 menit = 10 menit * 60 detik / 2 detik
float voltage=0;
// Menghitung tegangan di PB2 dari nilai ADC dengan pembagi tegangan R1 dan R2, untuk Vcc 5V
//float calculateVoltage(uint16_t adcValue) {
// float V_ADC = adcValue * (5.0 / 1024.0); // Mengubah nilai ADC menjadi tegangan
// float R1 = 47000.0; // R1 = 47kΩ
// float R2 = 10000.0; // R2 = 10kΩ
// return V_ADC * ((R1 + R2) / R2); // Kalkulasi tegangan sesungguhnya pada PB2
//}
void initADC() {
ADMUX = (1 < 3.6)
{
//hidupkan LED
digitalWrite(PIN_LED, HIGH);
//nyalakan relay/mosfet
digitalWrite(PIN_POWER, HIGH);
delay(1000*60*5); //tunggu 5 menit untuk proses
//matikan relay/mosfet
digitalWrite(PIN_POWER, LOW);
//matikan LED
digitalWrite(PIN_LED, LOW);
}
blink();
for (int i = 0; i < loop_hibernasi; i++) hibernasi(); // hibernasi 10 menit
}