- Gerekli malzemeler:
- Ön koşullar:
- Devre şeması:
- Çalar Saat için Programlama:
- Simülasyon:
- PIC16F877A kullanarak Dijital Çalar Saatin Çalışması:
1950'de başlayan dijital devrim, mevcut tüm mekanik ve analog elektronik yapıları dijital bilgisayarlara dönüştürür. Dijital elektroniğin büyümesi katlanarak arttığından, günümüzde bir kişinin herhangi bir elektronik ekipmanı kullanmaya direnmesi neredeyse imkansızdır. Sizi uyandıran çalar saatten ve size kahvaltı servisi yapan ekmek kızartma makinesinden başlayarak, her şey dijital elektroniklerin katkısıdır. Tüm bunları düşündüğümüzde, PIC Microcontroller ile bu projede oluşturacağımız Alarm Clock gibi basit ama faydalı görevleri yerine getirebilecek kendi şeylerimizi programlamak gerçekten heyecan verici. Daha önce diğer Mikrodenetleyicilerle çalar saat oluşturduk:
- RTC Modülü DS1307 kullanan Raspberry Pi Çalar Saat
- Arduino Tabanlı Alarmlı Dijital Saat
- ATmega32 Mikrodenetleyiciyi kullanarak Çalar Saat
Bu çalar saat, mevcut saati ve ayarlanan zamanı gösteren 16x2 LCD ekrana sahip olacaktır. Gerektiğinde alarm zamanını ayarlamak için birkaç düğme kullanacağız. Geçerli zaman DS3231 RTC modülü kullanılarak takip edilecek ve bu değerleri RTC modülünden almak için IIC iletişimini kullanacağız. RTC modülünü ve bunun PIC ile nasıl arayüzleneceğini zaten öğrendik. Bu nedenle, bu öğreticiyi okumanız önerilir, bu eğitimde yer alan bilgilerin çoğunu atlayacağız.
Gerekli malzemeler:
- Ekmek Tahtası - 2Nos
- PIC16F877A
- 5V güç kaynağı - Besleme modülü
- 20 MHz kristal
- 33pf kapasitör - 2Nos
- DS3231 RTC modülü
- 16 * 2 LCD ekran modülü
- 10K Tencere
- 10k ve 1K direnç
- Basmalı düğmeler - 5Nos
- Buzzer
- Bağlantı telleri
Ön koşullar:
Bu proje, PIC mikro denetleyicisi ve nasıl programlanacağı hakkında birkaç temel bilgiye sahip olmanızı gerektirir. Bu proje için GPIO'lar, LCD ekran ve RTC modülünü kullanacağız. Bu yüzden bu modülleri önceden nasıl kullanacağınızı öğrenmek daha iyidir. Aşağıdaki bağlantılar aynı şeyi öğrenmenize yardımcı olacaktır
- PIC Microcontroller ile ilk programınızı yazma
- PIC ile LCD'yi arayüzleme
- PIC kullanarak I2C iletişimi
- PIC ile DS3231 RTC arabirimi
Devre şeması:
Proteus yazılımı kullanılarak oluşturulan bu PIC tabanlı Alarm Clock Projesi için devre şeması aşağıda gösterilmiştir. Ayrıca bu projede simülasyon için de kullanılacaktır.
Beş düğme, gerekli süre için alarmı ayarlamak için bir giriş görevi görecektir. Böylece tüm butonların bir ucu toprağa, diğer uçları PORTB pinine bağlanır, bu pinlerde pimlerin kaymaması için dahili pull-up direnci kullanılacaktır. Buzzer bir çıkış olarak hareket edecek ve alarm tetiklendiğinde ve PORT S pinine bağlandığında bize bir bip sesi verecektir. Geçerli zaman, PIC'in verileri I2C veriyolu üzerinden aldığı DS3231 RTC modülü tarafından her zaman takip edilir, böylece RTC modülünün SCL ve SDA pinleri PIC kontrolörünün SCL ve SDA pinine bağlanır. PIC'in PORTD'sine, geçerli saati ve saati görüntülemek için kullanılan bir LCD ekran eklenir. DS3231 RTC modülünü PIC ile kullanma hakkında buradan daha fazla bilgi edinin.
Devrenin tamamı bir devre tahtası üzerine inşa edilebilir. Bağlanacak birkaç düzine kablo olduğu için sabırlı olun ve bağlantıların doğru olduğundan emin olun. Bağlantılarla işim bittiğinde donanım kurulumum aşağıdaki gibi görünüyordu
Modüle güç sağlamak için bir devre tahtası modülü ve 12V adaptör kullandım. Bu benim + 5V besleme gerilimi kaynağım. Ayrıca devreyi temiz tutmak için iki devre tahtası kullanmam gerekiyor. Daha sağlam bir proje yapmak istiyorsanız, tüm devreyi mükemmel bir karta da lehimleyebilirsiniz.
Çalar Saat için Programlama:
Bu Çalar Saat proje için tam PIC programı bu sayfanın alt kısmında bulunabilir. Bu proje ayrıca LCD, I2C ve RTC'yi PIC ile kullanmak için üç kitaplık gerektirir. Başlık dosyalarıyla birlikte kodun tamamı, buradaki ZIP dosyasından indirilebilir ve çıkarıldıktan sonra MPLABX kullanılarak açılabilir. Aşağıda, ana c dosyasını küçük parçacıklar olarak açıklıyorum. Üstbilgi dosyalarının nasıl çalıştığını bilmek istiyorsanız, yukarıda bahsedilen eğitimlere geri dönebilirsiniz.
Ana programa geçmeden önce kullandığımız pinleri daha anlamlı bir isimle tanımlamamız gerekiyor. Bu şekilde, programlama sırasında kullanmak kolay olacaktır. Programımızda tanımlanan pinler aşağıda gösterilmiştir.
// LCD pinlerini tanımlayın #define RS RD2 // LCD'nin pinini sıfırlayın #define EN RD3 // LCD pinini etkinleştirin #define D4 RD4 // LCD'nin 0. veri biti #define D5 RD5 // LCD'nin 1. veri biti #define D6 RD6 // LCD'nin 2. veri biti # tanım D7 RD7 // LCD'nin 3. veri biti // Düğmeleri tanımla # tanımla MB RB1 // Orta düğme # tanımla LB RB0 // Sol düğme # tanımla RB RB2 // Sağ düğme # tanımla UB RB3 // Üst Düğme #define BB RB4 // Alt düğme // Buzz Tanımla #define BUZZ RD1 // Buzzer RD1'e bağlı
İçinde ana fonksiyonu Başlamadan giriş ve çıkış işaretçilerine ilan ederek. Projemizde PORTB bir giriş cihazı olan butonlar için kullanıldığından pinlerini giriş olarak ayarladık ve PORTD LCD ve zil için kullanıldığından pinlerini Çıkış olarak ayarladık. Ayrıca bir pim asla kayan anlamında bırakılmamalıdır, G / Ç pimleri her zaman ya Topraklamaya ya da + 5V voltajına bağlanmalıdır. Basmalı butonlar için bizim durumumuzda, butona basılmadığında pimler hiçbir şeye bağlanmayacaktır, bu nedenle kullanılmadığı zaman pimi Yüksek'e ayarlayan dahili bir çekme direnci kullanıyoruz. Bu, aşağıda gösterildiği gibi kontrol kayıtları kullanılarak yapılır.
TRISD = 0x00; // olarak Liman D işaretçilerine olun outptu arabirim LCD için TRISB = 0xFF; // Şalterler giriş fişi olarak bildirilen OPTION_REG = 0b00000000; // BUZZ = 0 anahtarları için B portunda Direnci yukarı çekmeyi etkinleştirin ; // Zil sesini çevir
Ana programla bağlantılı LCD ve I2C başlık dosyamız olduğundan, basit bir işlevi çağırarak LCD başlatmaya başlayabiliriz. Aynısı I2C başlatma için de yapılabilir. Burada RTC modülü 100kHz ile çalıştığı için I2C iletişimini 100kHz'de başlatıyoruz.
Lcd_Start (); // LCD modülünü başlat I2C_Initialize (100); // I2C Master'ı 100KHz saat ile başlat
Aşağıdaki fonksiyon, saat ve tarih ayarlandıktan sonra bu satırı kaldırın , RTC modülünde saat ve tarihi ayarlamak için kullanılır. Aksi takdirde, programı her başlattığınızda saat ve tarih tekrar tekrar ayarlanacaktır.
Saat ve tarih bir kez sınırının altında çıkarın // edilir ilk kez ayarlayın. Set_Time_Date (); // RTC modülünde saat ve tarihi ayarlayın
Programın başladığını belirtmek için, aşağıda gösterildiği gibi projenin adını ve web sitesi adını görüntüleyen küçük bir giriş ekranı görüntüleriz.
// LCD'de bir giriş mesajı verin Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Çalar Saat"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Devre Özeti"); __delay_ms (1500);
İçeride sonraki süre biz gereken döngü RTC modülünden Geçerli saati ve tarihi okumak, bu sadece işlevi aşağıda arayarak yapılabilir.
Update_Current_Date_Time (); // RTC modülünden güncel tarih ve saati okuyun
Yukarıdaki işlevi çağırmak sec, min ve hour değişkenlerini mevcut değerle güncelleyecektir. İçin LCD ekranda gösterilecek tek tek karakterlere bunları bölmek zorunda aşağıdaki kodu kullanarak.
// lcd char sec_0 = sec% 10; karakter sn_1 = (sn / 10); char min_0 = min% 10; char min_1 = min / 10; char hour_0 = saat% 10; char saat_1 = saat / 10;
Daha sonra değerleri LCD ekran üzerinden güncelliyoruz. Geçerli zaman ilk satırda görüntülenecek ve alarmın tetiklenmesi gereken ayarlanan saat ikinci satırda görüntülenecektir. Aynısını yapan kod aşağıda gösterilmiştir.
// Geçerli Saati LCD ekranda görüntüleyin Lcd_Clear (); Lcd_Set_Cursor (1, 1); Lcd_Print_String ("TIME:"); Lcd_Print_Char (saat_1 + '0'); Lcd_Print_Char (saat_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (min_1 + '0'); Lcd_Print_Char (min_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (sn_1 + '0'); Lcd_Print_Char (sn_0 + '0'); // LCD ekranda Tarihi görüntüleyin Lcd_Set_Cursor (2, 1); Lcd_Print_String ("Alarm:"); Lcd_Print_Char (alarm_val + '0'); Lcd_Print_Char (alarm_val + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (alarm_val + '0 '); Lcd_Print_Char (alarm_val + '0');
Şimdi, saati ve saati LCD'de görüntüledik , kullanıcının alarm saatini ayarlamaya çalışıp çalışmadığını kontrol etmeliyiz. Bunu yapmak için kullanıcının orta düğmeye basması gerekir, bu nedenle orta düğmeye basılıp basılmadığını kontrol edeceğiz ve alarm ayar moduna girmek için bir değişkeni değiştireceğiz. Değerlerin ayarlandığını doğrulamak için aynı düğmeye tekrar basılacaktır ve bu durumda alarm ayar modundan çıkmamız gerekir. Bu yüzden set_alarm değişkeninin durumunu değiştirmek için aşağıdaki kod satırını kullanıyoruz .
// Alarmın ayarlanması gerekip gerekmediğini kontrol etmek için orta düğmeyi kullanın (MB == 0 && set_alarm == 0) {// Orta düğmeye basılırsa ve alarm açık değilse (! MB); // buton bırakılıncaya kadar bekleyin set_alarm = 1; // alarm değerini ayarlamaya başla } if (MB == 0 && set_alarm == 1) {// Orta düğmeye basılırsa ve (! MB) sırasında alarm kapatılmazsa ; // Düğme bırakılana kadar bekleyin set_alarm = 0; // alarm değerini ayarlamayı durdurun }
Kullanıcı orta düğmeye bastıysa, bu, alarm saatini ayarlamaya çalıştığı anlamına gelir. Bu durumda program, yukarıdaki kodu kullanarak alarm ayar moduna girer. Alarm ayar modunda, kullanıcı sol veya sağ düğmeye basarsa, bu, imleci sola veya sağa hareket ettirmemiz gerektiği anlamına gelir. Bunu yapmak için, imlecin yerleştirilmesi gereken konumun değerini basitçe artırıyoruz.
if (LB == 0) {// Sol tuşa basılırsa (! LB); // Düğme bırakılana kadar bekleyin pos--; // Sonra imleci sola hareket ettirin } if (RB == 0) {// Sağ tuşa basılırsa (! RB); // Düğme bırakılana kadar bekleyin pos ++; // İmleci sağa taşı }
Mikrodenetleyici veya mikroişlemcili bir düğme kullanırken, çözülmesi gereken yaygın bir sorun vardır. Bu soruna anahtar zıplaması denir. Yani düğmeye basıldığında, MCU / MPU'ya gürültülü darbeler verebilir ve bu da MCU'yu birden fazla giriş için taklit edebilir. Bu sorun, anahtar boyunca bir kapasitör eklenerek veya düğmeye basıldığı algılanır algılanmaz bir gecikme işlevi kullanılarak çözülebilir. Bu tür çözüme geri sıçrama adı verilir. Burada , düğme bırakılana kadar programı yerinde tutmak için bir while döngüsü kullandık. Bu en iyi zıplama çözümü değil ama bizim için gayet iyi çalışacak.
while (! RB);
Sol ve sağ düğmeye benzer şekilde, alarm zamanının değerini artırmak veya azaltmak için kullanılabilen üst ve alt düğmelere de sahibiz. Aynısını yapmak için kod aşağıda gösterilmiştir. Ayarlanan alarm zamanının her karakterinin dizinin indeks değeri tarafından ele alındığına dikkat edin. Bu, değerleri değiştirilmesi gereken gerekli karaktere kolayca erişebilmemizdi.
if (UB == 0) {// (! UB) iken üst düğmeye basılırsa ; // Düğme bırakılana kadar bekleyin alarm_val ++; // Bu karakter değerini artırın } if (BB == 0) {// Alt düğmeye basılırken (! UB); // Düğme bırakılana kadar bekleyin alarm_val--; // Söz konusu karakter değerini azaltın }
Alarm zamanı ayarlandıktan sonra kullanıcı orta düğmeye tekrar basacaktır. Daha sonra şimdiki zamanı ayarlanan zamanla karşılaştırmaya başlayabiliriz. Geçerli zamanın her bir karakterinin ayarlanan zamanın karakterine eşit olup olmadığını kontrol ederek karşılaştırma. Değerler eşitse, trigger_alarm değişkenini ayarlayarak alarmı tetikleriz, aksi takdirde eşit olana kadar karşılaştırırız.
// EĞER alarm ayarlanmışsa Ayar değerinin mevcut değere eşit olup olmadığını kontrol edin (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1; // Değer eşleşirse tetikleyiciyi etkinleştirin
Alarm ayarlanmışsa, kullanıcıyı alarm için uyarmak için sesli uyarıyı biplemeliyiz. Bu, aşağıda gösterildiği gibi, Buzzer'ı düzenli aralıklarla değiştirerek yapılabilir.
if (trigger_alarm) {// Eğer alarm tetiklenirse // Buzzer'ı çalar BUZZ = 1; __delay_ms (500); BUZZ = 0; __delay_ms (500); }
Simülasyon:
Bu program, proteus yazılımı kullanılarak da simüle edilebilir. Sadece yukarıda gösterilen devreyi yeniden oluşturun ve hex dosyasını PIC'e yükleyin. Bu proje için onaltılık kod, buraya bağlanan ZIP dosyasında bulunabilir. Simülasyon sırasında çekilmiş bir ekran görüntüsü aşağıda gösterilmiştir
Simülasyon, projeye yeni özellikler eklemeye çalışırken çok kullanışlı hale gelir. I2C veri yolu üzerinden hangi verilerin girip çıktığını kontrol etmek için I2C hata ayıklayıcı modülünü de kullanabilirsiniz. Düğmelere basmayı deneyebilir ve ayrıca alarm saatini ayarlayabilirsiniz. Ayarlanan zaman mevcut saate eşit olduğunda, sesli uyarı yükselecektir.
PIC16F877A kullanarak Dijital Çalar Saatin Çalışması:
Devreyi devre tahtasında oluşturun, kodu indirme bağlantısından alın ve MplabX ve XC8 derleyicisini kullanarak derleyin. Kodu burada verilen ZIP dosyasından indirdiyseniz, başlık dosyaları zaten eklenmiş olduğu için derlemede sorun yaşamazsınız.
Derledikten sonra, programı PicKit3 programlayıcısını kullanarak donanımınıza yükleyin. Pickit programlayıcıyı PIC IC'ye bağlama bağlantısı da devre şemasında gösterilmiştir. Program yüklendikten sonra, giriş ekranını görmelisiniz ve ardından görüntülenen zamanı, alarm saatini ayarlamak için basma düğmelerini kullanabilirsiniz. Güç verildiğinde donanım kurulumum aşağıdaki gibi görünüyor.
Alarm zamanı mevcut zamanla eşleştiğinde, sesli uyarı kullanıcıyı alarma geçirmek için bip sesi çıkarmaya başlayacaktır. Tam çalışma aşağıdaki videoda bulunabilir. Projenin üzerine inşa edilecek çok sayıda seçenek var. RTC modülü herhangi bir saat ve tarihi takip edebilir, böylece gerekli herhangi bir zamanda / tarihte zamanlanmış bir görevi gerçekleştirebilirsiniz. Ayrıca bir fan veya ışık gibi bir AC cihazı bağlayabilir ve gerektiğinde AÇIK veya KAPALI konuma getirilmesini programlayabilirsiniz. Hala bu proje üzerine inşa edebileceğiniz daha çok şey var, bu projeye yükseltme olarak aklınıza hangi fikrin geldiğini bildirin ve sizden haber almaktan mutluluk duyarım.
Umarım projeyi anladınız ve süreçten faydalı bir şeyler öğrenmişsinizdir. Bu projede herhangi bir şüpheniz varsa, bunları göndermek için yorum bölümünü kullanın veya herhangi bir teknik yardım için forumları kullanın.
Başlık dosyalarıyla birlikte eksiksiz PIC kodu burada bulunabilir