Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Jam Array 7-Segmen

Komponen dan persediaan

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
Jam Waktu Nyata (RTC)
Beli "DS1302 Real Time Clock Module for Arduino" dan lepas solder soket ic dan kristalnya.
× 1
Baterai dan dudukan CR1220
Search for "5pcs,Black Housing CR1220 CR1225 Button Cell Battery Socket Holder BS-1220-1"
× 1
Kapasitor 0.1uf 1206 SMD
× 1
Kapasitor 10uF 1206 SMD Keramik
× 1
Saklar Taktil, Digerakkan Atas
varian 12mm dengan atasan kancing
× 4
Modul Konverter Step Down Mini DC-DC 3A
× 1
0,28in Common Cathode 4 Digit 7 Segment Display
× 36
IC DIP MAX7219
× 18
Buzzer
× 1
Header mesin
Anda membutuhkan header pria dan wanita - biasanya terdiri dari 40 strip sehingga Anda akan mendapatkan 8 strip pria pin mesin dan 8 strip soket mesin wanita
× 1
soket listrik DC
Search for "12V DC Power Supply Jack Socket Female Panel Mount Connector 5.5 x 2.ODZ2"
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)
Printer 3D (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Saat menjelajahi Hackaday.io, saya menemukan jam cantik yang dibuat dengan susunan tampilan 7-segmen oleh Frugha. Saya benar-benar ingin membuat ini tetapi versi Frugha cukup besar karena menggunakan tampilan 7-segmen 0,56". Desain saya menggunakan tampilan 7-segmen 0,28" sehingga ukurannya hanya seperempat.

Perangkat lunak ini telah ditulis ulang untuk menggabungkan jam alarm dan layar konfigurasi untuk mengatur waktu, tanggal, dan alarm.

Video

Layar konfigurasi

Jam dikendalikan oleh empat tombol. Tombol SELECT (paling atas) akan menampilkan layar konfigurasi. Pilihan saat ini akan berkedip. Menekan tombol PILIH lagi akan menggilir bagian konfigurasi yang berbeda (yaitu Waktu, Tanggal, Alarm, Nada, Kecerahan, Format Tanggal, dan Jam).

Menekan tombol ENTER (ke-2 dari atas) saat salah satu item menu dipilih akan memungkinkan Anda mengubah pengaturannya. Di mana ada lebih dari satu pengaturan untuk item menu, tombol ENTER akan berputar di antara mereka. Pengaturan aktif akan berkedip.

Saat pengaturan berkedip, tombol ATAS dan BAWAH (dua tombol bawah) akan mengubah pengaturan.

Layar tanggal

Menekan tombol ENTER (ke-2 dari atas) saat jam ditampilkan akan menampilkan layar tanggal selama lima detik.

Bagian Format Tanggal pada layar konfigurasi memungkinkan Anda untuk mengatur format tanggal (DD-MM atau MM-DD) dan font yang digunakan.

Pertimbangan desain

Untuk sekadar desain papan, versi saya menggunakan tampilan 4 digit daripada tampilan satu digit yang digunakan dalam versi aslinya. Karena layar 0,28" berukuran kecil, saya harus meletakkan chip MAX7219 di papan terpisah. Untuk sekadar memasang kabel, pin header jantan dan betina mesin digunakan untuk menghubungkan papan,

File Eagle telah disertakan jika Anda ingin membuat papan secara komersial atau melakukan seperti yang saya lakukan dan membuatnya sendiri. Saya menggunakan metode Toner dalam membuat milik saya.

Papan kolom

Enam papan kolom yang menampung semua pajangan perlu dibuat. Saat menyolder header mesin pria, mulailah dengan set tengah dan kerjakan ke tepi luar. Gunakan batang korek api atau sejenisnya untuk mengangkat soket dengan cukup sehingga Anda dapat menyolder pin dengan mudah. Gunakan besi solder kecil dengan ujung halus dan solder 0,5 mm.

Setelah Anda membuat modul kolom, saya sarankan Anda mengecat batas tampilan dengan cat hitam matt. Ini akan menghentikan tampilan tepi putih jika tampilan tidak sejajar sempurna dengan tetangganya. Juga menggunakan spidol, beri nomor setiap modul kolom. Ini membantu ketika mereka dimasukkan ke motherboard MAX7219.

Motherboard MAX7219

Saat mendesain motherboard dan papan kolom, saya tidak memetakan segmen atau digit MAX7219 yang benar ke pin tampilan yang sesuai. Saya ingin membuat tata letak PCB sesederhana mungkin dan menyesuaikan untuk setiap perbedaan dalam perangkat lunak.

Saya merekomendasikan ketika datang ke soket mesin perempuan bahwa Anda menempatkannya pada pin laki-laki dari papan kolom terlebih dahulu dan kemudian menyolder rakitan di tempat saat mereka terhubung. Ini berarti pin kolom akan sejajar persis dengan soket yang sesuai. Jika Anda perlu menghapusnya, memberi nomor modul kolom akan memastikan mereka kembali ke posisi yang sama.

Dewan MPU

Papan mikroprosesor berisi semua komponen lainnya. Empat tombol dan dua kapasitor SMD dipasang di bagian belakang papan dan semua komponen lainnya dipasang di bagian depan papan. Untuk menjaga agar tetap low profile, pin header FTDI yang biasanya disolder ke Arduino Pro Mini kini disolder langsung ke PCB. Dua kabel dari pin DTR dan VCC langsung turun ke PCB.

Membuat kasus

File STL untuk depan dan belakang telah disertakan. Keduanya dicetak menggunakan tinggi lapisan 0,2 dan pinggiran. Bagian depan juga memiliki dukungan yang diaktifkan yang hanya menyentuh pelat build.

Motherboard MAX7219 dengan modul kolomnya meluncur dari depan. Jika dirasa agak longgar, gunakan satu atau dua lapis selotip sebagai pembungkus.

Papan MPU terpaku panas di bagian belakang.

Perangkat Lunak

Perangkat lunak ini mengharuskan perpustakaan MD_MAX72XX telah diinstal di Arduino IDE Anda. Saya telah menyediakan sketsa Hardware_Test_V1 saya untuk pengujian. Ini akan menerangi setiap segmen sehingga Anda dapat memeriksa hubungan pendek atau kabel yang rusak. Setelah tampilan berfungsi, unggah sketsa Clock_V4.

Kode

  • Jam_V4.ino
  • Digit.h
  • Tunes.h
  • Tombol.h
  • Tombol.cpp
  • Hardware_Test_V1.zip
Clock_V4.inoC/C++
/*-------------------------------------------------------- ------ * Jam array 7 segmen * * Berdasarkan jam oleh Frugha (https://hackaday.io/project/169632-7-segment-display-array-clock) * * Modifikasi oleh John Bradnam (jbrad2089@ gmail.com) * - Mengubah perangkat keras untuk menggunakan tampilan 7 segmen 0,28 ". * - Perangkat MAX7219, urutan digit dan segmen telah diubah menjadi hanya * perutean papan PCB yang rumit. * - Perangkat keras menggunakan Arduino Mini Pro, DS1302 RTC dan 4 tombol tekan * - Menambahkan fungsi Alarm dengan usic alarm yang dapat dipilih * - Menambahkan pengaturan Kecerahan * - Menambahkan layar Pengaturan untuk mengatur waktu, tanggal, alarm, musik, dan kecerahan * - Menambahkan layar Tanggal (ditampilkan selama dua detik saat tombol ENTER ditekan * Perbarui 2020 -06-16 * - Menambahkan opsi format tanggal pada layar konfigurasi * - Meningkatkan batas waktu layar tanggal dari 2 menjadi 5 detik * - Menambahkan pilihan font yang dapat dikonfigurasi untuk tampilan tanggal *-------------- ------------------------------------*/ #include #include #termasuk # include #include #include "button.h"#include "Tunes.h"#include "Digits.h"#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW#define MAX_DEVICES 18#define LED_CLK 13 / / atau SCK (WHI)#define LED_DATA 11 // atau MOSI (BRN)#define LED_CS 10 // atau SS (YEL)#define SPEAKER 2#define SW_UP 3#define SW_DOWN 4#define RTC_CLK 5#define RTC_IO 6#define SW_ENTER 7#menentukan RTC_CE 8#menentukan SW_SELECT 9DS1302RTC rtc(RTC_CE, RTC_IO, RTC_CLK);// antarmuka perangkat keras SPIMD_MAX72XX mx =MD_MAX72XX(HARDWARE_TYPE, LED_CS, MAXPEXX_DEVICES);// Sewenang-wenang LED_CLK, LED_CS, MAX_DEVICES);//penanganan EEPROM#define EEPROM_ADDRESS 0#define EEPROM_MAGIC 0x0BAD0DADtypedef struct { uint32_t magic; tanda bahaya; uint8_t menit; uint8_t jam; format bool12hr; kecerahan uint8_t; lagu uint8_t; format boolDmy; bool squareFont;} EEPROM_DATA;EEPROM_DATA EepromData; //Pengaturan EEPROM saat inivoid clockButtonPressed(void);void enterButtonPressed(void);void downButtonPressed(void);void upButtonPressed(void);Tombol* clockButton;Button* enterButton;Button* downButton;Button* upButton;//Mode operasibool diSubMenu =false;#define SETUP_FLASH_RATE 200;unsigned long setupTimeout;bool setupDisplayState =false;enum ClockButtonModesEnum { CLOCK, TIME_SET, DATE_SET, ALARM_SET, TUNE_SET, BRIGHT_SET, FORMAT_SET };ClockButtonModes TIME_Menu TIME, TIME_Setel, TIME, TIME, TIME_Menu, TIME =CLO. timeSetMode =TIME_HOUR; enum DateSetMenuEnum {DATE_YEAR, DATE_MONTH, DATE_DAY}; DateSetMenuEnum dateSetMode =DATE_YEAR; enum AlarmSetMenuEnum {ALARM_HOUR, ALARM_MIN, ALARM_STATE}; AlarmSetMenuEnum alarmSetMode =ALARM_HOUR; enum FormatSetMenuEnum {DAY_MONTH, FONT_STYLE}; FormatSetMenuEnum formatSetMode =DAY_MONTH; int lastSeconds =-1;bool alarmRinging =false; //true saat alarm aktif alarmCancelled =false; //alarm dibatalkan oleh userbool musicPlaying =false; //true jika memainkan songbool clockColon =false; //tampilkan/sembunyikan colonint8_t dom[] ={31,28,31,30,31,30,31,31,30,31,30,31};tmElements_t newTime; //Digunakan untuk menyimpan pengaturan timevoid baru(){ Serial.begin(115200); //Eprom readEepromData(); //Inisialisasi tombol clockButton =Tombol baru(SW_SELECT); enterButton =Tombol baru(SW_ENTER); downButton =Tombol baru(SW_DOWN); downButton->Repeat(downButtonPressed); upButton =Tombol baru(SW_UP); upButton->Ulangi(upButtonPressed); //Inisialisasi pinMode suara(SPEAKER,OUTPUT); mx.mulai(); mx.control(MD_MAX72XX::INTENSITY, EepromData.brightness); //0..MAX_INTENSITY mx.update(MD_MAX72XX::OFF); //Tidak ada pembaruan otomatis setSyncProvider(rtc.get); // fungsi untuk mendapatkan waktu dari RTC if(timeStatus() !=timeSet) { Serial.println("RTC Sync Bad"); newTime.Tahun =KalenderYrToTm(2020); waktu baru.Bulan =5; newTime.Hari =30; newTime.Jam =14; waktu baru.Menit =53; newTime.Second =0; waktu_t t =makeTime(Waktu baru); setWaktu(t); rtc.set(t); if (rtc.set(t) !=0) { Serial.println("Pengaturan Waktu Gagal"); } } newTime.Tahun =KalenderYrToTm(tahun()); newTime.Bulan =bulan(); newTime.Hari =hari(); newTime.Jam =jam(); newTime.Minute =menit(); newTime.Second =detik(); Serial.println("Waktu:" + String(Waktu baru.Jam) + ":" + String(Waktu baru.Menit) + ":" + String(Waktubaru.Second)); Serial.println("Tanggal:" + String(NewTime.Day) + "/" + String(newTime.Month) + "/" + String(tmYearToCalendar(newTime.Year))); clockMode =JAM; showTime(true);}void loop(){ testButtons(); if (Mode jam ==JAM) { showTime(false); if (EepromData.alarm &&EepromData.hours ==hour() &&EepromData.minutes ==menit()) { if (!alarmCancelled) { alarmRinging =true; playSong(melodi[EepromData.tune]); } } else { alarmDibatalkan =salah; alarmRinging =salah; } } else { showSetup(salah); } delay(100);}//----------------------------------------- ----------------------//Uji apakah ada tombol yang ditekanvoid testButtons(){ //Tekan sekali tombol if (clockButton->Pressed()) { jamButtonDitekan(); } if (enterButton->Pressed()) { enterButtonPressed(); } //Tidak perlu memeriksa hasil penekanan karena pengendali tombol akan menjalankan fungsi pengulangannya upButton->Pressed(); downButton->Ditekan();}//------------------------------------------------------- -----------------------//Menangani CLOCK bttonvoid clockButtonPressed(){ if (cancelAlarm()) return; inSubMenu =salah; clockMode =(clockMode ==FORMAT_SET) ? CLOCK :(ClockButtonModesEnum)((int)clockMode + 1); if (Mode jam ==JAM) { Serial.println("Menghemat Waktu:" + String(Waktu baru.Jam) + ":" + String(Waktu baru.Menit)); Serial.println(" Dari:" + String(jam()) + ":" + String(menit())); if (NewTime.Year !=CalendarYrToTm(year()) || newTime.Month !=month() || newTime.Day !=day() || newTime.Hour !=hour() || newTime.Minute !=menit()) { //Waktu pembaruan Serial.println("Memperbarui RTC"); newTime.Second =detik(); waktu_t t =makeTime(Waktu baru); setWaktu(t); rtc.set(t); if (rtc.set(t) !=0) { Serial.println("Pengaturan Waktu Gagal"); } } writeEepromData(); showTime(benar); } else { if (Mode jam ==TIME_SET) { Waktu baru.Tahun =KalenderYrToTm(tahun()); newTime.Bulan =bulan(); newTime.Hari =hari(); newTime.Jam =jam(); newTime.Minute =menit(); newTime.Second =detik(); Serial.println("Waktu Pemuatan:" + String(jam()) + ":" + String(menit())); } showSetup(benar); }}//--------------------------------------------- -----------------//Menangani ENTER bttonvoid enterButtonPressed(){ if (cancelAlarm()) return; if (Mode jam !=JAM) { if (!inSubMenu) { timeSetMode =TIME_HOUR; dateSetMode =TANGGAL_YEAR; alarmSetMode =ALARM_HOUR; formatSetMode =DAY_MONTH; inSubMenu =benar; } else { switch (clockMode) { kasus TIME_SET:timeSetMode =(timeSetMode ==TIME_FORMAT) ? TIME_HOUR :(TimeSetMenuEnum)((int)timeSetMode + 1); merusak; kasus DATE_SET:dateSetMode =(dateSetMode ==DATE_DAY) ? DATE_YEAR :(DateSetMenuEnum)((int)dateSetMode + 1); merusak; kasus ALARM_SET:alarmSetMode =(alarmSetMode ==ALARM_STATE) ? ALARM_HOUR :(AlarmSetMenuEnum)((int)alarmSetMode + 1); merusak; kasus FORMAT_SET:formatSetMode =(formatSetMode ==FONT_STYLE) ? DAY_MONTH :(FormatSetMenuEnum)((int)formatSetMode + 1); merusak; } } showSetup(benar); } else { showDate(hari(), bulan(), tahun()); penundaan(5000); }}//--------------------------------------------- -----------------//Menangani BAWAH bttonvoid downButtonPressed(){ if (cancelAlarm()) kembali; switch (clockMode) { case TIME_SET:if (inSubMenu) { switch(timeSetMode) { case TIME_HOUR:newTime.Hour =(newTime.Hour + 24 - 1) % 24; merusak; kasus TIME_MIN:newTime.Minute =(newTime.Minute + 60 - 1) % 60; merusak; kasus TIME_FORMAT:EepromData.format12hr =!EepromData.format12hr; merusak; } showSetup(benar); } merusak; case DATE_SET:if (inSubMenu) { switch(dateSetMode) { case DATE_YEAR:newTime.Year =((newTime.Year - 30 + 100) - 1) % 100 + 30; merusak; kasus DATE_MONTH:newTime.Month =((newTime.Month - 1 + 12) - 1) % 12 + 1; merusak; kasus DATE_DAY:uint8_t md =daysInMonth(newTime.Year, newTime.Month); newTime.Day =((newTime.Day - 1 + md) - 1) % md + 1; merusak; } showSetup(benar); } merusak; case ALARM_SET:if (inSubMenu) { switch(alarmSetMode) { case ALARM_HOUR:EepromData.hours =(EepromData.hours + 24 - 1) % 24; merusak; kasus ALARM_MIN:EepromData.minutes =(EepromData.minutes + 60 - 1) % 60; merusak; kasus ALARM_STATE:EepromData.alarm =!EepromData.alarm; merusak; } showSetup(benar); } merusak; kasus TUNE_SET:EepromData.tune =(EepromData.tune + NUM_OF_MELODIES - 1) % NUM_OF_MELODIES; showSetup(benar); merusak; kasus BRIGHT_SET:EepromData.brightness =(EepromData.brightness + MAX_INTENSITY - 1) % MAX_INTENSITY; mx.control(MD_MAX72XX::INTENSITY, EepromData.brightness); //0..MAX_INTENSITY showSetup(true); merusak; case FORMAT_SET:if (inSubMenu) { switch (formatSetMode) { case DAY_MONTH:EepromData.formatDmy =!EepromData.formatDmy; merusak; kasus FONT_STYLE:EepromData.squareFont =!EepromData.squareFont; merusak; } } showSetup(benar); merusak; }}//--------------------------------------------- -----------------//Tangani UP bttonvoid upButtonPressed(){ if (cancelAlarm()) return; switch (clockMode) { case TIME_SET:if (inSubMenu) { switch(timeSetMode) { case TIME_HOUR:newTime.Hour =(newTime.Hour + 1) % 24; merusak; kasus TIME_MIN:newTime.Minute =(newTime.Minute + 1) % 60; merusak; kasus TIME_FORMAT:EepromData.format12hr =!EepromData.format12hr; merusak; } showSetup(benar); } merusak; case DATE_SET:if (inSubMenu) { switch(dateSetMode) { case DATE_YEAR:newTime.Year =((newTime.Year - 30) + 1) % 100 + 30; merusak; kasus DATE_MONTH:newTime.Month =((newTime.Month - 1) + 1) % 12 + 1; merusak; kasus DATE_DAY:uint8_t md =daysInMonth(newTime.Year, newTime.Month); newTime.Day =(newTime.Day % md) + 1; merusak; } showSetup(benar); } merusak; case ALARM_SET:if (inSubMenu) { switch(alarmSetMode) { case ALARM_HOUR:EepromData.hours =(EepromData.hours + 1) % 24; merusak; kasus ALARM_MIN:EepromData.minutes =(EepromData.minutes + 1) % 60; merusak; kasus ALARM_STATE:EepromData.alarm =!EepromData.alarm; merusak; } showSetup(benar); } merusak; kasus TUNE_SET:EepromData.tune =(EepromData.tune + 1) % NUM_OF_MELODIES; showSetup(benar); merusak; kasus BRIGHT_SET:EepromData.brightness =(EepromData.brightness + 1) % MAX_INTENSITY; mx.control(MD_MAX72XX::INTENSITY, EepromData.brightness); //0..MAX_INTENSITY showSetup(true); merusak; case FORMAT_SET:if (inSubMenu) { switch (formatSetMode) { case DAY_MONTH:EepromData.formatDmy =!EepromData.formatDmy; merusak; kasus FONT_STYLE:EepromData.squareFont =!EepromData.squareFont; merusak; } } showSetup(benar); merusak; }}//--------------------------------------------- -----------------//Matikan alarm jika sedang memutar tunebool cancelAlarm(){ if (musicPlaying) { musicPlaying =false; alarmCancelled =alarmRinging; kembali benar; } menghasilkan(); return false;}//------------------------------------------------------- -------------------//Tampilkan menu Setup dan flash item saat ini yang dipilihvoid showSetup(bool force){ setupDisplayState =setupDisplayState | memaksa; gaya =gaya || (milis()> setupTimeout); if (paksa) { setupTimeout =milis() + SETUP_FLASH_RATE; bool aktif =setupDisplayState; setupDisplayState =!setupDisplayState; mx.clear(); if (on || !(clockMode ==TIME_SET &&!inSubMenu)) displayString(0,7,"TINE"); if (on || !(clockMode ==TIME_SET &&inSubMenu &&timeSetMode ==TIME_HOUR)) displayNumber(0,13,newTime.Hour,2,true); if (on || !(clockMode ==TIME_SET &&inSubMenu &&timeSetMode ==TIME_MIN)) displayNumber(0,16,newTime.Minute,2,true); if (on || !(clockMode ==TIME_SET &&inSubMenu &&timeSetMode ==TIME_FORMAT)) displayString(0,19,(EepromData.format12hr) ? "12HR" :"24HR"); if (on || !(clockMode ==DATE_SET &&!inSubMenu)) displayString(1,7,"DATE"); if (on || !(clockMode ==DATE_SET &&inSubMenu &&dateSetMode ==DATE_YEAR)) displayNumber(1,13,tmYearToCalendar(newTime.Year),4,true); if (pada || !(clockMode ==DATE_SET &&inSubMenu &&dateSetMode ==DATE_MONTH)) displayNumber(1,18,newTime.Month,2,true); if (pada || !(clockMode ==DATE_SET &&inSubMenu &&dateSetMode ==DATE_DAY)) displayNumber(1,21,newTime.Day,2,true); if (on || !(clockMode ==ALARM_SET &&!inSubMenu)) displayString(2,6,"ALARN"); if (on || !(clockMode ==ALARM_SET &&inSubMenu &&alarmSetMode ==ALARM_HOUR)) displayNumber(2,13,EepromData.hours,2,true); if (on || !(clockMode ==ALARM_SET &&inSubMenu &&alarmSetMode ==ALARM_MIN)) displayNumber(2,16,EepromData.minutes,2,true); if (on || !(clockMode ==ALARM_SET &&inSubMenu &&alarmSetMode ==ALARM_STATE)) displayString(2,19,(EepromData.alarm) ? "ON" :"OFF"); if (on || !(clockMode ==TUNE_SET &&!inSubMenu)) displayString(3,7,"TUNE"); if (on || !(clockMode ==TUNE_SET &&inSubMenu)) { switch(EepromData.tune) { case 0:displayString(3,13,"ELISE"); merusak; kasus 1:displayString(3,13,"RANGE"); merusak; kasus 2:displayString(3,13,"SUNSHINE"); merusak; } } if (on || !(Mode jam ==BRIGHT_SET &&!inSubMenu)) displayString(4,1,"BRIGHTNESS"); if (on || !(clockMode ==BRIGHT_SET &&inSubMenu)) displayNumber(4,13,EepromData.brightness,0,false); if (on || !(clockMode ==FORMAT_SET &&!inSubMenu)) displayString(5,0,"DATE ​​FORNAT"); if (on || !(clockMode ==FORMAT_SET &&inSubMenu &&formatSetMode ==DAY_MONTH)) displayString(5,13,(EepromData.formatDmy) ? "DD-NN" :"NN-DD"); if (on || !(clockMode ==FORMAT_SET &&inSubMenu &&formatSetMode ==FONT_STYLE)) displayString(5,19,(EepromData.squareFont) ? "FONT1" :"FONT2"); mx.update(); }}//--------------------------------------------- ------------------//Menampilkan waktu saat ini pada tampilan jika diubah// force - selalu menunjukkan waktu meskipun tidak diubahvoid showTime(bool force){ force =force || (detik terakhir !=detik()); if (paksa) { lastSeconds =second(); showTime(hour(), minute(), true, true, (second() &0x01), (clockMode !=CLOCK || !EepromData.format12hr)); }}//--------------------------------------------- ------------------//Menampilkan waktu di layar// h - jam// m - menit// he - jam aktifkan // saya - menit aktifkan // ce - titik dua aktifkan void showTime(int h, int m, bool he, bool me, bool ce, bool f24){ mx.clear(); if (dia) { if (!f24 &&h> 12) { h =h - 12; } if (h> 9 || f24) { displayLargeDigit(0, h / 10); } displayLargeDigit(5, h % 10); } if (saya) { displayLargeDigit(13, m / 10); displayLargeDigit(18, m % 10); } if (ce) { displayLargeDigit(11, 10); } mx.update();}//---------------------------------------- -----------------------void showDate(int d, int m, int y){ #define XOFS 3 mx.clear(); if (EepromData.formatDmy) { displayDateDigit(XOFS+0, d / 10); displayDateDigit(XOFS+4, d % 10); displayDateDigit(XOFS+8, 10); //tampilan titik duaDateDigit(XOFS+12, m / 10); displayDateDigit(XOFS+16, m % 10); } else { displayDateDigit(XOFS+0, m / 10); displayDateDigit(XOFS+4, m % 10); displayDateDigit(XOFS+8, 10); //tampilan titik duaDateDigit(XOFS+12, d / 10); displayDateDigit(XOFS+16, d % 10); } displayNumber(5, 10, y, 0, salah); mx.update();}//----------------------------------------- -----------------------// Tulislah angka persegi atau kecil berdasarkan pengaturan konfigurasi // x =0 hingga 23 // v =angka besar atau persegi untuk display (0..10)void displayDateDigit(uint8_t x, uint8_t v){ if (EepromData.squareFont) { displaySquareDigit(x, v); } else { tampilanSmallDigit(x, v); }}//--------------------------------------------- ------------------// Tulis segmen bit mask// x =0 hingga 23// v =digit besar untuk ditampilkan (0..10)void displayLargeDigit(uint8_t x , uint8_t v){ if (x <24 &&v <11) { for (uint8_t baris =0; baris <6; baris++) { for (uint8_t col =0; col <6; col++) { writePhysicalDigit(baris, col + x, pgm_read_byte(&largeDigits[v][row][col]), false); } } }}//-------------------------------------------- -------------------// Tulis segmen bit mask// x =0 hingga 23// v =digit besar untuk ditampilkan (0..10)void displaySmallDigit( uint8_t x, uint8_t v){ if (x <24 &&v <11) { for (uint8_t baris =0; baris <5; baris++) { for (uint8_t col =0; col <3; col++) { writePhysicalDigit(baris, col + x, pgm_read_byte(&smallDigits[v][row][col]), false); } } }}//-------------------------------------------- -------------------// Tulis segmen bit mask// x =0 hingga 23// v =digit besar untuk ditampilkan (0..10)void displaySquareDigit( uint8_t col, uint8_t v){ //Urutan segmen defbca _ g uint8_t mask =ascii[v]; if (masker ==B00000000) { //topeng tanda hubung =B00000001; } if (masker &B000000100) { //seg A writePhysicalDigit(0, col + 0, 0xff, false); writePhysicalDigit(0, col + 1, 0xff, false); writePhysicalDigit(0, col + 2, 0xff, false); } if (masker &B00010000) { //seg B writePhysicalDigit(0, col + 2, 0xff, false); writePhysicalDigit(1, col + 2, 0xff, false); writePhysicalDigit(2, col + 2, 0xff, false); } if (masker &B00001000) { //seg C writePhysicalDigit(2, col + 2, 0xff, false); writePhysicalDigit(3, col + 2, 0xff, false); writePhysicalDigit(4, col + 2, 0xff, false); } if (masker &B10000000) { //seg D writePhysicalDigit(4, col + 0, 0xff, false); writePhysicalDigit(4, col + 1, 0xff, false); writePhysicalDigit(4, col + 2, 0xff, false); } if (masker &B01000000) { //seg C writePhysicalDigit(2, col, 0xff, false); writePhysicalDigit(3, col, 0xff, false); writePhysicalDigit(4, col, 0xff, false); } if (masker &B00100000) { //seg E writePhysicalDigit(0, col, 0xff, false); writePhysicalDigit(1, col, 0xff, false); writePhysicalDigit(2, col, 0xff, false); } if (masker &B00000001) { //seg D writePhysicalDigit(2, col + 0, 0xff, false); writePhysicalDigit(2, col + 1, 0xff, false); writePhysicalDigit(2, col + 2, 0xff, false); }}//--------------------------------------------- -----------------// Tulis string karaktersuint8_t displayString(uint8_t baris, uint8_t col, String s){ for (int i =0; i  0x5F) { c =0x3F; //Digunakan sebagai karakter spasi } c =c - 0x30; writePhysicalDigit(baris, kolom, ascii[c], benar); kol =kol + 1; }}//--------------------------------------------- -----------------// Tulis angkauint8_t displayNumber(baris uint8_t, uint8_t col, int number, int padding, bool leadingZeros){ if (padding ==0) { padding =(angka> 0) ? lantai(log10(angka)) + 1 :1; } col =col + bantalan; bool dulu =benar; for (int i =0; i > 2) * 3 + (baris>> 1); uint16_t c =((uint16_t)dev <<3) | digitPeta[gali]; if (!hapus) { v =v | mx.getColumn(c); } mx.setColumn(c, v); }}//--------------------------------------------- -----------------//Mengembalikan hari dalam tahun dan bulan tertentu//Feb memiliki 28 kecuali tahun kabisat atau pergantian abad8_t hariDalamBulan(int y, int m) { kembali dom[m - 1] + ((m ==2 &&(y % 4) ==0 &&(y % 100) !=0) ? 1 :0);}//------- -------------------------------------------------- ------//Tulis struktur EepromData ke EEPROMvoid writeEepromData(){ //Fungsi ini menggunakan EEPROM.update() untuk melakukan penulisan, jadi tidak menulis ulang nilainya jika tidak berubah. EEPROM.put(EEPROM_ADDRESS,EepromData);}//-------------------------------------- -------------------------//Baca struktur EepromData dari EEPROM, inisialisasi jika perluvoid readEepromData(){ //Eprom EEPROM.get(EEPROM_ADDRESS, EepromData); //Serial.println("ajaib:" + String(EepromData.magic, 16) + ", alarm:" + String(EepromData.alarm) + ", waktu:" + String(EepromData.hours) + ":" + String(EepromData.minutes) + ", 12hr:" + String(EepromData.format12hr) + ", kecerahan:" + String(EepromData.brightness)); if (EepromData.magic !=EEPROM_MAGIC) { Serial.println("Menginisialisasi EEPROM ..."); EepromData.magic =EEPROM_MAGIC; EepromData.alarm =salah; EepromData.menit =30; EepromData.jam =5; EepromData.format12hr =salah; EepromData.brightness =8; EepromData.tune =0; EepromData.formatDmy =salah; writeEepromData(); } Serial.println("alarm:" + String(EepromData.alarm) + ", waktu:" + String(EepromData.hours) + ":" + String(EepromData.minutes) + ", 12hr:" + String(EepromData .format12hr) + ", kecerahan:" + String(EepromData.brightness));}//----------------------------------------- ----------------------------------//Memutar melodiint playSong(const uint16_t* melody){ //Play setiap nada dalam melodi sampai nada END_OF_TUNE ditemukan musicPlaying =true; int Catatan ini =0; uint16_t noteRaw =pgm_read_word(&melody[thisNote++]); while (musicPlaying &¬eRaw !=END_OF_TUNE) { testButtons(); menghasilkan(); playNote(noteRaw); noteRaw =pgm_read_word(&melody[thisNote++]); } //sementara delay(50);}//-------------------------------------- -------------------------//Mainkan satu notvoid playNote(uint16_t noteRaw){ // untuk menghitung durasi not, ambil satu detik dibagi dengan jenis catatan. // misalnya not seperempat =1000 / 4, not kedelapan =1000/8, dst. frekuensi uint16_t =notRaw &0x1FFF; durasi uint16_t =(noteRaw &0xE000)>> 13; jika (durasi ==7) durasi =8; uint16_t noteDuration =1800 / durasi; if (frekuensi !=REST) ​​{ nada(SPEAKER, frekuensi, nadaDurasi); } // untuk membedakan not, atur waktu minimum di antara not tersebut. // durasi not + 30% tampaknya berfungsi dengan baik:uint16_t pauseBetweenNotes =(noteDuration * 13) / 10; delay(jedaAntaraCatatan); if (frekuensi !=REST) ​​{ // menghentikan permainan nada:noTone(SPEAKER); }}
Digits.hC/C++
/*-------------------------------------------------------- ------ * Jam larik 7 Segmen * tentukan setiap digit dalam larik 6x6 byte *----------------------------- ---------------------*/ #pragma once//---------------------- -----------------------------// Standard MAX7219 wiring// Digit order 0,1,2,3,4,5/ *// Segment order _ abcdefg#define _______ B00000000#define __cd___ B00011000#define _bcde_g B00111101#define abcdefg B01111111#define __cdefg B00011111#define __c____ B00010000#define ab__efg B01100111#define abcd_fg B01111011#define abcde_g B01111101#define ab_defg B01101111#define _bc____ B00110000#define a__defg B01001111#define ____ef_ B00000110#define ___defg B00001111#define abc__fg B01110011#define a___ef_ B01000110#define _b_____ B00100000#define ab___f_ B01100010#define _bcd___ B00111000#define a___ef_ B01000110#define ab_____ B01100000#define ____e__ B00000100#define __cde_g B00011101# define a____f_ B01000010#define a_cdefg B01011111#define ___de__ B00001100#define _____f_ B00000 010#define ab___fg B01100011#define a__def_ B01001110#define __cde__ B00011100#define a___efg B01000111#define a__d___ B01001000#define abc____ B01110000#define _bc_ef_ B00110110#define ___def_ B00001110#define abc_ef_ B01110110#define _bcdef_ B00111110#define a__def_ B01001110#define abcd___ B01111000*///Segment order d e f b c a _ g#define _______ B00000000#define __cd___ B10001000#define _bcde_g B11011001#define abcdefg B11111101#define __cdefg B11101001#define __c____ B00001000#define ab__efg B01110101#define abcd_fg B10111101#define abcde_g B11011101#define ab_defg B11110101#define _bc____ B00011000#define a__defg B11100101#define ____ef_ B01100000#define ___defg B11100001#define abc__fg B00111101#define a___ef_ B01100100#define _b_____ B00010000#define ab___f_ B00110100#define _bcd___ B10011000#define a___ef_ B01100100#define ab_____ B00010100#define ____e__ B01000000#define __cde_g B11001001#define a____f_ B00100100#define a_cdefg B11101101#define ___de__ B11000000#define _____f _ B00100000#define ab___fg B00110101#define a__def_ B11100100#define __cde__ B11001000#define a___efg B01100101#define a__d___ B10000100#define abc____ B00011100#define _bc_ef_ B01111000#define ___def_ B11100000#define abc_ef_ B01111100#define _bcdef_ B11111000#define a__def_ B11100100#define abcd___ B10011100//Square Numbers//ASCII Character Set//Numbers 0 - 9//Letters A - Z//Segment order d e f b c a _ guint8_t ascii[] ={ B11111100, B00011000, B11010101, B10011101, B00111001, B10101101, B11101101, B00011100, B11111101, B10111101, B00000000, B00000000, B00000000, B00000001, B00000000, B00000000, B00000000, B01111101, B11101001, B11100100, B11011001, B11100101, B01100101, B10111101, B01111001, B00011000, B11011000, B00000000, B11100000, B00000000, B01001001, B11001001, B01110101, B00000000, B01000001, B10101101, B11100001, B11001000, B00000000, B00000000, B00000000, B10111001, B00000000, B11001100, B01010001, B10011100, B00000000, B10000000};//Digit sequence for each device (MAX7219)u int8_t digitMap[] ={5, 2, 6, 4, 1, 7, 3, 0};//------------------------------------------------------------// Digits using logical coordinates//------------------------------------------------------------const int8_t largeDigits[11][6][6] PROGMEM ={ { //0 { _______, _______, __cd___, _bcde_g, abcdefg, __cdefg }, { _______, __c____, abcdefg, ab__efg, abcd_fg, abcdefg }, { _______, abcde_g, ab_defg, _______, _bc____, a__defg }, { _______, abcdefg, ____ef_, __c____, abcdefg, ____ef_ }, { _______, abcdefg, __cdefg, abcdefg, a___efg, _______ }, { _______, abc__fg, abcdefg, ab__efg, _______, _______ } }, { //1 { _______, _______, _______, __c____, abcdefg, __cdefg }, { _______, _______, _______, abcdefg, abcdefg, ____ef_ }, { _______, _______, _bcde_g, abcdefg, a__defg, _______ }, { _______, _bc____, abcdefg, abcdefg, ____ef_, _______ }, { _______, abcdefg, abcdefg, a___ef_, _______, _______ }, { _b_____, abcdefg, abcdefg, _______, _______, _______ } }, { //2 { _______, _______, __cd___, _b cde_g, abcdefg, __cdefg }, { _______, _bc____, abcdefg, ab___f_, abcd_fg, abcdefg }, { _______, _______, _______, _bcd___, abcdefg, a___ef_ }, { _______, _______, _bcde_g, abcdefg, a___ef_, _______ }, { __c____, abcdefg, abcdefg, a___ef_, _______, _______ }, { _b_____, abc__fg, abcdefg, abcdefg, ab__efg, _______ } }, { //3 { _______, _______, __cd___, abcdefg, abcdefg, __cdefg }, { _______, _b_____, abcdefg, ab___f_, abcd_fg, abcdefg }, { _______, _______, __cd___, _bcde_g, abcdefg, a___ef_ }, { _______, _______, ab_____, abc__fg, abcdefg, ____e__ }, { _______, __cd___, __cde_g, _bcde_g, abcdefg, ____ef_ }, { _b_____, abc__fg, abcdefg, abcdefg, a____f_, _______ } }, { //4 { _______, _______, _bcd___, abcdefg, __c____, abcdefg }, { _______, __c____, abcdefg, a___ef_, abcde_g, a__defg }, { _______, abcde_g, abcdefg, _bcd___, abcdefg, ____ef_ }, { __c____, abcdefg, abcdefg, abcdefg, abcdefg, _______ }, { _______, _______, __c____, abcdefg, ____ef_, _______ }, { _______, _______, abcdefg, ab__efg, _______, _______ } }, { //5 { _______, _______, _bcde_g, abcdefg, abcdefg, abcdefg }, { _______, _bc____, abcdefg, a_cdefg, ___de__, _______ }, { _______, _______, abc__fg, abcdefg, abcdefg, ____ef_ }, { _______, _______, _______, _bc____, abcdefg, ____ef_ }, { _______, __cde_g, __cde_g, _bcde_g, abcdefg, _____f_ }, { _b_____, abcdefg, abcdefg, ab__efg, a____f_, _______ } }, { //6 { _______, _______, _______, __cd___, abcdefg, ____ef_ }, { _______, _______, _bcde_g, abcdefg, a____f_, _______ }, { _______, _bcd___, abcdefg, abcdefg, abcdefg, ____e__ }, { __c____, abcdefg, a___ef_, ab_____, abcdefg, ____ef_ }, { _bc____, abcdefg, __cdefg, _bcde_g, abcdefg, _______ }, { _______, abc__fg, abcdefg, ab__efg, _______, _______ } }, { //7 { _______, _bc____, abcdefg, abcdefg, abcdefg, __cdefg }, { _______, _b_____, ab___fg, ab___fg, abcdefg, abcdefg }, { _______, _______, _______, _bcde_g, abcdefg, a___ef_ }, { _______, _______, _bcde_g, abcdefg, ab__efg, _______ }, { _______, _bcde_g, abcdefg, a___ef_, _______, _______ }, { _b_____, abcdefg, abcdefg, _______, _______, _______ } }, { //8 { _______, _______, __cd___, abcdefg, abcdefg, __cdefg }, { _______, _bc____, abcdefg, ab___f_, abcd_fg, abcdefg }, { _______, _b_____, abcdefg, _bcde_g, abcdefg, a___ef_ }, { _______, _bcde_g, ab__efg, abc__fg, abcdefg, ____e__ }, { _bc____, abcdefg, __cde_g, _bcde_g, abcdefg, ____ef_ }, { _______, abc__fg, abcdefg, abcdefg, a____f_, _______ } }, { //9 { _______, _______, __cde_g, abcdefg, __cdefg, ___de__ }, { _______, _bcd___, abcdefg, ab___fg, abcd_fg, abcdefg }, { _______, abcdefg, a_cdefg, __cde__, abcdefg, a__defg }, { _______, ab_____, abcd_fg, abcdefg, abcdefg, _____f_ }, { _______, __cd___, abcdefg, ab__efg, _______, _______ }, { _b_____, abcdefg, a___ef_, _______, _______, _______ } }, { //Colon { _______, _______, _______, _______, _______, _______ }, { _______, __cde_g, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, _______ }, { ___ ____, _______, _______, _______, _______, _______ }, { __cde_g, _______, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, _______ } }};const int8_t smallDigits[11][5][3] PROGMEM ={ { //0 { a___ef_, a__d___, abc____ }, { _bc_ef_, _______, _bc_ef_ }, { _bc_ef_, _______, _bc_ef_ }, { _bc_ef_, _______, _bc_ef_ }, { ___def_, a__d___, _bcd___ } }, { //1 { _______, abc_ef_, _______ }, { _______, _bc_ef_, _______ }, { _______, _bc_ef_, _______ }, { _______, _bc_ef_, _______ }, { _______, _bcdef_, _______ } }, { //2 { a__def_, a__d___, abc____ }, { _______, _______, _bc_ef_ }, { a___ef_, a__d___, _bcd___ }, { _bc_ef_, _______, _______ }, { ___def_, a__d___, abcd___ } }, { //3 { a__def_, a__d___, abc____ }, { _______, _______, _bc_ef_ }, { _______, a__def_, _bc____ }, { _______, _______, _bc_ef_ }, { a__def_, a__d___, _bcd___ } }, { //4 { abc_ef_, _______, abc_ef_ }, { _bc_ef_, _______, _bc_ef_ }, { ___def_, a__d___, _bc____ }, { _______, _______, _bc_ef_ }, { _______, _______, _bcdef_ } }, { //5 { a___ef_, a__d___, abcd___ }, { _bc_ef_, _______, _______ }, { ___def_, a__d___, abc____ }, { _______, _______, _bc_ef_ }, { a__def_, a__d___, _bcd___ } }, { //6 { a___ef_, a__d___, abcd___ }, { _bc_ef_, _______, _______ }, { ____ef_, a__d___, abc____ }, { _bc_ef_, _______, _bc_ef_ }, { ___def_, a__d___, _bcd___ } }, { //7 { a__def_, a__d___, abc____ }, { _______, _______, _bc_ef_ }, { _______, _bc_ef_, _______ }, { _______, _bc_ef_, _______ }, { _______, _bcdef_, _______ }, }, { //8 { a___ef_, a__d___, abc____ }, { _bc_ef_, _______, _bc_ef_ }, { ____ef_, a__d___, _bc____ }, { _bc_ef_, _______, _bc_ef_ }, { ___def_, a__d___, _bcd___ } }, { //9 { a___ef_, a__d___, abc____ }, { _bc_ef_, _______, _bc_ef_ }, { ___def_, a__d___, _bc____ }, { _______, _______, _bc_ef_ }, { a__def_, a__d___, _bcd___ } }, { //Hyphen { _______, _______, _______ }, { _______, _______, _______ }, { a__def_, a__d___, abcd___ }, { _______, _______, _______ }, { _______, _____ __, _______ } }};
Tunes.hC/C++
Tidak ada pratinjau (hanya unduhan).
Button.hC/C++
/*Class:ButtonAuthor:John Bradnam ([email protected])Purpose:Arduino library to handle buttons*/#pragma once#include "Arduino.h"#define DEBOUNCE_DELAY 10//Repeat speed#define REPEAT_START_SPEED 500#define REPEAT_INCREASE_SPEED 50#define REPEAT_MAX_SPEED 50class Button{ public://Simple constructor Button(int pin); Button(int name, int pin); Button(int name, int pin, int analogLow, int analogHigh, bool activeLow =true); //Background function called when in a wait or repeat loop void Background(void (*pBackgroundFunction)()); //Repeat function called when button is pressed void Repeat(void (*pRepeatFunction)()); //Test if button is pressed bool IsDown(void); //Test whether button is pressed and released //Will call repeat function if one is provided bool Pressed(); //Return button state (HIGH or LOW) - LOW =Pressed int State(); //Return button name int Name(); private:int _name; int _pin; bool _range; int _low; int _high; bool _activeLow; void (*_repeatCallback)(void); void (*_backgroundCallback)(void);};
Button.cppC/C++
/*Class:ButtonAuthor:John Bradnam ([email protected])Purpose:Arduino library to handle buttons*/#include "Button.h"Button::Button(int pin){ _name =pin; _pin =pin; _range =false; _low =0; _high =0; _backgroundCallback =NULL; _repeatCallback =NULL; pinMode(_pin, INPUT_PULLUP);}Button::Button(int name, int pin){ _name =name; _pin =pin; _range =false; _low =0; _high =0; _backgroundCallback =NULL; _repeatCallback =NULL; pinMode(_pin, INPUT_PULLUP);}Button::Button(int name, int pin, int analogLow, int analogHigh, bool activeLow){ _name =name; _pin =pin; _range =true; _low =analogLow; _high =analogHigh; _activeLow =activeLow; _backgroundCallback =NULL; _repeatCallback =NULL; pinMode(_pin, INPUT);}//Set function to invoke in a delay or repeat loopvoid Button::Background(void (*pBackgroundFunction)()){ _backgroundCallback =pBackgroundFunction;}//Set function to invoke if repeat system requiredvoid Button::Repeat(void (*pRepeatFunction)()){ _repeatCallback =pRepeatFunction;} bool Button::IsDown(){ if (_range) { int value =analogRead(_pin); return (value>=_low &&value <_high); } else { return (digitalRead(_pin) ==LOW); }}//Tests if a button is pressed and released// returns true if the button was pressed and released// if repeat callback supplied, the callback is called while the key is pressedbool Button::Pressed(){ bool pressed =false; if (IsDown()) { unsigned long wait =millis() + DEBOUNCE_DELAY; while (millis() =time) { _repeatCallback(); unsigned long faster =speed - REPEAT_INCREASE_SPEED; if (faster>=REPEAT_MAX_SPEED) { speed =faster; } time =millis() + speed; } } pressed =true; } } return pressed;}//Return current button stateint Button::State(){ if (_range) { int value =analogRead(_pin); if (_activeLow) { return (value>=_low &&value <_high) ? LOW :HIGH; } else { return (value>=_low &&value <_high) ? HIGH :LOW; } } else { return digitalRead(_pin); }}//Return current button nameint Button::Name(){ return _name;}
Hardware_Test_V1.zipC/C++
Hardware test sketch - Turns on all segments and tests speaker
No preview (download only).

Suku cadang dan penutup khusus

Skema

Schematic for each MAX7219 (repeated 18 times) Holds six 7 segment 4 digit displays (6 boards required) PCB files in Eagle format eagle_files_KPhUOj6Ezv.zip

Proses manufaktur

  1. Arduino pov vision clock
  2. Jam Kata Sederhana (Arduino)
  3. Jam Arduino dengan waktu sholat Islam
  4. Jam Master
  5. Matriks LED Tunggal Arduino Flip Clock
  6. Mengontrol Matriks LED dengan Arduino Uno
  7. eDOT - Jam Presisi dan Stasiun Cuaca Berbasis Arduino
  8. Radar Mini dengan Arduino
  9. Tampilan Suhu OLED Arduino dengan Jam Waktu Nyata
  10. Jam Alarm Sederhana dengan DS1302 RTC