- Bahan yang Dibutuhkan:
- Prasyarat:
- Diagram Sirkuit:
- Pemrograman untuk Jam Alarm:
- Simulasi:
- Cara Kerja Jam Alarm Digital menggunakan PIC16F877A:
Revolusi digital yang dimulai pada tahun 1950 mengubah semua struktur elektronik mekanis dan analog yang ada menjadi komputer digital. Karena pertumbuhan elektronik digital sangat pesat, saat ini hampir tidak mungkin seseorang menolak penggunaan peralatan elektronik apa pun. Mulai dari jam alarm yang membangunkan Anda dan pemanggang roti yang menyajikan sarapan, semuanya merupakan kontribusi dari elektronik digital. Memikirkan semua ini, sangat menarik untuk memprogram barang-barang kita sendiri yang dapat melakukan tugas-tugas sederhana namun bermanfaat, seperti Jam Alarm yang akan kita buat dalam proyek ini dengan Mikrokontroler PIC. Kami sebelumnya telah membuat jam alarm dengan Mikrokontroler lain:
- Jam Alarm Raspberry Pi menggunakan Modul RTC DS1307
- Jam Digital Berbasis Arduino dengan Alarm
- Jam Alarm menggunakan Mikrokontroler ATmega32
Jam alarm ini akan memiliki layar LCD 16x2 yang akan menampilkan waktu saat ini dan waktu yang ditetapkan. Kami akan menggunakan beberapa tombol tekan untuk mengatur waktu alarm kapan pun diperlukan. Waktu saat ini akan dilacak menggunakan modul RTC DS3231 dan kami akan menggunakan komunikasi IIC untuk mendapatkan nilai ini dari modul RTC. Kami telah mempelajari tentang modul RTC dan cara menghubungkannya dengan PIC. Jadi disarankan untuk membaca tutorial itu, kami akan melewatkan sebagian besar informasi yang tercakup dalam tutorial itu.
Bahan yang Dibutuhkan:
- Papan Roti - 2Nos
- PIC16F877A
- Sumber daya 5V - Modul suplai
- Kristal 20 MHz
- 33pf kapasitor - 2Nos
- Modul DS3231 RTC
- 16 * 2 modul layar LCD
- 10K POT
- Resistor 10k dan 1K
- Tombol tekan - 5Nos
- Bel
- Menghubungkan kabel
Prasyarat:
Proyek ini mengharuskan Anda mengetahui beberapa dasar tentang mikrokontroler PIC dan cara memprogramnya. Kami akan menggunakan GPIO, layar LCD dan modul RTC untuk proyek ini. Jadi, lebih baik mempelajari cara menggunakan modul ini sebelumnya. Tautan berikut akan membantu Anda mempelajari hal yang sama
- Menulis program pertama Anda dengan Mikrokontroler PIC
- Interfacing LCD dengan PIC
- Komunikasi I2C menggunakan PIC
- RTC DS3231 berinteraksi dengan PIC
Diagram Sirkuit:
Diagram rangkaian untuk Proyek Jam Alarm berbasis PIC ini ditunjukkan di bawah ini, yang dibuat menggunakan software proteus. Ini juga akan digunakan untuk simulasi lebih lanjut dalam proyek ini.
Kelima tombol tekan tersebut akan berfungsi sebagai masukan untuk menyetel alarm untuk waktu yang dibutuhkan. Jadi salah satu ujung dari semua push button terhubung ke ground dan ujung lainnya terhubung ke pin PORTB, resistor pull-up internal akan digunakan pada pin ini untuk menghindari pin mengambang. Buzzer akan bertindak sebagai output dan akan memberi kita bunyi bip saat alarm terpicu dan terhubung ke pin PORT S. Waktu saat ini selalu dilacak oleh modul DS3231 RTC dari mana PIC menerima data melalui bus I2C, sehingga pin SCL dan SDA dari modul RTC dihubungkan ke pin SCL dan SDA dari pengontrol PIC. Layar LCD dipasang ke PORTD PIC yang digunakan untuk menampilkan waktu saat ini dan waktu yang ditetapkan. Pelajari lebih lanjut tentang menggunakan modul DS3231 RTC dengan PIC di sini.
Sirkuit lengkap dapat dibangun di atas papan tempat memotong roti. Karena ada beberapa lusin kabel untuk dihubungkan, jadi bersabarlah dan pastikan koneksi sudah benar. Pengaturan perangkat keras saya terlihat seperti ini di bawah ini setelah saya selesai dengan koneksi
Saya telah menggunakan modul papan tempat memotong roti dan adaptor 12V untuk memberi daya pada modul. Ini adalah sumber tegangan suplai + 5V saya. Saya juga harus menggunakan dua papan tempat memotong roti untuk menjaga sirkuit tetap bersih. Anda juga dapat menyolder seluruh sirkuit ke papan kinerja jika Anda ingin membuat proyek yang lebih kuat.
Pemrograman untuk Jam Alarm:
Program PIC lengkap untuk proyek Jam Alarm ini dapat ditemukan di bagian bawah halaman ini. Proyek ini juga membutuhkan tiga perpustakaan untuk menggunakan LCD, I2C dan RTC dengan PIC. Kode lengkap dengan file header dapat diunduh dari file ZIP di sini dan dapat dibuka menggunakan MPLABX setelah diekstrak. Lebih jauh di bawah saya hanya menjelaskan file c utama sebagai cuplikan kecil. Anda dapat kembali ke tutorial yang disebutkan di atas jika Anda ingin mengetahui cara kerja file header.
Sebelum masuk ke program utama, kita harus mendefinisikan pin yang telah kita gunakan dengan nama yang lebih bermakna. Dengan cara ini akan mudah menggunakannya selama pemrograman. Pin yang ditentukan dalam program kami ditunjukkan di bawah ini
// Tentukan pin LCD # tentukan RS RD2 // Setel ulang pin LCD # tentukan EN RD3 // Aktifkan pin LCD # tentukan D4 RD4 // Data bit 0 LCD # tentukan D5 RD5 // Data bit 1 pada LCD # tentukan D6 RD6 // Data bit 2 LCD # Tentukan D7 RD7 // Data bit 3 LCD // Tentukan Tombol # Tentukan MB RB1 // Tombol tengah # Tentukan LB RB0 // Tombol Kiri # Tentukan RB RB2 // Tombol Kanan # definisikan UB RB3 // Tombol Atas # tentukan BB RB4 // Tombol bawah // Tentukan Buzz # tentukan BUZZ RD1 // Buzzer tersambung ke RD1
Di dalam fungsi utama kita mulai dengan mendeklarasikan pin Input dan output. Dalam proyek kami PORTB digunakan untuk push button yang merupakan perangkat input sehingga kami mengatur pin mereka sebagai input dan PORTD digunakan untuk LCD dan buzzer sehingga kami menetapkan pin mereka sebagai Output. Juga pin tidak boleh dibiarkan mengambang, pin I / O harus selalu terhubung ke Ground atau ke tegangan + 5V. Dalam kasus kami untuk tombol tekan, pin tidak akan terhubung ke apa pun ketika tombol tidak ditekan sehingga kami menggunakan resistor pull-up internal yang mengatur pin ke Tinggi saat tidak digunakan. Ini dilakukan dengan menggunakan register kontrol seperti yang ditunjukkan di bawah ini
TRISD = 0x00; // Jadikan pin Port D sebagai output untuk antarmuka LCD TRISB = 0xFF; // Sakelar dideklarasikan sebagai pin input OPTION_REG = 0b00000000; // Aktifkan resistor pull up pada port B untuk sakelar BUZZ = 0; // Matikan bel
Karena kita memiliki file header LCD dan I2C yang terhubung dengan program utama, kita dapat memulai inisialisasi LCD dengan memanggil fungsi sederhana. Hal yang sama juga dapat dilakukan untuk inisialisasi I2C. Di sini kami memulai komunikasi I2C pada 100kHz karena modul RTC bekerja dengan 100kHz.
Lcd_Start (); // Inisialisasi modul LCD I2C_Initialize (100); // Inisialisasi I2C Master dengan clock 100KHz
Fungsi di bawah ini digunakan untuk mengatur waktu dan tanggal pada modul RTC, setelah waktu dan tanggal diatur, hapus baris ini. Lain kali setiap kali Anda memulai program, waktu dan tanggal akan diatur lagi dan lagi
// Hapus di bawah garis sekali waktu dan tanggal yang ditetapkan untuk pertama kalinya. Set_Time_Date (); // setel waktu dan tanggal pada modul RTC
Untuk menunjukkan bahwa program sedang dimulai kami menampilkan layar intro kecil yang menampilkan nama proyek dan nama situs web seperti yang ditunjukkan di bawah ini
// Berikan pesan intro pada LCD Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Jam Alarm"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Circuit Digest"); __delay_ms (1500);
Selanjutnya di dalam while loop kita perlu membaca waktu dan tanggal saat ini dari modul RTC, ini dapat dilakukan hanya dengan memanggil fungsi di bawah ini.
Perbarui_Kini_ Tanggal_Jadwal (); // Baca tanggal dan waktu saat ini dari modul RTC
Memanggil fungsi di atas akan memperbarui variabel sec, min dan hour dengan nilai saat ini. Untuk menampilkannya di layar LCD, kita harus membaginya menjadi karakter individual menggunakan kode di bawah ini.
// Bagi menjadi char untuk ditampilkan pada lcd char sec_0 = sec% 10; char sec_1 = (detik / 10); karakter min_0 = min% 10; karakter min_1 = min / 10; char hour_0 = jam% 10; char hour_1 = hour / 10;
Selanjutnya, kami memperbarui nilai di atas layar LCD. Waktu saat ini akan ditampilkan di baris pertama dan waktu yang ditetapkan di mana alarm harus dipicu ditampilkan di baris kedua. Kode yang melakukan hal yang sama ditunjukkan di bawah ini.
// Tampilkan Waktu Saat Ini pada layar LCD Lcd_Clear (); Lcd_Set_Cursor (1, 1); Lcd_Print_String ("TIME:"); Lcd_Print_Char (jam_1 + '0'); Lcd_Print_Char (hour_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (min_1 + '0'); Lcd_Print_Char (min_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (detik_1 + '0'); Lcd_Print_Char (sec_0 + '0'); // Tampilkan Tanggal di layar LCD 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');
Sekarang, kami telah menampilkan waktu dan mengatur waktu pada LCD, kami harus memeriksa apakah pengguna mencoba untuk mengatur waktu alarm. Untuk melakukan ini pengguna harus menekan tombol tengah, jadi kami akan memeriksa apakah tombol tengah ditekan dan mengaktifkan variabel untuk masuk ke mode set alarm. Tombol yang sama akan ditekan lagi untuk memastikan bahwa nilainya sudah diatur dan dalam hal ini kita harus keluar dari mode set alarm. Jadi kami menggunakan baris kode di bawah ini untuk mengubah status variabel set_alarm .
// Gunakan tombol tengah untuk memeriksa apakah alarm harus disetel jika (MB == 0 && set_alarm == 0) {// Jika tombol tengah ditekan dan alarm tidak dinyalakan saat (! MB); // Tunggu sampai tombol dilepaskan set_alarm = 1; // mulai menyetel nilai alarm } if (MB == 0 && set_alarm == 1) {// Jika tombol tengah ditekan dan alarm tidak dimatikan saat (! MB); // Tunggu sampai tombol dilepaskan set_alarm = 0; // berhenti menyetel nilai alarm }
Jika pengguna telah menekan tombol tengah, berarti dia sedang mencoba untuk mengatur waktu alarm. Dalam hal ini program masuk ke mode set alarm menggunakan kode di atas. Di dalam mode set alarm jika pengguna menekan tombol kiri atau kanan berarti kita harus menggerakkan kursor ke kiri atau kanan. Untuk melakukan ini, kami hanya menambah penurunan nilai posisi di mana kursor harus ditempatkan
if (LB == 0) {// Jika tombol kiri ditekan sementara (! LB); // Tunggu sampai tombol dilepaskan pos--; // Lalu pindahkan kursor ke kiri } if (RB == 0) {// Jika tombol kanan ditekan sambil (! RB); // Tunggu sampai tombol dilepaskan pos ++; // Pindahkan kursor ke kanan }
Saat menggunakan tombol tekan dengan mikrokontroler atau mikroprosesor, ada satu masalah umum yang harus diatasi. Masalah ini disebut dengan switch bouncing. Saat itulah tombol ditekan mungkin memberikan pulsa berisik ke MCU / MPU yang mungkin memalsukan MCU untuk beberapa entri. Masalah ini dapat diatasi dengan menambahkan kapasitor melintasi sakelar atau dengan menggunakan fungsi penundaan segera setelah tombol ditekan. Jenis solusi ini disebut de-bouncing. Di sini kami telah menggunakan while loop untuk menahan program di tempatnya sampai tombol dilepaskan. Ini bukan solusi de-bouncing terbaik tetapi bagi kami ini akan bekerja dengan baik.
sementara (! RB);
Mirip dengan tombol kiri dan kanan, kami juga memiliki tombol atas dan bawah yang dapat digunakan untuk menambah atau mengurangi nilai waktu alarm. Kode untuk melakukan hal yang sama ditunjukkan di bawah ini. Perhatikan bahwa setiap karakter dari waktu alarm yang disetel ditangani oleh nilai indeks larik. Di sinilah kita dapat dengan mudah mengakses karakter yang diperlukan yang nilainya harus diubah.
if (UB == 0) {// Jika tombol atas ditekan sementara (! UB); // Tunggu sampai tombol dilepaskan alarm_val ++; // Tingkatkan nilai karakter tertentu } if (BB == 0) {// Jika tombol bawah ditekan saat (! UB); // Tunggu sampai tombol dilepaskan alarm_val--; // Kurangi nilai karakter tertentu }
Setelah waktu alarm disetel, pengguna akan menekan tombol tengah lagi. Kemudian kita dapat mulai membandingkan waktu saat ini dengan waktu yang ditentukan. Perbandingan dengan memeriksa apakah setiap karakter waktu saat ini sama dengan karakter waktu yang ditetapkan. Jika nilainya sama maka kita memicu alarm dengan mengatur variabel trigger_alarm lain kita hanya membandingkan sampai sama.
// JIKA alarm disetel Periksa apakah nilai yang disetel sama dengan nilai saat ini jika (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1; // Aktifkan pemicu jika nilainya cocok
Jika alarm disetel, kita harus membunyikan bel untuk memperingatkan pengguna tentang alarm. Ini dapat dilakukan hanya dengan mengaktifkan Buzzer secara berkala seperti yang ditunjukkan di bawah ini.
if (trigger_alarm) {// Jika alarm terpicu // Bip bel BUZZ = 1; __delay_ms (500); BUZZ = 0; __delay_ms (500); }
Simulasi:
Program ini juga dapat disimulasikan menggunakan software proteus. Cukup buat ulang sirkuit yang ditunjukkan di atas dan muat file hex ke PIC. Kode hex untuk proyek ini dapat ditemukan di file ZIP yang ditautkan di sini. Tangkapan layar yang diambil selama simulasi ditampilkan di bawah ini
Simulasi menjadi sangat berguna saat Anda mencoba menambahkan fitur baru ke proyek. Anda juga dapat menggunakan modul debugger I2C untuk memeriksa data apa yang masuk dan keluar melalui bus I2C. Anda dapat mencoba menekan tombol dan juga mengatur waktu alarm. Ketika waktu yang ditentukan sama dengan waktu saat ini maka bel akan berbunyi tinggi.
Cara Kerja Jam Alarm Digital menggunakan PIC16F877A:
Bangun sirkuit di papan tempat memotong roti, dapatkan kode dari tautan unduhan dan kompilasi menggunakan kompiler MplabX dan XC8. Jika Anda telah mengunduh kode dari file ZIP yang disediakan di sini, maka Anda seharusnya tidak memiliki masalah dalam mengompilasinya karena file header sudah dilampirkan.
Setelah menyusun, unggah program ke perangkat keras Anda menggunakan pemrogram PicKit3. Koneksi untuk menghubungkan programmer pickit ke PIC IC juga ditunjukkan pada diagram rangkaian. Setelah program diunggah, Anda akan melihat layar intro dan waktu yang ditampilkan Anda dapat menggunakan tombol tekan untuk mengatur waktu alarm. Pengaturan perangkat keras saya saat dinyalakan terlihat seperti ini di bawah ini.
Ketika waktu alarm cocok dengan waktu saat ini, bel akan mulai berbunyi bip untuk memperingatkan pengguna. Pekerjaan lengkap dapat ditemukan di video di bawah ini. Proyek ini memiliki banyak sekali pilihan untuk dikembangkan. Modul RTC dapat melacak waktu dan tanggal kapan saja, sehingga Anda dapat melakukan tugas terjadwal kapan saja / tanggal yang diperlukan. Anda juga dapat menyambungkan peralatan AC seperti kipas atau lampu dan menjadwalkannya untuk AKTIF atau MATI jika diperlukan. Masih banyak lagi yang dapat Anda bangun dari proyek ini, beri tahu saya ide apa yang muncul di benak Anda sebagai peningkatan proyek ini dan saya akan senang mendengarnya dari Anda.
Semoga Anda memahami proyek tersebut dan mempelajari sesuatu yang bermanfaat dari proses tersebut. Jika Anda ragu dalam proyek ini, gunakan bagian komentar untuk mempostingnya atau gunakan forum untuk bantuan teknis.
Kode PIC lengkap dengan file header dapat ditemukan di sini