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

Penganalisis DCF77/Jam v2.0

Komponen dan persediaan

Arduino Mega 2560
× 1
Arduino UNO
× 1

Tentang proyek ini

Setelah menemukan platform Arduino, saya kagum dan impian saya suatu hari nanti mengembangkan elektronik saya sendiri menjadi kenyataan.

Seperti yang akan dilakukan siapa pun, saya mulai dengan sketsa dasar tetapi segera saya ingin membuat sesuatu yang berguna. Karena saya selalu menyukai Jam Radio (mereka menyinkronkan dengan sinyal DCF77 dari Jerman dalam kasus saya), saya memutuskan untuk membuat jam yang tidak hanya menunjukkan waktu tetapi juga jam yang menunjukkan apa yang sedang terjadi.

Setelah ratusan jam mengutak-atik, membuat kesalahan yang tak terhitung, akhirnya saya memiliki jam kerja dengan kode saya sendiri dan desain papan sirkuit cetak.

Foto dan video DCF77 Analyzer/Clock v1.0:

Tapi kemudian saya menemukan superfilter DCF77 dari Udo Klein yang memberikan sinyal bersih saat sinyal radio tidak begitu bagus.

Ini adalah papan Arduino Uno terpisah dengan perangkat lunak Superfilter, (Anda dapat melihatnya sebagai 'kotak hitam' yang berdiri sendiri, menyaring sinyal) terhubung antara antena DCF77 dan Arduino Mega yang menjalankan sketsa saya.

Jadi saya membuat versi 2.0 dari jam pertama:

  • kode yang ditulis ulang sepenuhnya
  • banyak komentar jadi semoga ada yang bisa mengerti apa yang terjadi
  • menambahkan sensor gerakan PIR untuk mengurangi konsumsi daya
  • menambahkan Superfilter DCF77
  • tampilan tambahan untuk suhu atau penggunaan lain (seperti Matahari terbit/waktu terbenam)

Foto dan video DCF77 Analyzer/Clock v2.0 baru:

Demo

untuk melihat videonya klik DI SINI

Bangun di 'Jam Kakek'

untuk melihat videonya klik DI SINI

Desain

Panel depan dan casing:

Desain panel depan dibuat dalam program freeware bernama Inkscape (lihat URL unduhan di awal halaman ini).

Sebenarnya memproduksi panel depan terbukti menjadi bagian tersulit. Saya menghabiskan banyak uang untuk mencoba membuatnya di FabLab lokal menggunakan pemotong laser dan jenis Akrilik khusus dengan lapisan seperti aluminium. Idenya adalah untuk memotong lubang dengan laser dan mengukir teks dan garis dengan membakar lapisan yang sangat tipis yang memperlihatkan akrilik hitam di bawahnya. Tapi ini adalah mimpi buruk karena pemotong laser tidak dapat menghasilkan dalam toleransi yang saya butuhkan karena penggunaan yang berat dan 'penyalahgunaan' oleh banyak pengguna.

Kemudian saya menemukan layanan Foto online. Mereka mencetak pada semua jenis bahan dan salah satunya adalah panel DiBond. Harga sangat bagus, 28 Euro termasuk ongkos kirim. Tapi hasilnya awalnya mengecewakan karena tidak mencetak desain saya 1:1 tapi sedikit diperbesar. Jadi berhati-hatilah jika Anda memutuskan untuk menggunakan metode ini. Hubungi mereka terlebih dahulu dan tanyakan apakah mungkin untuk mencetak 1:1.

Setelah panggilan telepon, mereka mengirimi saya panel lain dengan dimensi yang tepat. Lebih baik dari yang diharapkan, luar biasa!

Maka diperlukan banyak pengeboran dan perutean:

Kode

  • Penganalisis DCF / Jam v2.1
  • Sketsa superfilter
Penganalisis DCF / Jam v2.1Arduino
18-01-2020 rilis bug:sakelar hemat daya diperbaiki
/* ================================================================================DCF77 Analyzer / Jam versi 2 ================================================================================Sketsa ini adalah perangkat lunak gratis; Anda dapat mendistribusikan ulang dan/atau memodifikasinya di bawah ketentuan Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation; baik versi 2.1 dari Lisensi, atau (sesuai pilihan Anda) versi yang lebih baru. Sketsa ini disebarluaskan dengan harapan dapat bermanfaat, tapi TANPA JAMINAN APAPUN; bahkan tanpa jaminan tersirat tentang KELAYAKAN DIPERDAGANGKAN atau KESESUAIAN UNTUK TUJUAN TERTENTU. Lihat Lisensi Publik Umum GNU untuk lebih jelasnya. Anda seharusnya telah menerima salinan dari GNU Lesser General Public License bersama dengan perpustakaan ini; jika tidak, kirim surat ke Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ================================================================================Kode C++ ini jauh dari optimal karena saya sendiri adalah pemula Arduino dan C++. Tetapi bahkan setelah belajar lebih banyak sekarang, saya ingin menjaga kode tetap sederhana dan mudah dibaca. Itulah mengapa saya mungkin mendokumentasikan kode secara berlebihan untuk membantu memahami apa yang terjadi. Erik de Ruiter 2014-2020 Mei 2014 Versi pertama Maret 2016 - perombakan besar-besaran... Juli 2016 - Mulai dengan membangun Jam 2.0 dan mengadaptasi sketsa Versi 2.1 tanggal 18-01-2020 - Fungsi Powersafe diperbaiki. Versi 2.0 - Sketsa ini diadaptasi untuk versi 2.0 saya dari DCF/Analyzer Clock. Ini menggunakan Arduino MEGA dan DCF Superfilter secara default dan untuk menggerakkan banyak LED terpisah, saya sekarang menggunakan port Arduino Mega alih-alih chip Maxim 7219. Ini karena mengemudikan LED dengan banyak spesifikasi Tegangan/Arus yang berbeda bermasalah dengan chip Maxim. Pencahayaan tambahan LED misalnya akan mempengaruhi (redup) LED yang sudah menyala. Karena saya bukan insinyur elektronik, satu-satunya solusi saya adalah menggunakan port tambahan Arduino Mega. Tentu saja Anda dapat menggunakan transistor atau chip tambahan untuk menggerakkan LED, tetapi bagi saya ini adalah solusi yang jelas. - Menghapus semua kode tampilan Maxim Common Anode Versi 1.72 - Opsi:Gunakan detektor PIR Ebay yang murah untuk mematikan tampilan yang dapat dipilih saat tidak ada aktivitas yang terdeteksi. Penundaan penonaktifan dapat diatur oleh pengguna untuk mencegah layar menutup jika seseorang tidak bergerak tetapi layar harus menyala. - Sekarang tampilan Night shut-down dapat dinonaktifkan dengan membuat kedua nilai 'POWERSAVINGOFFTIME' dan 'POWERSAVINGONTIME' menjadi nol. - Tampilan suhu tetap tidak mati pada mode hemat daya. - Tampilan penghitung kesalahan tidak diatur ulang setiap jam - Memperbaiki Versi 1.71 - Opsi pengguna untuk mengatur ulang suhu min/maks memori pada tengah malam Versi 1.7:- Resolusi tampilan suhu ditingkatkan:dari 0,5 menjadi 0,1 derajat Celcius Karena waktu sensor DS18B20 perlu mengonversi suhu dan untuk menjaga kode tetap bersih, tampilan suhu diperbarui sekali per menit. - Pemeriksaan paritas rutin dioptimalkan. - Pemeriksaan yang lebih andal untuk data DCF yang buruk, mencegah pembaruan RTC dengan data yang tidak valid. - Kesalahan EoB sekarang menghapus cincin LED bagian dalam sebagaimana mestinya. - LED DCF OK kini menampilkan kondisi sinyal DCF dengan lebih andal. Mati segera jika terjadi kesalahan dan hanya ON ketika semua 3 bit paritas OK. Versi 1.6:- Mengubah fungsi suhu menjadi hanya menghitung sekali per menit. Mendapat kesalahan aneh sebelum perubahan karena saya menggunakan penundaan 100ms untuk memberikan waktu sensor DS18B20 untuk menghitung suhu. Tetapi fungsi penundaan adalah ide yang sangat buruk di sebagian besar kode c++ jadi saya akhirnya menyingkirkannya. Versi 1.5:- Perombakan total fungsi scanSignal dan kode lainnya! Upaya pertama saya berhasil tetapi dapat ditingkatkan ... - rPW dan rPT led tidak berfungsi seperti yang saya maksudkan sehingga diperbaiki sekarang. - Rutin pemeriksaan kesalahan End of Buffer berfungsi sekarang sebagaimana mestinya. - Saya memasukkan pemeriksaan Paritas dari sinyal DCF yang masuk. Dalam sinyal 3 bit Paritas dikirim jadi sekarang ini diperiksa dan hanya jika ketiganya OK, informasi waktu yang diterima diterima, tampilan diperbarui dan RTC disinkronkan. jika diinginkan, Anda dapat memasang 3 LED dua warna tambahan (Katoda Umum) untuk melihat apakah masing-masing dari 3 bit Paritas OK atau Gagal. - Saya membuat pengkabelan (atau mengubah pengkabelan) jauh lebih mudah, saya pikir dengan meletakkan semua konfigurasi PIN dalam satu tabel yang mudah dibaca - Selama Anda menggunakan 1 suhu DS18B20. sensor, saya mengedit kode sehingga Anda tidak perlu lagi mencari tahu alamat perangkat I2C. - Pembersihan kode yang besar... - Penghematan daya dengan mematikan tampilan (jam tetap berfungsi seperti biasa) sekarang dapat dikonfigurasi dengan lebih mudah dengan mengedit dua variabel POWERSAVINGONTIME dan POWERSAVINGOFFTIME. - mengubah beberapa nama variabel:- Instans Maxim 'lc' dan 'lc1' sekarang menjadi MaximCC dan MaximCA - Deskripsi tampilan MaximDcfTime sekarang DisplayTempWeek - DCF77SOUNDPIN sekarang BUZZERSWITCHPIN - Tes LED/Tampilan setelah dinyalakan sekarang dibangun di Deskripsi Singkat:Power On:Setelah power-on, pertama tes LED dilakukan. LED dan tampilan menyala secara berurutan untuk menjaga konsumsi daya tetap rendah. Kemudian jam mulai menerima pulsa DCF dan ketika Tanda Menit (celah 2 detik) terdeteksi, LED Penanda Menit menyala dan penghitung buffer direset. Cincin LED bagian dalam sekarang akan menunjukkan pulsa DCF yang masuk yang juga disimpan dalam buffer. Pada 3 saat selama penerimaan data bit DCF paritas diperiksa untuk melihat apakah data tersebut valid. Data valid diterima:Ketika, pada akhir menit, setelah Tanda Menit terdeteksi (LED BF (Buffer Full) menyala), ketiga bit paritas OK (LED 'DCF OK' menyala), informasi buffer adalah digunakan untuk mengekstrak informasi waktu dan tanggal. Kemudian jam RTC diperbarui (LED 'RTC Synced' menyala) dan informasi cincin LED bagian dalam disalin ke cincin LED luar. Waktu, tampilan tanggal dan minggu, LED hari, informasi LED musim panas/musim dingin dan tahun kabisat diperbarui dengan informasi waktu baru. Tidak ada data yang valid:Ketika satu atau lebih bit paritas tidak OK karena sinyal yang bising, penerimaan informasi DCF dilanjutkan tetapi tidak akan digunakan untuk memperbarui RTC, tampilan, dan LED. Cincin LED luar, LED 'RTC disinkronkan' dan 'DCF OK' akan diatur ulang. Waktu, tanggal, minggu, hari LED, LED musim panas/musim dingin dan LED tahun kabisat tidak terpengaruh dan tetap menampilkan nilai valid yang terakhir diterima. LED kesalahan 'Periode Waktu' dan/atau 'Periode Dengan' akan menunjukkan kesalahan dan tampilan penghitung kesalahan diperbarui. Setiap jam, tampilan kesalahan taruhan akan disetel ke nol. LED End of Buffer EoB menyala ketika lebih banyak pulsa DCF diterima sebelum Tanda Menit terdeteksi karena sinyal yang bising. (Bila Penanda menit terdeteksi, seharusnya tidak lebih dari 58 bit/pulsa) Setelah Pendeteksian Penanda Menit, siklus baru dimulai. Suhu:Pada tanda 30 detik, tampilan suhu akan menunjukkan nilai Tinggi dan Rendah dari periode sebelumnya setelah reset terakhir. Lonceng:Jika sakelar CHIME ON/TINGGI, maka pada awal setiap jam, Lonceng (jika terhubung) akan berbunyi Pada malam hari, waktu yang ditentukan oleh pengguna dalam kode itu sendiri, lonceng dinonaktifkan. Hemat daya - layar dimatikan Ini hanya akan berfungsi JIKA sakelar Hemat Daya TINGGI:1. MALAM MATI Pada waktu yang ditentukan oleh pengguna, layar dimatikan pada malam hari dan dihidupkan di pagi hari. Lihat variabel POWERSAVINGOFFTIME dan POWERSAVINGONTIME. Centang fungsi  untuk memilih tampilan WHICH yang ingin Anda matikan di malam hari. 2. SENSOR PIR Hubungkan sensor PIR dan aktifkan opsi PIR POWERSAVE_BY_PIR dan tunda pada PIR_DELAY_TIME. Setiap kali detektor PIR merasakan gerakan, penghitung menit direset tetapi jika tidak ada gerakan yang terdeteksi lebih lama dari PIR_DELAY_TIME, tampilan dimatikan. Saat terjadi gerakan, layar segera menyala. Catatan:seperti yang dikatakan sebelumnya, jam akan berfungsi normal saat layar dimatikan. Bip DCF:Dengan sakelar, yang terhubung ke pin BUZZERSWITCHPIN, Anda dapat mendengar bit DCF yang diterima masuk. Durasi nada setara dengan lebar pulsa bit DCF, jadi 100 atau 200 ms. Lain-lain:Ketika baterai RTC kosong atau kesalahan koneksi terdeteksi, LED Kesalahan RTC menyala. KREDIT:Saya belajar banyak dari karya Matthias Dalheimer dan Thijs Elenbaas yang membuat decoder DCF77 mereka sendiri. Tanpa pekerjaan mereka, saya tidak akan tahu harus mulai dari mana. Saya akhirnya menulis kode saya sendiri (menggunakan potongan-potongan ide mereka) sehingga saya dapat memahami apa yang terjadi... Kode saya jauh dari efisien atau canggih tetapi berhasil dan saya tahu apa yang sedang terjadi. Website menarik:- Brett Oliver :http://home.btconnect.com/brettoliver1/ - Joop Tap :http://www.jooptap.nl - Thijs Ellenbaas :http://thijs.elenbaas.net/2012/04/ arduino-dcf77-radio-clock-receiver-hardware-2/ - Mathias Dalheimer :https://github.com/roddi/DCF77-Arduino/blob/master/DCF77Servoclock/DCF77.h - DCF77 wikipedia :https://en .wikipedia.org/wiki/DCF77 - Info DCF77 lainnya :http://www.picbasic.nl/indexes_uk.htm - Situs web Flickr saya :https://www.flickr.com/photos/edr1924/albums - Github Saya situs web:https://github.com/deruiter *///------------------------------------ -------------------------------------------------- ---------------------// Perpustakaan//------------------------ -------------------------------------------------- --------------------------------// Arduino (baru) Time library .......... .......................... http://www.pjrc.com/teensy/td_libs_Time.html#include // Aktifkan baris ini jika menggunakan Arduino Uno, Mega, dll.#termasuk // pustaka DS1307 dasar y yang mengembalikan waktu sebagai time_t .......... http://www.pjrc.com/teensy/td_libs_DS1307RTC.html#include // Maxim 7219 menampilkan perpustakaan ..... .................................. http://playground.arduino.cc/Main/LEDMatrix// !!! CATATAN:Anda harus menggunakan versi khusus dari perpustakaan Ledcontrol.h untuk mendapatkan dukungan Common Anode// karena chip Maxim biasanya hanya cocok untuk tampilan CATHODE umum!#include //SPI interface library .... ...................................... http://arduino.cc/en/Reference/ SPI#include // OneWire memungkinkan Anda mengakses perangkat 1-kawat yang dibuat oleh Maxim/Dallas,// seperti DS18S20, DS18B20, DS1822 ................. ............. http://www.pjrc.com/teensy/td_libs_OneWire.html// Perpustakaan DallasTemperature dapat melakukan semua pekerjaan ini untuk Anda! ... http://milesburton.com/Dallas_Temperature_Control_Library#include //----------------------------- -------------------------------------------------- ---------------------------// Koneksi Pin Arduino UNO dalam tabel yang mudah dibaca //// input - Rx - digunakan untuk pemrograman /komunikasi dengan PC// output - Tx - digunakan untuk pemrograman/komunikasi dengan PC#define DCF77PIN 2 // input - sinyal DCF dari antena pcb. Pin harus merupakan input interupsi!#define PIRDETECTORPIN 3 // input - PIR detector:periksa aktivitas di ruangan untuk mengaktifkan display#define BUZZERSWITCHPIN 4 // input - SWITCH - nyalakan/matikan DCF77 'bip' piezo buzzer / ON =HIGH , OFF =LOW#define CHIMESWITCHPIN 5 // input - SWITCH - nyalakan/matikan suara lonceng setiap jam / ON =HIGH, OFF =LOW#define POWERSAVESWITCHPIN 6 // input - SWITCH - nyalakan/matikan fitur hemat daya sehingga tampilan selalu on / ON =HIGH, OFF =LOW#definisikan TEMPSENSORPIN 8 // input - sensor suhu Dallas One Wire DS18B20#define TEMPRESETPIN 9 // input - PUSH BUTTON - reset temperatur min/max memory / HIGH =reset#define MAXIMCCLD 10 // output - CS/LOAD - koneksi pseudo SPI ke chip Maxim 7219 - Tampilan 7 segmen#define MAXICCCCLK 11 // output - CLOCK - koneksi pseudo SPI ke chip Maxim 7219 - Tampilan 7 segmen#define MAXIMCCDATA 12 // output - DATA - koneksi pseudo SPI ke chip Maxim 7219 - tampilan 7 segmen// !! Pin 22 sampai 53 hanya digunakan untuk LED#menentukan LED_MINGGU 22 // output - LED - Minggu#menentukan LED_MONDAY 23 // output - LED - Senin#mendefinisikan LED_TUESDAY 24 // output - LED - Selasa#menentukan LED_RABU 25 // keluaran - LED - Rabu#menentukan LED_KAMIS 26 // keluaran - LED - Kamis#menentukan LED_JUMAT 27 // keluaran - LED - Jumat#menentukan LED_SATURH 28 // keluaran - LED - Sabtu#menentukan LED_CEST 29 // keluaran - LED - CEST Musim Panas #menentukan LED_CET 30 // output - LED - CET Musim Dingin#mendefinisikan LED_LEAPYEAR 31 // output - LED - Tahun kabisat#mendefinisikan LED_RTCERROR 32 // output - LED - masalah membaca data RTC (baterai/koneksi kosong)#mendefinisikan LED_RTCSYNC 33 // output - LED - Menyala ketika RTC berhasil disinkronkan dengan waktu DCF#menentukan LED_TEMP 34 // output - LED - suhu ditampilkan#menentukan LED_OPTION1 35 // output - LED - opsional 1 data ditampilkan#menentukan LED_OPTION2 36 // output - LED - 2 data opsional ditampilkan#define LED_ERRORPT 37 // output - LED - DCF Period Time error#define LED_ ERRORPW 38 // output - LED - DCF Period Width error#define LED_BUFFERFULL 39 // output - LED - Buffer full indicator, selanjutnya data akan dianalisa#define LED_MINUTEMARKER 40 // output - LED - Akhir aliran data DCF terdeteksi sebelum buffer terisi, data rusak#define LED_BUFFEROVERFLOW 41 // output - LED - Lebih banyak data yang diterima dalam satu menit dari yang diharapkan karena sinyal buruk#define LED_DCFSTATUS 42 // output - LED - Menyala ketika data DCF kita baik#define LED_POWERSAVE 43 / / output - LED - Mode hemat daya diaktifkan, beberapa tampilan mati#tentukan LED_PARITY1PASS 44 // output - LED - Paritas 1 bit OK#tentukan LED_PARITY1FAIL 45 // output - LED - Paritas 1 bit GAGAL#tetapkan LED_PARITY2PASS 46 // keluaran - LED - Paritas 2 bit OK# tentukan LED_PARITY2FAIL 47 // keluaran - LED - Paritas 2 bit GAGAL# tentukan LED_PARITY3PASS 48 // keluaran - LED - Paritas 3 bit OK# tentukan LED_PARITY3FAIL 49 // keluaran - LED - Paritas 3 bit FAILED#define LED_PIRMOTION 50 // output - LED - Menyala saat PIR mendeteksi gerakan/ / Pin analog#menentukan BUZZER A7 // output - Buzzer piezo untuk 'bip' DCF77 (ke '+' dari bel)#definisi SPEAKERVOLPIN A6 // output - Volume Papan Suara - RENDAH =volume satu tingkat lebih rendah. SPEAKERVOLUME menentukan berapa kali output ini diaktifkan setelah power on#define CHIMEPIN A5 // output - Chime Activate - OUTPUT LOW =Aktifkan Chime pada Adafruit Soundboard FX// DIGUNAKAN untuk DS1307 RTC // I2C DATA - sambungkan ke Real Time Clock pcb/ / DIGUNAKAN untuk DS1307 RTC // I2C CLOCK - sambungkan ke pcb Real Time Clock//-------------------------------- -------------------------------------------------- ------------------------// Inisialisasi DS18B20//------------------- -------------------------------------------------- ------------------------------------OneWire ds(TEMPSENSORPIN); // tentukan DS instance Onewire//------------------------------------------- -------------------------------------------------- --------------// Maxim 7219 Inisialisasi Tampilan Matriks//--------------------------- -------------------------------------------------- -----------------------------/* clearDisplay(int addr) .............. ............................... menghapus tampilan yang dipilih MaximCC.shutdown(int addr, boolean) ...... .......................... membangunkan MAX72XX dari mode hemat daya (true =sleep, false =wake) MaximCC.setIntensity(int addr , nilai) ............................. mengatur kecerahan sedang untuk Led (0=min - 15=maks) MaximCC .setLed(int addr, int row, int col, boolean state) .......... nyalakan led pada baris, kolom. ingat bahwa indeks mulai dari 0! MaximCC.setRow(int addr, int row, byte value) ............... fungsi ini membutuhkan 3 argumen. contoh:MaximCC.setRow(0,2,B10110000); MaximCC.setColumn(int addr, int col, byte value) ............... fungsi ini membutuhkan 3 argumen. contoh:MaximCC.setColumn(0,5,B00001111); MaximCC.setDigit(int addr, int digit, byte value, boolean dp) ...... fungsi ini mengambil argumen tipe byte dan mencetak digit yang sesuai pada kolom yang ditentukan. Rentang nilai yang valid berjalan dari 0.15. Semua nilai antara 0,.9 dicetak sebagai digit, nilai antara 10..15 dicetak sebagai ekuivalen heksadesimal MaximCC.setChar(int addr, int digit, char value, boolean dp) ....... akan menampilkan:0 1 2 3 4 5 6 7 8 9 ABCDEFHLP; - . , _  (karakter kosong atau spasi) POWERSAVESWITCHPIN ***** Silakan atur jumlah perangkat yang Anda miliki ***** Tetapi default maksimum 8 MAX72XX juga akan berfungsi. LedConrol(DATAIN, CLOCK, CS/LOAD, NUMBER OF MAXIM CHIPS) */// lc untuk tampilan MaximLedControl MaximCC =LedControl(MAXIMCCDATA, MAXIMCCCLK, MAXIMCCLD, 7, false); // Tentukan pin untuk Maxim 72xx dan berapa banyak 72xx yang kita gunakan //----------------------------------- -------------------------------------------------- ---------------------// Pengaturan pengguna, definisi variabel dan larik//------------------ -------------------------------------------------- ---------------------------------------// Nilai di bawah ini bukan nomor PIN tapi a nilai untuk mengatur berapa kali input 'Turunkan volume' pada papan suara diaktifkan// sehingga volume papan suara dapat diturunkan setelah dinyalakan, jika diinginkan.#define SPEAKERVOLUME 12// Pilih jika Anda ingin pengujian semua LED dan Tampilan setelah penyalaan// '1' =Ya, '0' =Tidak#define PERFORM_LED_TEST 1// Penundaan antara setiap tampilan 7 segmen dalam ms#define LEDTEST_DELAY_DISPLAYS 600// Penundaan antara setiap LED pada cincin LED dan LED lainnya di ms#define LEDTEST_DELAY_LED_RING 20// Pilih jika Anda ingin mengonfigurasi sensor suhu DS18B20 SEKALI ke resolusi tertinggi.// ini diperlukan setelah menggunakan sensor untuk fir waktu pertama. Setelah menjalankan perangkat lunak// dengan pengaturan ini ON satu kali, matikan.// '1' =ON, '0' =OFF#define CONFIGURE_DS18B20 0// POWERSAVE TIME - nilai WAJIB!//// untuk menentukan hari dan waktu malam. Ini digunakan untuk tampilan hemat daya waktu ON dan OFF // DAN untuk menentukan apakah lonceng akan diaktifkan (pada siang hari).//// HANYA tampilan dimatikan pada waktu hemat daya, jam tetap aktif sepenuhnya./ / UNTUK MENONAKTIFKAN tampilan matikan daya kapan saja, cukup setel sakelar Hemat daya ke OFF//// Sakelar hemat daya ON:layar akan dimatikan pada waktu malam yang disetel // DAN jika POWERSAVE_BY_PIR berfungsi jika diaktifkan dan ada tidak ada // gerakan untuk set PIR_DELAY_TIME.// Sakelar hemat daya OFF:menampilkan selalu menyala, berbunyi hanya di siang hari.//// nilai dalam format 'Jam', jadi jam 8 malam akan menjadi '20', BUKAN 20:00 atau 8PM...#define POWERSAVINGOFFTIME 9 // tampilan diaktifkan#define POWERSAVINGONTIME 22 // tampilan dimatikan// Opsi pengguna:aktifkan tampilan hanya ketika ada aktivitas di dalam ruangan// '1' =ON, '0 ' =OFF#define POWERSAVE_BY_PIR 1// penundaan dalam MENIT untuk menunggu setelah tidak ada deteksi sebelum mematikan display#define PIR_DELAY_TIME 30// Opsi pengguna untuk mengatur ulang suhu min /maks memori di tengah malam// '1' =Reset di tengah malam, '0' =Hanya reset manual#define TEMPRESET_MIDNIGHT 1//---------------------- -------------------------------------------------- -------// tentukan parameter lain-lain#define DS1307_I2C_ADDRESS 0x68 // tentukan alamat RTC I2C#define DCF_INTERRUPT 0 // Interupsi nomor yang terkait dengan pin// definisi Maxim 7219 menampilkan nomor rangkaian kabel// Maxim 7219 pertama di wiring 'daisychain' harus '0', selanjutnya '1' dll.// TAMPILAN KATHODE UMUM#mendefinisikan LedRingInner 0#menentukan LedRingOuter 1#menentukan DisplayBufferBitError 2#menentukan DisplayPeriodPulse 3#menentukan DisplayTempWeek 4#menentukan DisplayTime 6/menentukan DisplayTime 5 / definisi tingkat kecerahan tampilan#menentukan KecerahanLedRingOuter 1#menentukan KecerahanLedRingInner 1#menentukan BrightnessDisplayTime 1#menentukan BrightnessDisplayDate 7#menentukan BrightnessDisplayTempWeek 15#menentukan BrightnessDisplayPeriodPulse 2#menentukan BrightnessDisplayDisplayBufferBitErrge awalan 15/Estatis Hapus tatic unsigned long trailingEdge =0;unsigned long beforeLeadingEdge =0;// digunakan di volatile unsigned int DCFSignalState =0; // variabel interupsi SELALU membutuhkan qualifier volatil!!// digunakan di 
int beforeSecond =0;unsigned int PreviousSignalState =0;// Penyangga DCF dan indikatorstatis int DCFbitBuffer[59]; // di sini, DCFbit yang diterima disimpanconst int bitValue[] ={1, 2, 4, 8, 10, 20, 40, 80}; // ini adalah nilai desimal dari DCFbit yang diterima// hanya setelah memulai pada menit baru, menampilkan bit yang diterima pada ringboolean LED bagian dalam MinuteMarkerFlag =false;int bufferPosition =0;int sebelumnyaMenit =0;int sebelumnyaHour =0;// variabel untuk memeriksa apakah bit DCF adalah valdbool dcfValidSignal =false;int dcfP1counter =0;int dcfP2counter =0;int dcfP3counter =0;int dcfParityCheckP1 =0;int dcfParityCheckP2 =0;int dcfParityCheckP3 =0 waktu untuk menyimpan decodcfF variabel DCF inint dcfMinute =0;int dcfHour =0;int dcfDay =0;int dcfWeekDay =0;int dcfMonth =0;int dcfYear =0;int dcfDST =0;int leapYear =0;// variabel yang digunakan untuk menyimpan nilai weeknumber dan daynumerint dayNumber;int weekNumber;// error counter variableint errorCounter =0;boolean errorCondition =false;// variabel lain-lainboolean daytimeChange =true;boolean dayTime =false;int dcf77SoundSwitch =0;// variabel suhubyte saat ini =0;byte DS18B20Data[12];int maxTemp =0;int minTemp =0;int lowByte =0;int hi ghByte =0;float tempReading =0;int tempCelsius =0;boolean tempResetButton =false;// Variabel detektor PIRint pirActivity =0;int pirDisplaysState =1;unsigned int pirTimer =0;unsigned long beforeTimePIR =0;//==============================================================================// SETUP//================================================================================void setup(){ // menginisialisasi komunikasi Serial Serial.begin(9600); // inisialisasi koneksi PIN pinMode(DCF77PIN, INPUT); pinMode(TEMPRESETPIN, INPUT); pinMode(BUZZERSWITCHPIN, INPUT); pinMode(CHIMESWITCHPIN, INPUT); pinMode(POWERSAVESWITCHPIN, INPUT); pinMode(PIRDETECTORPIN, INPUT); pinMode(CHIMEPIN, OUTPUT); pinMode(SPEAKERVOLPIN, OUTPUT); // inisialisasi pin LED 22 - 50 untuk (int i1 =22; i1 <=50; i1++) { pinMode(i1, OUTPUT); } // Inisialisasi variabel, tampilan LED dan inisialisasi LED(); // Inisialisasi interupsi pulsa DCF77 pada pin DCF_INTERRUPT, mencari perubahan sinyal, // jadi pulsa sisi naik atau turun akan memicu penangan interupsi dan // menjalankan fungsi int0handler. attachInterrupt(DCF_INTERRUPT, int0handler, CHANGE); // Inisialisasi RTC dan tetapkan sebagai SyncProvider. // Nanti RTC akan disinkronkan dengan waktu DCF setSyncProvider(RTC.get); // fungsi untuk mendapatkan waktu dari RTC // memeriksa apakah RTC telah menyetel waktu sistem if (timeStatus() !=timeSet) { // Tidak dapat menyinkronkan dengan RTC - mengaktifkan RTCError LED digitalWrite(LED_RTCERROR, HIGH); } else { // RTC telah mengatur waktu sistem - redup RTCError LED digitalWrite(LED_RTCERROR, LOW); } // Setelah dihidupkan, atur volume speaker Adafruit Audio Board // inisialisasi kedua pin ke LOW yang merupakan status output default digitalWrite(SPEAKERVOLPIN, LOW); digitalWrite(CHIMEPIN, RENDAH); // turunkan volume default papan suara dengan langkah 'SPEAKERVOLUME' untuk (int i =0; i <=SPEAKERVOLUME; i++) { digitalWrite(SPEAKERVOLPIN, HIGH); penundaan(100); digitalWrite(SPEAKERVOLPIN, RENDAH); penundaan(100); } // Fungsi berikut harus dijalankan hanya sekali. // Digunakan untuk mengonfigurasi resolusi suhu sensor DS18B20 if (CONFIGURE_DS18B20 ==1) { configureDS18B20(); } // digunakan untuk tujuan pengujian dan/atau menyetel waktu RTC secara manual // setTime(23, 59, 40, 31, 12, 13); // RTC.set(sekarang()); // Minta konversi suhu countTemp(); // periksa apakah tes LED diperlukan jika (PERFORM_LED_TEST ==1) { // lakukan tes LED ledTest(); } else { // jika tidak melakukan tes LED, kita perlu menunggu sebentar agar sensor DS18B20 siap delay(750); } // Sekarang dapatkan suhu dari sensor dan tampilkan displayTemp(); // aktifkan tampilan errorCounter setelah LED test ledDisplay(DisplayBufferBitError, "R", 0);}//==============================================================================// LOOP//=============================================================================void loop(){ // periksa dulu apakah arah pulsa berubah (naik atau jatuh) // jika tidak, kita akan terus mengevaluasi pulsa yang sama if (DCFSignalState !=PreviousSignalState) { // 'reset' state dari variabel PreviousSignalState =DCFSignalState; // mengevaluasi pemindaian pulsa masukSignal(); } // memeriksa apakah sakelar diubah dan menindaklanjutinya checkSwitch(); // periksa pergerakan PIR checkPIR(); // menjalankan tugas yang harus terjadi hanya sekali setiap detik, menit atau jam //--------------------------------- ------------------------------------------- tugas SetiapSecond(); tugasSetiapMenit(); taskEveryHour();}//=================================================================================================================//// Nama fungsi :processDcfBit// dipanggil dari ://// Tujuan :Mengevaluasi sinyal saat diterima. Memutuskan apakah kita menerima "1" atau "0"// dan melakukan pemeriksaan untuk melihat apakah waktu pulsa berada dalam batas// Parameter :none// Nilai kembalian :none////================================================================================================================/* lebar lebar pulsa |- -| |-- --| |----- Penanda AKHIR MENIT:2000 md -----| ___ _______ ___ ___ _______ | 0 | | 1 | | 0 | | 0 | | 1 | | | | | | | | | | | | | | | | | | | | | ______| |_______________| |___________| |___________________________________| |_______________| |__ _ _ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1000 2100 2000 2200 3000 3100 NO PULSA 5000 5100 6000 6200 < REJECTED error(LED_ERRORPW); errorCondition =true; } //-------------------------------------------------------------------------------- // CHECK PULSE TIME //-------------------------------------------------------------------------------- // If the detected pulse is too short it will be an incorrect pulse that we shall reject // should be 100 and 200 ms ideally if (((trailingEdge - leadingEdge) <70) || ((trailingEdge - leadingEdge)> 230)) { //rPT - ERROR:Pulse Width too short or too long -> REJECTED error(LED_ERRORPT); errorCondition =true; } // if we had an error return and start over if (errorCondition ==true) { errorCondition =false; // although we have an error, store current rising edge time to compare at the next Rising-Edge. previousLeadingEdge =leadingEdge; kembali; } //-------------------------------------------------------------------- // no errors found so now we can continue //-------------------------------------------------------------------- // first we turn any error Led's OFF digitalWrite(LED_ERRORPW, LOW); digitalWrite(LED_ERRORPT, LOW); digitalWrite(LED_BUFFERFULL, LOW); // previous BF digitalWrite(LED_BUFFEROVERFLOW, LOW); // previous EoB digitalWrite(LED_MINUTEMARKER, LOW); // previous EoM // END OF MINUTE check, looking for a gap of approx. 2000ms if (leadingEdge - previousLeadingEdge> 1900 &&leadingEdge - previousLeadingEdge <2100) { // end of minute detected:finalizeBuffer(); } // refresh previousLeadingEdge time with the new leading edge time previousLeadingEdge =leadingEdge; //-------------------------------------------------------------------------------- // process DCF bits //-------------------------------------------------------------------------------- // distinguish between long and short pulses if (trailingEdge - leadingEdge <170) { // call processDcfBit function and sent it the value '0' processDcfBit(0); // if switch is HIGH, the DCF pulses are audible if (dcf77SoundSwitch ==1) buzzer(100); } else { // call processDcfBit function and sent it the value '1' processDcfBit(1); // if switch is HIGH, the DCF pulses are audible if (dcf77SoundSwitch ==1) buzzer(200); } } // if (DCFSignalState ==0)} // void scanSignal();//================================================================================================================//// Function name :processDcfBit// called from ://// Purpose :after reception of one good DCF bit, do some checks and save it in the DCFbitBuffer array// Parameters :none// Return value :none////================================================================================================================void processDcfBit(int dcfBit){ //-------------------------------------------------------------------- // display values on the 7 segment displays //-------------------------------------------------------------------- // display bufferPosition, digits 7,6 MaximCC.setChar(DisplayBufferBitError, 7, bufferPosition / 10, false); MaximCC.setChar(DisplayBufferBitError, 6, bufferPosition % 10, false); // display received DCFbit, digit 4 MaximCC.setChar(DisplayBufferBitError, 4, dcfBit, false); //-------------------------------------------------------------------- // display incoming DCF bits on inner LED ring //-------------------------------------------------------------------- // only if we have valid DCF data or after an Minute Mark (EoM) signal // activate the inner LED ring and diplay incoming data if (dcfValidSignal ==true || MinuteMarkerFlag ==true) { // display received bits on inner LED ring MaximCC.setLed(LedRingInner, bufferPosition / 8, bufferPosition % 8, dcfBit); } //-------------------------------------------------------------------- // // Fill DCFbitBuffer array with DCFbit //-------------------------------------------------------------------- DCFbitBuffer[bufferPosition] =dcfBit; //-------------------------------------------------------------------- // Parity check //-------------------------------------------------------------------- // DURING reception of the DCF bits, calculate and display the results of the DCF parity check. // // There is a Parity bit for the minutes, the hours and for the date. // DCF77 works with EVEN parity, this works as follows:// The hours for example have 6 bits plus a paritybit. The bits with value 1 are add up including the paritybit, // the result must be an even number. If there is a bit wrong received, a 0 is as 1, or a 1 is as 0 received, // then the result is uneven. source:http://www.picbasic.nl/frameload_uk.htm?http://www.picbasic.nl/info_dcf77_uk.htm if (bufferPosition ==0) { // reset the parity LED's digitalWrite(LED_PARITY1PASS, LOW); digitalWrite(LED_PARITY1FAIL, LOW); digitalWrite(LED_PARITY2PASS, LOW); digitalWrite(LED_PARITY2FAIL, LOW); digitalWrite(LED_PARITY3PASS, LOW); digitalWrite(LED_PARITY3FAIL, LOW); // reset variables dcfP1counter =0; dcfP2counter =0; dcfP3counter =0; dcfParityCheckP1 =0; dcfParityCheckP2 =0; dcfParityCheckP3 =0; } // ---------------------------------------- // First parity check:minute bits // ---------------------------------------- if (bufferPosition ==28) { for (int i =21; i <=27; i++) { // count the number of bits with the value '1' dcfP1counter +=DCFbitBuffer[i]; } // perform P1 parity check. Parity is OK if the sum is an EVEN value if ((DCFbitBuffer[28] + dcfP1counter) % 2 ==0) { // Parity1 PASS LED ON digitalWrite(LED_PARITY1PASS, HIGH); // Parity P1 PASS dcfParityCheckP1 =1; } else { // Parity1 FAIL LED ON digitalWrite(LED_PARITY1FAIL, HIGH); // we have no valid data! dcfValidSignal =false; // Turn DCF OK LED OFF digitalWrite(LED_DCFSTATUS, LOW); } } // ---------------------------------------- // Second parity check:hour bits // ---------------------------------------- if (bufferPosition ==35) { for (int i =29; i <=34; i++) { dcfP2counter +=DCFbitBuffer[i]; } // perform P2 parity check. Parity is OK if the sum is an EVEN value if ((DCFbitBuffer[35] + dcfP2counter) % 2 ==0) { // Parity2 PASS LED ON digitalWrite(LED_PARITY2PASS, HIGH); // Parity P2 PASS dcfParityCheckP2 =1; } else { // Parity2 FAIL LED ON digitalWrite(LED_PARITY2FAIL, HIGH); // we have no valid data! dcfValidSignal =false; // Turn DCF OK LED OFF digitalWrite(LED_DCFSTATUS, LOW); } } // ---------------------------------------- // Third parity check:date bits // ---------------------------------------- if (bufferPosition ==58) { for (int i =36; i <=57; i++) { dcfP3counter +=DCFbitBuffer[i]; } // perform P3 parity check. Parity is OK if the sum is an EVEN value (DCFbitBuffer[58] + dcfP3counter) % 2 ==0 ? dcfParityCheckP3 =1 :dcfParityCheckP3 =0; // Turn Parity2 'PASS' or 'FAIL' LED ON if (dcfParityCheckP3 ==1) { // Parity2 PASS LED ON digitalWrite(LED_PARITY3PASS, HIGH); // Parity P3 PASS dcfParityCheckP3 =1; } else { // Parity2 FAIL LED ON digitalWrite(LED_PARITY3FAIL, HIGH); // we have no valid data! dcfValidSignal =false; // Turn DCF OK LED OFF digitalWrite(LED_DCFSTATUS, LOW); } // ---------------------------------------- // finally, check all Parity bits // ---------------------------------------- dcfParityCheckP1 + dcfParityCheckP2 + dcfParityCheckP3 ==3 ? dcfValidSignal =true :dcfValidSignal =false; } //-------------------------------------------------------------------- // before continuing with the next bit, increment counter //-------------------------------------------------------------------- bufferPosition++; //-------------------------------------------------------------------- // check if we have not received too many pulses? //-------------------------------------------------------------------- if (bufferPosition> 59) { // Buffer Overflow ERROR - we have received more pulses before reaching // the 2 second 'gap' signalling the end of the minute. //This error may be due to a noisy signal giving addition peaks/dcfBits // So clear both DCFbit displays and start again. // Reset buffer counter bufferPosition =0; // clear inner LED ring MaximCC.clearDisplay(LedRingInner); // turn Buffer Overflow Error LED ON error(LED_BUFFEROVERFLOW); // exit return; } //-------------------------------------------------------------------- // everything OK so we wait for next incoming DCFbit //--------------------------------------------------------------------}//================================================================================================================//// Function name :finalizeBuffer// called from ://// Purpose :Process the succesfully received DCF data of one minute// Parameters :none// Return value :none////================================================================================================================void finalizeBuffer(void){ //-------------------------------------------------------------------- // We are here because of the detected 2 second 'gap'. // Now check if it correspondends with the buffer counter // 'bufferPosition' which should be value 59 //-------------------------------------------------------------------- if (bufferPosition ==59 &&dcfValidSignal ==true) { // bufferPosition ==59 so turn Buffer Full LED ON digitalWrite(LED_BUFFERFULL, HIGH); // Turn DCF OK LED ON digitalWrite(LED_DCFSTATUS, HIGH); // Reset inner LED ring (incoming time information) MaximCC.clearDisplay(LedRingInner); // copy 'contents' of inner LED ring to the outer LED ring (current time information) for (int i =0; i <59; i++) { MaximCC.setLed(LedRingOuter, i / 8, i % 8, DCFbitBuffer[i]); } // process buffer and extract data sync the time with the RTC decodeBufferContents(); // set Arduino time and after that set RTC time setTime(dcfHour, dcfMinute, 0, dcfDay, dcfMonth, dcfYear); RTC.set(now()); // activate Synced LED digitalWrite(LED_RTCSYNC, HIGH); // Reset running buffer bufferPosition =0; // Reset DCFbitBuffer array, positions 0-58 (=59 bits) for (int i =0; i <59; i++) { DCFbitBuffer[i] =0; } // reset flag MinuteMarkerFlag =false; } // if (bufferPosition ==59) //-------------------------------------------------------------------- // The buffer is not yet filled although the 2 second 'gap' was detected. // Can be result of a noisy signal, starting in middle of receiving data etc. // Turn 'Minute Mark' LED ON //-------------------------------------------------------------------- else { digitalWrite(LED_MINUTEMARKER, HIGH); // Clear displays MaximCC.clearDisplay(LedRingInner); MaximCC.clearDisplay(LedRingOuter); // Reset running buffer and start afresh. Now we are in sync with the incoming data bufferPosition =0; // Reset DCFbitBuffer array, positions 0-58 (=59 bits) for (int i =0; i <59; i++) { DCFbitBuffer[i] =0; } // set flag so we can display incoming pulsed on the inner LED ring. MinuteMarkerFlag =true; }}//================================================================================================================//// Function name :decodeBufferContents// called from ://// Purpose :Evaluates the information stored in the buffer.// This is where the DCF77 signal is decoded to time and date information// Parameters :none// Return value :none////================================================================================================================void decodeBufferContents(void){ // Buffer is full and ready to be decoded dcfMinute =bitDecode(21, 27); dcfHour =bitDecode(29, 34); dcfDay =bitDecode(36, 41); dcfWeekDay =bitDecode(42, 44); dcfMonth =bitDecode(45, 49); dcfYear =bitDecode(50, 57); //call function to calculate day of year and weeknumber dayWeekNumber(dcfYear, dcfMonth, dcfDay, dcfWeekDay); // Get value of Summertime DCFbit. '1' =Summertime, '0' =wintertime dcfDST =bitDecode(17, 17); // determine Leap Year leapYear =calculateLeapYear(dcfYear);}//================================================================================================================//// bitDecode//// called from //================================================================================================================int bitDecode(int bitStart, int bitEnd){ // reset 'bitValue-array' counter int i =0; int value =0;...This file has been truncated, please download it to see its full contents.
Superfilter sketchArduino
//// This is the Superfilter sketch I use with the DCF Analyzer/Clock 2.0 // Udo Klein did an amazing job with this filter//// Erik de Ruiter/* Arduino Uno pin connections I used for the DCF Analyzer Clock DCF input ................. A5 (19) =dcf77_sample_pin Output DCF Filtered ....... 12 =dcf77_filtered_pin Output DCF Semi Synthesized A2 (16) =dcf77_semi_synthesized_pin Output DCF Synthesized .... 6 =dcf77_synthesized_pin LED DCF output filtered ... A4 (18) =dcf77_monitor_pin =DCF Monitor LED LED 1 Hz pulse ............ 10 =dcf77_second_pulse_pin =Filter Locked LED LED DCF OK ................ 13 =dcf77_signal_good_indicator_pin =Signal Quality LED LED Difference Filtered ... 7 =dcf77_filter_diff_pin \ LED Difference Semi Synth.. A0 =dcf77_semi_synthesized_diff_pin -> =Signal Difference LED LED Difference Synthesized 4 =dcf77_synthesized_diff_pin /*/ //// www.blinkenlight.net//// Copyright 2014, 2015 Udo Klein//// This program is free software:you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program. If not, see http://www.gnu.org/licenses/#include /*const uint8_t pon_pin =51; // connect pon to ground !!!const uint8_t data_pin =19;const uint8_t gnd_pin =51;const uint8_t vcc_pin =49;*/const uint8_t dcf77_analog_samples =false;const uint8_t dcf77_analog_sample_pin =5;const uint8_t dcf77_sample_pin =19; // A5const uint8_t dcf77_inverted_samples =0;#if defined(__AVR__)#define ledpin(led) (led)#else#define ledpin(led) (led<14? led:led+(54-14))#endifconst uint8_t dcf77_monitor_pin =ledpin(18); // A4const bool provide_filtered_output =true;const uint8_t dcf77_filtered_pin =ledpin(12);const uint8_t dcf77_inverted_filtered_pin =ledpin(11);const uint8_t dcf77_filter_diff_pin =ledpin(7);const bool provide_semi_synthesized_output =true;const uint8_t dcf77_semi_synthesized_pin =ledpin(16);const uint8_t dcf77_inverted_semi_synthesized_pin =ledpin(15);const uint8_t dcf77_semi_synthesized_diff_pin =ledpin(14);const bool provide_synthesized_output =true;const uint8_t dcf77_synthesized_pin =ledpin(6);const uint8_t dcf77_inverted_synthesized_pin =ledpin(5);const uint8_t dcf77_synthesized_diff_pin =ledpin(4);const uint8_t dcf77_second_pulse_pin =ledpin(10);const uint8_t dcf77_signal_good_indicator_pin =ledpin(13);volatile uint16_t ms_counter =0;volatile Internal::DCF77::tick_t tick =Internal::DCF77::undefined;template void set_output(uint8_t clock_state, uint8_t sampled_d ata, uint8_t synthesized_signal){ if (enable) { const uint8_t filtered_output =clock_state  200) :digitalRead(dcf77_sample_pin)); #else dcf77_inverted_samples ^ digitalRead(dcf77_sample_pin); #endif digitalWrite(dcf77_monitor_pin, sampled_data); digitalWrite(dcf77_second_pulse_pin, ms_counter <500 &&clock_state>=Clock::locked); const uint8_t synthesized_signal =tick ==Internal::DCF77::long_tick ? ms_counter <200:tick ==Internal::DCF77::short_tick ? ms_counter <100:tick ==Internal::DCF77::sync_mark ? 0:// tick ==DCF77::undefined --> default handling // allow signal to pass for the first 200ms of each second (ms_counter <=200 &&sampled_data) || // if the clock has valid time data then undefined ticks // are data bits --> first 100ms of signal must be high ms_counter <100; set_output (clock_state, sampled_data, synthesized_signal); set_output (clock_state, sampled_data, synthesized_signal); set_output (clock_state, sampled_data, synthesized_signal); ms_counter+=(ms_counter <1000); scope_1.process_one_sample(sampled_data); scope_2.process_one_sample(digitalRead(dcf77_synthesized_pin)); return sampled_data;}void output_handler(const Clock::time_t &decoded_time) { // reset ms_counter for 1 Hz ticks ms_counter =0; // status indicator --> always on if signal is good // blink 3s on 1s off if signal is poor // blink 1s on 3s off if signal is very poor // always off if signal is bad const uint8_t clock_state =DCF77_Clock::get_clock_state(); digitalWrite(dcf77_signal_good_indicator_pin, clock_state>=Clock::locked ? 1:clock_state ==Clock::unlocked? (decoded_time.second.digit.lo &0x03) !=0:clock_state ==Clock::free ? (decoded_time.second.digit.lo &0x03) ==0:0); // compute output for signal synthesis Internal::DCF77_Encoder now; now.second =BCD::bcd_to_int(decoded_time.second); now.minute =decoded_time.minute; now.hour =decoded_time.hour; now.weekday =decoded_time.weekday; now.day =decoded_time.day; now.month =decoded_time.month; now.year =decoded_time.year; now.uses_summertime =decoded_time.uses_summertime; now.leap_second_scheduled =decoded_time.leap_second_scheduled; now.timezone_change_scheduled =decoded_time.timezone_change_scheduled; now.undefined_minute_output =false; now.undefined_uses_summertime_output =false; now.undefined_abnormal_transmitter_operation_output =false; now.undefined_timezone_change_scheduled_output =false; now.advance_minute(); tick =now.get_current_signal();}void setup_serial() { Serial.begin(115200);}void output_splash_screen() { Serial.println(); Serial.println(F("DCF77 Superfilter 3.0")); Serial.println(F("(c) 2015 Udo Klein")); Serial.println(F("www.blinkenlight.net")); Serial.println(); Serial.print(F("Sample Pin:")); Serial.println(dcf77_sample_pin); Serial.print(F("Inverted Mode:")); Serial.println(dcf77_inverted_samples); #if defined(__AVR__) Serial.print(F("Analog Mode:")); Serial.println(dcf77_analog_samples); #endif Serial.print(F("Monitor Pin:")); Serial.println(dcf77_monitor_pin); Serial.println(); if (provide_filtered_output) { Serial.println(F("Filtered Output")); Serial.print(F(" Filtered Pin:")); Serial.println(dcf77_filtered_pin); Serial.print(F(" Diff Pin:")); Serial.println(dcf77_filter_diff_pin); Serial.print(F(" Inverse Filtered Pin:")); Serial.println(dcf77_inverted_filtered_pin); Serial.println(); } if (provide_semi_synthesized_output) { Serial.println(F("Semi Synthesized Output")); Serial.print(F(" Filtered Pin:")); Serial.println(dcf77_semi_synthesized_pin); Serial.print(F(" Diff Pin:")); Serial.println(dcf77_semi_synthesized_diff_pin); Serial.print(F(" Inverse Filtered Pin:")); Serial.println(dcf77_inverted_semi_synthesized_pin); Serial.println(); } if (provide_synthesized_output) { Serial.println(F("Synthesized Output")); Serial.print(F(" Filtered Pin:")); Serial.println(dcf77_synthesized_pin); Serial.print(F(" Diff Pin:")); Serial.println(dcf77_synthesized_diff_pin); Serial.print(F(" Inverse Filtered Pin:")); Serial.println(dcf77_inverted_synthesized_pin); Serial.println(); } Serial.print(F("Second Pulse Pin:")); Serial.println(dcf77_second_pulse_pin); Serial.print(F("Signal Good Pin:")); Serial.println(dcf77_signal_good_indicator_pin); Serial.println(); Serial.println(); Serial.println(F("Initializing...")); Serial.println();};void setup_pins() { if (provide_filtered_output) { pinMode(dcf77_filtered_pin, OUTPUT); pinMode(dcf77_filter_diff_pin, OUTPUT); pinMode(dcf77_inverted_filtered_pin, OUTPUT); } if (provide_semi_synthesized_output) { pinMode(dcf77_semi_synthesized_pin, OUTPUT); pinMode(dcf77_semi_synthesized_diff_pin, OUTPUT); pinMode(dcf77_inverted_semi_synthesized_pin, OUTPUT); } if (provide_synthesized_output) { pinMode(dcf77_synthesized_pin, OUTPUT); pinMode(dcf77_synthesized_diff_pin, OUTPUT); pinMode(dcf77_inverted_synthesized_pin, OUTPUT); } pinMode(dcf77_monitor_pin, OUTPUT); pinMode(dcf77_signal_good_indicator_pin, OUTPUT); pinMode(dcf77_second_pulse_pin, OUTPUT); pinMode(dcf77_sample_pin, INPUT); digitalWrite(dcf77_sample_pin, HIGH);}void setup_clock() { DCF77_Clock::setup(); DCF77_Clock::set_input_provider(sample_input_pin); DCF77_Clock::set_output_handler(output_handler);}void setup() { setup_serial(); output_splash_screen(); setup_pins(); setup_clock();/* pinMode(gnd_pin, OUTPUT); digitalWrite(gnd_pin, LOW); pinMode(pon_pin, OUTPUT); digitalWrite(pon_pin, LOW); pinMode(vcc_pin, OUTPUT); digitalWrite(vcc_pin, HIGH); */}void loop() { Clock::time_t now; DCF77_Clock::get_current_time(now); if (now.month.val> 0) { Serial.println(); Serial.print(F("Decoded time:")); DCF77_Clock::print(now); Serial.println(); } Serial.print(DCF77_Clock::get_clock_state()); Serial.print(' '); DCF77_Clock::debug(); scope_1.print(); scope_2.print();}

Suku cadang dan penutup khusus

This is a PCB I made for the Time and Date displays Maxim_7219_LED_display_unit_for_Adafruit_0_56inch_7_segment_v1_1.zipThis is my PCB design for the very compact smaller 7 segment displays Maxim_7219_LED_display_unit_for_KingBright_7_segment_SC39_11SRWAv1_1.zipTicking sound and Chime sound, see text for explanation Grandfather_Clock_Sound_files.zip

Skema

DOWNLOAD to view details! dcf77-analyzer-clock-v2_1_jVZT5sqIwn.zip

Proses manufaktur

  1. Jam Kuku
  2. Arduino pov vision clock
  3. Jam IV9 Numitron DIY paling sederhana dengan Arduino
  4. Jam dinding sederhana menggunakan Adafruit 1/4 60 Ring Neopixel
  5. Jam Kata Sederhana (Arduino)
  6. Jam Arduino dengan waktu sholat Islam
  7. Arduino Spybot
  8. FlickMote
  9. Jam Master
  10. Jam Alarm Sederhana dengan DS1302 RTC