Arduino ile harika bir taşınabilir proje (örneğin pilli bir hava istasyonu, saksı nem ölçer veya uzaktan kumanda) tasarladınız ve her şeyi bir kutuya koyup sahaya bıraktınız. Ancak birkaç gün sonra projenin çalışmadığını, pilin tamamen tükendiğini fark ettiniz.
Standart bir Arduino Uno veya Nano, boşta çalışırken bile yaklaşık 30-50 mA arasında akım çeker. Eğer projeniz sadece saatte bir kez sensör okuyup geri kalan sürede hiçbir şey yapmıyorsa, mikrodenetleyicinin sürekli açık kalması tam bir enerji israfıdır.
Bu yazımızda, Arduino'yu derin bir uykuya sokarak güç tüketimini mikroamper (µA) seviyelerine düşürmeyi ve pil ömrünü aylarca (hatta yıllarca) nasıl uzatacağımızı öğreniyoruz.
Uyku modu, Arduino'nun içindeki işlemci çekirdeğini, çevre birimlerini (Zamanlayıcılar, ADC, Seri Port vb.) ve saat osilatörünü geçici olarak kapatarak enerji tasarrufu sağlama yöntemidir. Bilgisayarlarımızı veya telefonlarımızı "Hazırda Beklet" moduna almaya benzer.
ATmega328P işlemcisinde farklı uyku modları bulunur ancak en yüksek tasarrufu SLEEP_MODE_PWR_DOWN (Derin Uyku) modu sağlar. Bu modda Arduino adeta komaya girer ve akım tüketimi minimuma iner.
Arduino derin uykuya daldığında delay() gibi fonksiyonlar çalışmaz ve zaman durur. Peki, bu kartı uykudan nasıl uyandıracağız?
En etkili yöntem Harici Kesmeler (External Interrupts) kullanmaktır. Arduino Uno ve Nano üzerinde harici kesme olarak kullanabileceğimiz iki özel pin bulunur: D2 (Interrupt 0) ve D3 (Interrupt 1). Bu pinlere bağlı bir buton, bir hareket sensörü (PIR) veya bir kapı manyetiği tetiklendiği anda Arduino uyanır, görevini yapar ve tekrar uykuya dalar.
Aşağıdaki kodda Arduino setup işlemlerini bitirdikten sonra uykuya dalacaktır. Siz D2 pinine bağlı butona bastığınız anda sistem uyanacak, 13 numaralı LED'i 3 saniye yakacak ve ardından tekrar derin uykuya geçecektir.
#include <avr/sleep.h> // Uyku modları için gerekli kütüphane
#include <avr/power.h> // Güç yönetimi için gerekli kütüphane
const int wakeUpPin = 2; // Arduino'yu uyandıracak kesme pini (D2)
const int ledPin = 13; // Durumu gözlemleyeceğimiz LED
void wakeUp() {
// Burası Interrupt (Kesme) fonksiyonudur.
// Uyanma anında buradaki kodlar çok hızlıca çalışır.
// Uyku modundan çıkış için bu fonksiyonun içi boş kalabilir.
}
void setup() {
pinMode(wakeUpPin, INPUT_PULLUP); // Buton pimini dahili pull-up ile giriş yapıyoruz
pinMode(ledPin, OUTPUT);
}
void loop() {
// 1. ADIM: Uyanınca yapılacak işleri buraya yazıyoruz
digitalWrite(ledPin, HIGH);
delay(3000); // LED'i 3 saniye yak
digitalWrite(ledPin, LOW);
// 2. ADIM: Tekrar uykuya hazırlık
delay(200); // Seri port veya donanımların işlemlerini bitirmesi için kısa bir bekleme
// Uyku modunu en derin seviye olan "Power Down" olarak ayarlıyoruz
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable(); // Uyku modunu kuruluma hazır hale getir
// D2 pini LOW (Şaseye) düştüğünde (butona basıldığında) wakeUp fonksiyonunu çağır
attachInterrupt(digitalWritePinToInterrupt(wakeUpPin), wakeUp, LOW);
// 3. ADIM: Arduino şimdi uyuyor!
// Kod tam bu satırda durur ve işlemci kapanır.
sleep_mode();
// ==========================================
// BUTONA BASILDIĞI ANDA KOD BURADAN DEVAM EDER
// ==========================================
sleep_disable(); // İlk iş olarak uyku modunu devre dışı bırak
detachInterrupt(digitalWritePinToInterrupt(wakeUpPin)); // Kesmeyi kaldır (Gereksiz uyanmaları önlemek için)
}
IoT ve giyilebilir teknoloji projelerinde pil ömrü her şeydir. Projenizin sürekli veri göndermesine gerek yoksa, <avr/sleep.h> kütüphanesini kullanarak sisteminizi uyutun, sadece bir hareket veya zamanlayıcı sinyali geldiğinde uyandırın. Doğru donanım modifikasyonlarıyla bir çift kalem pille 1 yıldan fazla çalışan sistemler kurabilirsiniz!
Pilli Arduino projelerinizde karşılaştığınız en büyük zorluklar nelerdi? Sleep mode denerken takıldığınız adımları yorumlarda bizimle paylaşın, birlikte çözelim!
Henüz yorum yapılmamış. İlk yorumu siz yapın!