Güç tüketimi, kapatılmadan uzun süre sürekli çalışan bir cihaz için kritik bir konudur. Dolayısıyla, bu sorunun üstesinden gelmek için neredeyse her denetleyici, geliştiricilerin optimum güç tüketimi için elektronik aygıtlar tasarlamalarına yardımcı olan bir uyku moduna sahiptir. Uyku modu, kullanılmayan modülü kapatarak cihazı güç tasarrufu moduna geçirir.
Daha önce, Güç Tasarrufu için ESP8266'da Derin uyku modunu açıklamıştık. Bugün Arduino Uyku Modlarını öğreneceğiz ve Ampermetre kullanarak güç tüketimini göstereceğiz. Bir Arduino Uyku modu, Arduino Güç Tasarrufu modu veya Arduino Bekleme Modu olarak da adlandırılır.
Arduino Uyku Modları
Uyku Modları, kullanıcının Mikroişlemcideki kullanılmayan modülleri durdurmasına veya kapatmasına izin vererek güç tüketimini önemli ölçüde azaltır. Arduino UNO, Arduino Nano ve Pro-mini, ATmega328P ile birlikte gelir ve uyku modu sırasında besleme voltajını izleyen bir Brown-out Detector (BOD) içerir.
ATmega328P'de altı uyku modu vardır:
Uyku modlarından herhangi birine girmek için Uyku Modu Kontrol Kaydı'nda (SMCR.SE) uyku bitini etkinleştirmemiz gerekir. Ardından uyku modu seçim bitleri Boşta, ADC gürültü azaltma, Güç Kapatma, Güç Tasarrufu, Bekleme ve Harici Bekleme arasından uyku modunu seçer.
Dahili veya harici bir Arduino kesintiye uğrar veya bir Sıfırlama, Arduino'yu uyku modundan uyandırabilir.
Bekleme modu
Boşta uyku moduna girmek için, denetleyicinin '000' SM bitlerini yazın. Bu mod CPU'yu durdurur ancak SPI, 2-telli seri arayüz, USART, Watchdog, sayaçlar, analog karşılaştırıcının çalışmasına izin verir. Boşta modu temelde CLK durur CPU ve CLK FLASH. Arduino, harici veya dahili kesinti kullanılarak her an uyandırılabilir.
Boşta Uyku Modu için Arduino Kodu:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Arduino'da çeşitli düşük güç modlarını ayarlamak için bir kütüphane bulunmaktadır. Bu yüzden önce kütüphaneyi verilen bağlantıdan indirip kurun ve Arduino'yu Boşta Uyku Moduna getirmek için yukarıdaki kodu kullanın. Yukarıdaki kodu kullanarak, Arduino sekiz saniyelik bir uykuya girecek ve otomatik olarak uyanacaktır. Kodda görebileceğiniz gibi, boş mod tüm zamanlayıcıları, SPI, USART ve TWI'yi (2 kablolu arayüz) kapatır.
ADC Gürültü Azaltma Modu
Bu uyku modunu kullanmak için SM bitini '001'e yazın. Mod CPU'yu durdurur ancak ADC, harici kesinti, USART, 2 kablolu seri arabirim, Watchdog ve sayaçların çalışmasına izin verir. ADC Gürültü Azaltma modu temelde CLK durur CPU, CLK I / O ve CLK FLASH. Denetleyiciyi ADC Gürültü Azaltma modundan aşağıdaki yöntemlerle uyandırabiliriz:
- Harici Sıfırlama
- Watchdog Sistem Sıfırlama
- Watchdog Interrupt
- Voltaj azalması Sıfırlama
- 2 kablolu Seri Arabirim adresi eşleşmesi
- INT'de harici seviye kesintisi
- Pin değiştirme kesintisi
- Zamanlayıcı / Sayaç kesintisi
- SPM / EEPROM hazır kesintisi
Güç Kapatma Modu
Güç Kapatma modu, üretilen tüm saatleri durdurur ve yalnızca asenkron modüllerin çalışmasına izin verir. SM bitlerini '010'a yazarak etkinleştirilebilir. Bu modda, harici osilatör KAPANIR, ancak 2 kablolu seri arayüz, bekçi uygulaması ve harici kesinti çalışmaya devam eder. Aşağıdaki yöntemlerden yalnızca biriyle devre dışı bırakılabilir:
- Harici Sıfırlama
- Watchdog Sistem Sıfırlama
- Watchdog Interrupt
- Voltaj azalması Sıfırlama
- 2 kablolu Seri Arabirim adresi eşleşmesi
- INT'de harici seviye kesintisi
- Pin değiştirme kesintisi
Güç Kapatma Periyodik Modu için Arduino Kodu:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Kod, güç kapatma modunu açmak için kullanılır. Yukarıdaki kodu kullanarak, Arduino sekiz saniyelik bir uykuya girecek ve otomatik olarak uyanacaktır.
Ayrıca, Arduino'nun uykuya geçeceği ancak yalnızca harici veya dahili bir kesinti sağlandığında uyandığı bir kesinti ile güç kapatma modunu da kullanabiliriz.
Güç Kapatma Kesme Modu için Arduino Kodu:
void loop () { // Uyandırma pininin düşük seviyede kesintiyi tetiklemesine izin verin. attachInterrupt (0, uyandırma, DÜŞÜK); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Uyanma pinindeki harici pin kesintisini devre dışı bırakın. detachInterrupt (0); // Burada bir şeyler yapın }
Güç tasarrufu modu
Güç tasarrufu moduna girmek için SM pinini '011'e yazmamız gerekir. Bu uyku modu, güç kapatma moduna benzer, yalnızca bir istisna dışında, yani zamanlayıcı / sayaç etkinleştirilirse, uyku sırasında bile çalışır durumda kalacaktır. Cihaz, zamanlayıcı taşması kullanılarak uyandırılabilir.
Süreyi / sayacı kullanmıyorsanız, güç tasarrufu modu yerine Güç kapatma modunu kullanmanız önerilir.
Bekleme Modu
Bekleme modu, Güç Kapatma modu ile aynıdır, aralarındaki tek fark, bu modda çalışmaya devam eden harici osilatördür. Bu modu etkinleştirmek için SM pinini '110'a yazın.
Genişletilmiş Bekleme Modu
Bu mod, osilatörün çalışmaya devam ettiği bir istisna dışında güç tasarrufu moduna benzer. SM pinini '111' olarak yazdığımızda cihaz Genişletilmiş Bekleme moduna girecektir. Cihaz, genişletilmiş bekleme modundan uyanmak için altı saat döngüsü alacaktır.
Devre şemasına göre devreyi bağladıktan sonra bu proje için gereksinimler aşağıdadır. Uyku modu kodunu Arduino IDE'yi kullanarak Arduino'ya yükleyin. Arduino boşta uyku moduna girecektir. Ardından akım tüketimini USB ampermetre üzerinden kontrol edin. Aksi takdirde, aynısı için bir pens ampermetre de kullanabilirsiniz.
Gerekli Bileşenler
- Arduino UNO
- DHT11 Sıcaklık ve Nem Sensörü
- USB Ampermetre
- Breadboard
- Kabloların Bağlanması
DHT11'i Arduino ile kullanma hakkında daha fazla bilgi edinmek için bağlantıyı takip edin. Burada Arduino'nun uyku modunda tükettiği voltajı ölçmek için USB Ampermetre kullanıyoruz.
USB Ampermetre
USB ampermetre, herhangi bir USB bağlantı noktasından voltaj ve akımı ölçmek için kullanılan tak ve çalıştır bir cihazdır. Dongle, USB güç kaynağı (bilgisayarın USB bağlantı noktası) ve USB cihazı (Arduino) arasına takılır. Bu cihaz, içinden çekilen akımın değerini ölçtüğü güç pimi ile aynı hizada 0,05ohm dirence sahiptir. Cihaz, bağlı cihaz tarafından tüketilen akım ve voltaj değerlerini anında görüntüleyen dört adet yedi segmentli ekrana sahiptir. Bu değerler her üç saniyede bir değişir.
Şartname:
- Çalışma voltajı aralığı: 3.5V - 7V
- Maksimum akım derecesi: 3A
- Kompakt boyut, taşıması kolay
- Harici beslemeye gerek yok
Uygulama:
- USB cihazlarını test etme
- Yük seviyelerinin kontrol edilmesi
- Pil şarj cihazlarında hata ayıklama
- Fabrikalar, elektronik ürünler ve kişisel kullanım
Devre şeması
Arduino Deep uyku modlarını göstermek için yukarıdaki kurulumda, Arduino USB ampermetreye takılır. Ardından USB ampermetre dizüstü bilgisayarın USB bağlantı noktasına takılır. DHT11 sensörünün veri pini Arduino'nun D2 pinine eklenir.
Kod Açıklama
Videolu proje için eksiksiz kod sonunda verilmiştir.
Kod, DHT11 sensörü ve LowPower kitaplığı için kitaplığı dahil ederek başlar. Düşük Güç kitaplığını indirmek için bağlantıyı izleyin. Daha sonra DHT11'in data pininin bağlı olduğu Arduino pin numarasını tanımladık ve bir DHT nesnesi oluşturduk.
#Dahil etmek
Gelen boşluk kurulum fonksiyonu, biz kullanarak seri haberleşmeyi başlattık , serial.begin (9600) burada 9600 baud oranıdır. Arduino'nun yerleşik LED'ini uyku modu için bir gösterge olarak kullanıyoruz. Böylece pini çıkış olarak ve dijital yazmayı düşük olarak ayarladık.
geçersiz kurulum () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, DÜŞÜK); }
Gelen boşluk döngü fonksiyonu, biz sensörden yerleşik LED YÜKSEK ve okuma sıcaklık ve nem verilerini yapıyoruz. Burada DHT.read11 (); komutu, verileri sensörden okumaktır. Veriler hesaplandıktan sonra, değerleri herhangi bir değişkene kaydederek kontrol edebiliriz. Burada, iki float tipi değişken 't' ve 'h' aldık. Bu nedenle, sıcaklık ve nem verileri seri olarak seri monitörde yazdırılır.
void loop () { Serial.println ("DHT11'den Veri Al"); gecikme (1000); digitalWrite (LED_BUILTIN, YÜKSEK); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperature; float h = DHT.humidity; Seri.print ("Sıcaklık ="); Seri baskı (t); Seri.print ("C -"); Serial.print ("Nem ="); Seri. Baskı (h); Serial.println ("%"); gecikme (2000);
Uyku modunu etkinleştirmeden önce "Arduino: - Nap için gidiyorum" yazdırıyoruz ve dahili LED'i Düşük yapıyoruz. Bundan sonra aşağıdaki kodda belirtilen komut kullanılarak Arduino uyku modu etkinleştirilir.
Aşağıdaki kod, Arduino'nun boşta periyodik uyku modunu etkinleştirir ve sekiz saniyelik bir uyku verir. ADC, Zamanlayıcılar, SPI, USART, 2 telli arabirimi KAPALI durumuna çevirir.
Daha sonra 8 saniye sonra otomatik olarak Arduino'yu uykudan uyandırır ve “Arduino: - Hey ben yeni uyandım” yazar.
Serial.println ("Arduino: - Nap için gidiyorum"); gecikme (1000); digitalWrite (LED_BUILTIN, DÜŞÜK); LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF); Serial.println ("Arduino: - Hey Yeni Uyandım"); Serial.println (""); gecikme (2000); }
Yani bu kodu kullanarak Arduino bir dakika içinde sadece 24 saniye uyanacak ve 36 saniye boyunca uyku modunda kalacaktır, bu da Arduino hava istasyonu tarafından tüketilen gücü önemli ölçüde azaltır.
Bu nedenle, Arduino'yu uyku modunda kullanırsak, cihaz çalışma süresini yaklaşık iki katına çıkarabiliriz.