工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

DCF77 Analyzer / Clock v2.0

コンポーネントと消耗品

>
Arduino Mega 2560
× 1
Arduino UNO
× 1

このプロジェクトについて

Arduinoプラットフォームを発見した後、私は驚き、いつの日か自分の電子機器を開発するという私の夢が実現しました。

誰もがそうするように、私は基本的なスケッチから始めましたが、すぐに何か役に立つものを作りたいと思いました。私はいつも電波時計が好きだったので(私の場合はドイツからのDCF77信号と同期します)、時間を表示するだけでなく、何が起こっているのかを表示する時計を作ることにしました。

何百時間もいじくり回し、数え切れないほどの間違いを犯した後、私はついに自分のコードとプリント回路基板のデザインで動作する時計を手に入れました。

DCF77アナライザー/時計v1.0の写真とビデオ:

しかし、後で私はUdo KleinからDCF77スーパーフィルターを発見しました。これは、無線信号があまり良くないときにクリーンな信号を提供します。

これは、DCF77アンテナとスケッチを実行しているArduino Megaの間に接続された、Superfilterソフトウェアを備えた別個のArduino Unoボードです(スタンドアロンの「ブラックボックス」として見ることができ、信号をフィルタリングします)。

最初の時計の2.0バージョンを作成しました:

  • 完全に書き直されたコード
  • 広範囲にコメントされているので、誰もが何が起こっているのか理解できることを願っています
  • 消費電力を削減するためにPIR動きセンサーを追加しました
  • DCF77スーパーフィルターを追加しました
  • 温度またはその他の用途(日の出/日の入り時間など)のための追加の表示

新しいDCF77アナライザー/時計v2.0の写真とビデオ:

デモ

ビデオを見るには、ここをクリックしてください

「おじいさんの時計」を組み込む

ビデオを見るには、ここをクリックしてください

デザイン

フロントパネルとケーシング:

フロントパネルのデザインは、Inkscapeと呼ばれるフリーウェアプログラムで作成されました(このページの冒頭にあるダウンロードURLを参照してください)。

実際にフロントパネルを作るのが一番大変でした。私は、レーザーカッターとアルミニウムのようなコーティングを施した特殊な種類のアクリルを使用して、地元のファブラボでそれを作るために多くのお金を費やしました。アイデアは、レーザーで穴を開け、下の黒いアクリルを露出させる非常に薄いコーティングを焼き払うことによってテキストと線を彫刻することでした。しかし、多くのユーザーによる頻繁な使用と「乱用」のために、レーザーカッターが必要な許容範囲内で生産できなかったため、これは悪夢でした。

それから私はオンライン写真サービスに出くわしました。それらはあらゆる種類の材料に印刷され、そのうちの1つはDiBondパネルでした。価格はとても良かった、送料込みで28ユーロ。しかし、私のデザインを1:1で印刷せず、わずかに拡大したため、最初はがっかりしました。 この方法を使用する場合は注意してください。最初に電話して、1:1で印刷できるかどうか尋ねてください。

電話の後、彼らは私に正しい寸法の別のパネルを送ってくれました。予想以上に良かった、すばらしい!

次に、多くのドリルとルーティングが必要でした:

コード

  • DCFアナライザー/クロックv2.1
  • スーパーフィルタースケッチ
DCFアナライザー/クロックv2.1 Arduino
2020-01-18バグリリース:省電力スイッチが修正されました
 / * ================================================================================DCF77アナライザー/クロックバージョン2 ================================================================================このスケッチはフリーソフトウェアです。フリーソフトウェアファウンデーションによって公開されているGNULesser General Public Licenseの条件の下で、再配布および/または変更することができます。ライセンスのバージョン2.1、または(オプションで)それ以降のバージョン。このスケッチは、役立つことを期待して配布されていますが、いかなる保証もありません。商品性または特定目的への適合性の黙示の保証もありません。詳細については、GNU劣等一般公衆利用許諾契約書を参照してください。このライブラリと一緒にGNU劣等一般公衆利用許諾契約書のコピーを受け取っているはずです。そうでない場合は、Free Software Foundation、Inc.、51 Franklin St、Fifth Floor、Boston、MA 02110-1301 USA ================================================================================私自身がArduinoとC ++の初心者であるため、このC ++コードは最適化にはほど遠いです。しかし、もう少し学んだ後でも、コードをシンプルで読みやすくしたいと思っています。そのため、何が起こっているのかを理解するのに役立つように、コードを過剰に文書化した可能性があります。 Erik de Ruiter 2014-2020 2014年5月最初のバージョン2016年3月-大規模なオーバーホール... 2016年7月-2.0クロックの構築から開始し、スケッチバージョン2.1の日付を適応させます2020-01-18-パワーセーフ機能が修正されました。バージョン2.0-このスケッチは、私の2.0バージョンのDCF / AnalyzerClockに適合しています。デフォルトではArduinoMEGAとDCFスーパーフィルターを使用し、多くの個別のLEDを駆動するために、Maxim7219チップの代わりにArduinoMegaのポートを使用しています。これは、多くの異なる電圧/電流仕様でLEDを駆動することは、マキシムチップで問題があるためです。たとえば、追加のLEDを点灯すると、すでにオンになっているLEDに影響を与えます(暗くします)。私は電子技術者ではないので、私の唯一の解決策はArduinoMegaの追加のポートを使用することでした。もちろん、トランジスタや追加のチップを使用してLEDを駆動することもできますが、私にとってはこれが明らかな解決策でした。 -すべてのMaximCommon Anodeディスプレイコードバージョン1.72を削除しました-オプション:アクティビティが検出されない場合は、安価なEbay PIR検出器を使用して、選択可能なディスプレイをシャットオフします。スイッチオフ遅延は、人が動いていないがディスプレイがオンになっている必要がある場合にディスプレイがシャットダウンしないように、ユーザーが設定できます。 -「POWERSAVINGOFFTIME」と「POWERSAVINGONTIME」の両方の値をゼロにすることで、ディスプレイの夜間シャットダウンを無効にできるようになりました。 -省電力モードで温度表示がオフにならない問題を修正しました。 --errorCounter表示が1時間ごとにリセットされませんでした-バージョン1.71を修正しました-深夜に温度の最小/最大メモリをリセットするユーザーオプションバージョン1.7:-温度表示の解像度が改善されました:DS18B20センサーの時間のために摂氏0.5から0.1度に温度を変換し、コードをクリーンに保つ必要があるため、温度表示は1分に1回更新されます。 -パリティチェックルーチンが最適化されました。 -不良DCFデータのより信頼性の高いチェックにより、無効なデータによるRTC更新を防止します。 -EoBエラーにより、内部LEDリングが正常にクリアされるようになりました。 -DCF OK LEDは、DCF信号の状態をより確実に表示するようになりました。エラーが発生した場合はすぐにオフになり、3つのパリティビットすべてに問題がない場合にのみオンになります。バージョン1.6:-1分に1回だけ計算するように温度関数を変更しました。 DS18B20センサーに温度を計算する時間を与えるために100msの遅延を使用したため、変更前に奇妙なエラーが発生しました。しかし、遅延関数はほとんどのC ++コードでは非常に悪い考えなので、私はついにそれを取り除きました。バージョン1.5:-scanSignal関数と残りのコードの完全なオーバーホール!私の最初の試みは機能しましたが、改善される可能性があります...- rPWおよびrPT LEDが意図したとおりに機能しなかったため、現在修正されています。 -バッファの終了エラーチェックルーチンが正常に機能するようになりました。 -着信DCF信号のパリティチェックを組み込みました。信号では3つのパリティビットが送信されるため、これらがチェックされ、3つすべてに問題がない場合にのみ、受信した時間情報が受け入れられ、表示が更新され、RTCが同期されます。必要に応じて、3つの追加のデュアルカラーLED(共通カソード)を取り付けて、3つのパリティビットのそれぞれが正常か失敗かを確認できます。 -すべてのPIN設定を1つの読みやすいテーブルにまとめることで、配線(または配線の変更)がはるかに簡単になったと思います-1つのDS18B20温度を使用している限り。センサー、コードを編集したので、I2Cデバイスのアドレスを把握する必要がなくなりました。 -コードの大幅なクリーンアップ...-ディスプレイをシャットオフすることによる省電力(時計は通常どおり機能します)は、2つの変数POWERSAVINGONTIMEとPOWERSAVINGOFFTIMEを編集することで、いくらか簡単に構成できるようになりました。 -いくつかの変数名を変更しました:-Maximインスタンス 'lc'および 'lc1'はMaximCCおよびMaximCAになりました-表示の説明MaximDcfTimeはDisplayTempWeekになりました-DCF77SOUNDPINはBUZZERSWITCHPINになりました-電源投入後のLED /ディスプレイテストが組み込まれました簡単な説明:電源オン:電源投入後、最初にLEDテストが実行されます。 LEDとディスプレイは、消費電力を低く抑えるために順番に点灯します。その後、時計はDCFパルスの受信を開始し、分マーク(2秒のギャップ)が検出されると、分マーカーLEDが点灯し、バッファーカウンターがリセットされます。内側のLEDリングは、バッファに保存されている着信DCFパルスを表示します。データの受信中の3つの瞬間に、パリティDCFビットがチェックされ、データが有効かどうかが確認されます。受信した有効なデータ:分の終わりに、分マークが検出された後(BF(バッファフル)LEDが点灯)、3つのパリティビットすべてがOK(「DCFOK」LEDが点灯)の場合、バッファ情報は次のようになります。時刻と日付の情報を抽出するために使用されます。次に、RTCクロックが更新され(「RTC同期」LEDが点灯)、内側のLEDリング情報が外側のLEDリングにコピーされます。時間、日付、週の表示、日のLED、夏/冬の時間、うるう年のLED情報が、新しい時間情報で更新されます。有効なデータがありません:ノイズの多い信号のために1つ以上のパリティビットがOKでない場合、DCF情報の受信は継続されますが、RTC、ディスプレイ、およびLEDの更新には使用されません。外側のLEDリング、「RTC同期」および「DCFOK」LEDがリセットされます。時間、日付、週、日LED、夏/冬時間LED、うるう年LEDは影響を受けず、最後に受信した有効な値を表示し続けます。 「PeriodTime」および/または「PeriodWith」エラーLEDはエラーを示し、エラーカウンターの表示が更新されます。 1時間ごとに、エラー表示はゼロに設定されます。ノイズの多い信号が原因でミニッツマークが検出される前に、さらにDCFパルスが受信されると、EoB、End of BufferLEDが点灯します。 (分マークが検出された場合、58ビット/パルス以下である必要があります)分マーカーの検出後、新しいサイクルが開始されます。温度:30秒のマークで、温度ディスプレイに最後のリセット後の過去の期間の最高値と最低値が表示されます。チャイム:CHIMEスイッチがON / HIGHの場合、毎時間の初めにチャイム(接続されている場合)が鳴ります。夜間、コード自体でユーザーが設定した時間に、チャイムは無効になります。省電力-ディスプレイのシャットオフこれは、省電力スイッチがHIGHの場合にのみ機能します。1。夜間のシャットオフユーザーが設定した時間に、ディスプレイは夜間にオフになり、朝にオンになります。 POWERSAVINGOFFTIME変数とPOWERSAVINGONTIME変数を見てください。 機能をチェックして、夜間にオフにしたいディスプレイを選択します。 2. PIRセンサーPIRセンサーを接続し、PIRオプションPOWERSAVE_BY_PIRとPIR_DELAY_TIMEでの遅延をアクティブにします。 PIR検出器が動きを感知するたびに、分カウンターがリセットされますが、PIR_DELAY_TIMEより長く動きが検出されない場合、ディスプレイはオフになります。動きが発生すると、ディスプレイはすぐにオンになります。注:前述のように、ディスプレイがオフになっている間、時計は正常に機能します。 DCFビープ音:ピンBUZZERSWITCHPINに接続されたスイッチを使用すると、受信したDCFビットが着信するのを聞くことができます。トーン持続時間はDCFビットのパルス幅に相当するため、100または200ミリ秒です。その他:RTCバッテリーが空であるか、接続障害が検出されると、RTCエラーLEDが点灯します。クレジット:私は、独自のDCF77デコーダーを作成したMatthiasDalheimerとThijsElenbaasの仕事から多くのことを学びました。彼らの仕事がなければ、どこから始めればいいのかわからなかったでしょう。私は自分のコードを(彼らのアイデアの断片を使って)書くことになったので、何が起こっているのかを理解できました...私のコードは効率的または高度ではありませんが、機能し、何が起こっているのかを知っています。興味深いウェブサイト:-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-はるかに多くのDCF77情報:http://www.picbasic.nl/indexes_uk.htm-My Flickr Webサイト:https://www.flickr.com/photos/edr1924/albums-My Githubウェブサイト:https://github.com/deruiter * /// ----------------------------------- -------------------------------------------------- --------------------- //ライブラリ// ------------------------ -------------------------------------------------- -------------------------------- // Arduino(新規)タイムライブラリ.........。 .......................... http://www.pjrc.com/teensy/td_libs_Time.html#include  // Arduino Uno、Megaなどを使用している場合はこの行を有効にします。#include  //基本的なDS1307ライブラリ時間をtime_tとして返すy .......... http://www.pjrc.com/teensy/td_libs_DS1307RTC.html#include  // Maxim7219はライブラリを表示します..... .............................. http://playground.arduino.cc/Main/LEDMatrix // !!!注:マキシムチップは通常、一般的なCATHODEディスプレイにのみ適しているため、Common Anodeサポートを取得するにはLedcontrol.hライブラリの特別なバージョンを使用する必要があります!#include  // SPIインターフェイスライブラリ...。 ...................................... http://arduino.cc/en/Reference/ SPI#include  // OneWireを使用すると、Maxim / Dallas製の1-Wireデバイス(DS18S20、DS18B20、DS1822など)にアクセスできます。 ............. http://www.pjrc.com/teensy/td_libs_OneWire.html// DallasTemperatureライブラリは、このすべての作業を実行できます。 ... http://milesburton.com/Dallas_Temperature_Control_Library#include  // ----------------------------- -------------------------------------------------- --------------------------- //読みやすいテーブルのArduinoUNOピン接続////入力-Rx-プログラミングに使用/ PCとの通信//出力-Tx-プログラミングに使用/ PCとの通信#define DCF77PIN 2 //入力-アンテナPCBからのDCF信号。ピンは入力を中断する必要があります!#definePIRDETECTORPIN 3 //入力-PIR検出器:ディスプレイをアクティブにするために部屋のアクティビティをチェックします#defineBUZZERSWITCHPIN 4 //入力-SWITCH-オン/オフDCF77 'ビープ音'ピエゾブザー/ ON =HIGH 、OFF =LOW#define CHIMESWITCHPIN 5 //入力-SWITCH-1時間ごとのチャイム音をオン/オフ/ ON =HIGH、OFF =LOW#define POWERSAVESWITCHPIN 6 //入力-SWITCH-省電力機能をオン/オフして表示常にオン/ ON =HIGH、OFF =LOW#define TEMPSENSORPIN 8 //入力-DallasOne Wire DS18B20温度センサー#defineTEMPRESETPIN 9 //入力-PUSHBUTTON-リセット温度最小/最大メモリ/ HIGH =reset#define MAXIMCCLD 10 //出力-CS / LOAD-マキシム7219チップへの疑似SPI接続-7セグメントディスプレイ#defineMAXIMCCCLK 11 //出力-CLOCK-マキシム7219チップへの疑似SPI接続-7セグメントディスプレイ#defineMAXIMCCDATA12 //出力-データ-マキシム7219チップへの疑似SPI接続-7セグメントディスプレイ// !!ピン22から53は、LEDの#define LED_SUNDAY 22 //出力-LED-Sunday#define LED_MONDAY 23 //出力-LED-Monday#define LED_TUESDAY 24 //出力-LED-Tuesday#define LED_WEDNESDAY 25 //にのみ使用されます。出力-LED-水曜日#define LED_THURSDAY 26 //出力-LED-木曜日#defineLED_FRIDAY 27 //出力-LED-金曜日#defineLED_SATURDAY 28 //出力-LED-土曜日#defineLED_CEST 29 //出力-LED-サマータイムCEST #define LED_CET 30 //出力-LED-冬季CET#define LED_LEAPYEAR 31 //出力-LED-飛躍年#defineLED_RTCERROR 32 //出力-LED-RTCデータの読み取りに問題があります(空のバッテリー/接続)#define LED_RTCSYNC 33 //出力-LED-RTCがDCF時間と正常に同期されるとオン#defineLED_TEMP 34 //出力-LED-温度が表示されます#defineLED_OPTION135 //出力-LED-オプションの1つのデータが表示されます#defineLED_OPTION236 //出力- LED-オプションの2つのデータが表示されます#defineLED_ERRORPT37 //出力-LED-DCF期間時間エラー#defineLED_ ERRORPW 38 //出力-LED-DCF期間幅エラー#defineLED_BUFFERFULL39 //出力-LED-バッファフルインジケータ、次にデータが分析されます#define LED_MINUTEMARKER 40 //出力-LED-バッファの前に検出されたDCFデータストリームの終了がいっぱいになると、データが破損します#define LED_BUFFEROVERFLOW 41 //出力-LED-信号が不良であるため、1分間に予想よりも多くのデータを受信しました#defineLED_DCFSTATUS 42 //出力-LED-良好なDCFデータがある場合にオン#defineLED_POWERSAVE 43 / /出力-LED-省電力モードがアクティブになり、一部のディスプレイがオフになります#define LED_PARITY1PASS 44 //出力-LED-パリティ1ビットはOKです#defineLED_PARITY1FAIL 45 //出力-LED-パリティ1ビットFAILED#define LED_PARITY2PASS 46 //出力-LED-パリティ2ビットはOK#define LED_PARITY2FAIL 47 //出力-LED-パリティ2ビットFAILED#define LED_PARITY3PASS 48 //出力-LED-パリティ3ビットはOK#define LED_PARITY3FAIL 49 //出力-LED-パリティ3ビットFAILED#define LED_PIRMOTION 50 //出力-LED-PIRがモーションを検出しているときにオン/ /アナログピン#defineBUZZER A7 //出力-DCF77のピエゾブザー 'ビープ音'(ブザーの '+'まで)#define SPEAKERVOLPIN A6 //出力-サウンドボードの音量-LOW =音量を1ノッチ下げます。 SPEAKERVOLUMEは、電源投入後にこの出力がアクティブ化される回数を決定します。 / DS1307RTCに使用// I2CCLOCK-リアルタイムクロックpcbに接続// -------------------------------- -------------------------------------------------- ------------------------ // DS18B20の初期化// -------------------- -------------------------------------------------- ------------------------------------ OneWire ds(TEMPSENSORPIN); // OnewireインスタンスDSを定義します// ------------------------------------------ -------------------------------------------------- -------------- //マキシム7219マトリックス表示の初期化// --------------------------- -------------------------------------------------- ----------------------------- / * clearDisplay(int addr).............。 ...............................選択した表示をクリアしますMaximCC.shutdown(int addr、boolean)..... .. .......................... MAX72XXを省電力モードからウェイクアップします(true =スリープ、false =アウェイク)MaximCC.setIntensity(int addr 、値).............................. Ledsに中程度の明るさを設定します(0 =min-15 =max)MaximCC .setLed(int addr、int row、int col、boolean state).......... led in row、columnをオンにします。インデックスは0から始まることを忘れないでください! MaximCC.setRow(int addr、int row、byte value)......................この関数は3つの引数を取ります。例:MaximCC.setRow(0,2、B10110000); MaximCC.setColumn(int addr、int col、byte value)...................この関数は3つの引数を取ります。例:MaximCC.setColumn(0,5、B00001111); MaximCC.setDigit(int addr、int digit、byte value、boolean dp)......この関数は、byte型の引数を取り、指定された列に対応する桁を出力します。有効な値の範囲は0..15からです。 0..9の間のすべての値は数字として出力され、10..15の間の値は、16進数に相当するMaximCC.setChar(int addr、int digit、char value、boolean dp).......として出力されます。 0 1 2 3 4 5 6 7 8 9 ABCDEFHLP; -。 、_ (空白またはスペース文字)POWERSAVESWITCHPIN *****使用しているデバイスの数を設定してください*****ただし、デフォルトの最大値である8MAX72XXも機能します。 LedConrol(DATAIN、CLOCK、CS / LOAD、NUMBER OF MAXIM CHIPS)* /// lcはマキシムディスプレイ用ですLedControlMaximCC =LedControl(MAXIMCCDATA、MAXIMCCCLK、MAXIMCCLD、7、false); // Maxim72xxのピンと使用する72xxの数を定義します// ----------------------------------- -------------------------------------------------- --------------------- //ユーザー設定、変数および配列定義// ------------------ -------------------------------------------------- -------------------------------------- //以下の値はPIN番号ではなく、サウンドボードの「低音量」入力がアクティブになる回数を設定する値//必要に応じて、電源投入後にサウンドボードの音量を下げることができます。#define SPEAKERVOLUME 12 //必要に応じて選択します起動後のすべてのLEDとディスプレイのテスト// '1' =はい、 '0' =いいえ#definePERFORM_LED_TEST 1 //ミリ秒単位の各7セグメント表示間の遅延#defineLEDTEST_DELAY_DISPLAYS 600 // LEDリング内の各LED間の遅延およびms#defineのその他のLED LEDTEST_DELAY_LED_RING 20 // DS18B20温度センサーを一度最高の解像度に構成するかどうかを選択します。//これは、モミ用のセンサーを使用した後に必要になります。 st時間。ソフトウェアを実行した後//この設定を1回オンにして、シャットオフします。// '1' =ON、 '0' =OFF#define CONFIGURE_DS18B20 0 // POWERSAVE TIME-MANDATORY values!夜の時間。これは、省電力表示のオンとオフの時間に使用されます//そしてチャイムがアクティブになるかどうかを決定します(日中)////省電力時にディスプレイのみがオフになり、時計は完全にアクティブなままになります。/ /いつでもディスプレイの電源オフを無効にするには、省電力スイッチをオフに設定するだけです////省電力スイッチをオンにします:設定された夜間にディスプレイがオフになります//そしてPOWERSAVE_BY_PIR機能がアクティブになっている場合//設定されたPIR_DELAY_TIMEの動きはありません。//省電力スイッチはオフ:常にオンに表示され、昼間のみチャイムが鳴ります。////値は「時間」形式であるため、午後8時は20:00ではなく「20」になります。または午後8時...#definePOWERSAVINGOFFTIME 9 //ディスプレイがアクティブ化されます#definePOWERSAVINGONTIME22 //ディスプレイがオフになります//ユーザーオプション:部屋にアクティビティがある場合にのみディスプレイをアクティブ化します// '1' =ON、 '0 '=OFF#define POWERSAVE_BY_PIR 1 //表示が停止する前に検出されなかった後待機する分単位の遅延#definePIR_DELAY_TIME 30 //温度をリセットするユーザーオプションmin /真夜中の最大メモリ//「1」=真夜中にリセット、「0」=手動リセットのみ#define TEMPRESET_MIDNIGHT 1 // ---------------------- -------------------------------------------------- ------- //その他のパラメータを定義します#defineDS1307_I2C_ADDRESS 0x68 // RTC I2Cアドレスを定義します#defineDCF_INTERRUPT 0 //ピンに関連付けられた割り込み番号//マキシム7219の定義表示番号配線シーケンス//最初のマキシム7219配線「デイジーチェーン」は「0」、次の「1」などである必要があります。 /表示輝度レベルの定義#defineBrightnessLedRingOuter1#define BrightnessLedRingInner 1#define BrightnessDisplayTime 1#define BrightnessDisplayDate 7#define BrightnessDisplayTempWeek 15#define BrightnessDisplayPeriodPulse 2#define BrightnessDisplayBufferBitError 15 // Pulse flanksstatic unsigned long LeadingEdge =0 tatic unsigned long trailingEdge =0; unsigned long previousLeadingEdge =0; // で使用されるvolatileunsigned int DCFSignalState =0; //割り込み変数は常に揮発性修飾子が必要です!! // 
 intで使用previousSecond =0; unsigned int previousSignalState =0; // DCFバッファーとインジケーターstaticint DCFbitBuffer [59]; //ここで、受信したDCFビットはstoredconst int bitValue [] ={1、2、4、8、10、20、40、80}; //これらは受信したDCFbitsの10進値です//新しい分に開始した後のみ、受信したビットを内部LEDに表示しますringboolean MinuteMarkerFlag =false; int bufferPosition =0; int previousMinute =0; int previousHour =0; //変数DCFビットがvaldboolであるかどうかを確認するにはdcfValidSignal =false; int dcfP1counter =0; int dcfP2counter =0; int dcfP3counter =0; int dcfParityCheckP1 =0; int dcfParityCheckP2 =0; int dcfParityCheckP3 =0; //デコードされたDCF時間を格納する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; //週数と日数の値を格納するために使用される変数int dayNumber; int weekNumber; //エラーカウンターvariableinterrorCounter =0; boolean errorCondition =false; //その他の変数booleandaytimeChange =true; boolean dayTime =false; int dcf77SoundSwitch =0; //温度変数bytepresent =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; // PIR検出器変数intpirActivity =0; int pirDisplaysState =1; unsigned int pirTimer =0; unsigned long previousTimePIR =0; // ==============================================================================//セットアップ// ==============================================================================void setup(){//シリアル通信を初期化しますSerial.begin(9600); // 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); // LEDピン22〜50を初期化しますfor(int i1 =22; i1 <=50; i1 ++){pinMode(i1、OUTPUT); } //変数、LEDディスプレイ、およびLEDのinitialize();を初期化します。 //ピンDCF_INTERRUPTでDCF77パルス割り込みを初期化し、信号の変化を探します。//立ち上がりエッジパルスまたは立ち下がりエッジパルスのいずれかが割り込みハンドラをトリガーし、// int0handler関数を実行します。 attachInterrupt(DCF_INTERRUPT、int0handler、CHANGE); // RTCを初期化し、SyncProviderとして設定します。 //後でRTCはDCF時間と同期されますsetSyncProvider(RTC.get); // RTCから時刻を取得する関数// RTCがシステム時刻を設定しているかどうかを確認if(timeStatus()!=timeSet){// RTCと同期できません-RTCErrorLEDをアクティブにしますdigitalWrite(LED_RTCERROR、HIGH); } else {// RTCがシステム時刻を設定しました--dimRTCError LED digitalWrite(LED_RTCERROR、LOW); } //電源を入れた後、Adafruitオーディオボードのスピーカーの音量を設定します//両方のピンをLOWに初期化します。これはデフォルトの出力状態ですdigitalWrite(SPEAKERVOLPIN、LOW); digitalWrite(CHIMEPIN、LOW); //サウンドボードのデフォルトの音量を「SPEAKERVOLUME」ステップで下げます(int i =0; i <=SPEAKERVOLUME; i ++){digitalWrite(SPEAKERVOLPIN、HIGH); delay(100); digitalWrite(SPEAKERVOLPIN、LOW); delay(100); } //次の関数は1回だけ実行する必要があります。 // DS18B20センサーの温度分解能を構成するために使用されますif(CONFIGURE_DS18B20 ==1){configureDS18B20(); } //テスト目的および/またはRTC時間を手動で設定するために使用します// setTime(23、59、40、31、12、13); // RTC.set(now()); //温度変換を要求しますcalculateTemp(); // LEDテストが必要かどうかを確認if(PERFORM_LED_TEST ==1){// LEDテストを実行ledTest(); } else {// LEDテストを行っていない場合は、DS18B20センサーがdelay(750);の準備ができるまで少し待つ必要があります。 } //センサーから温度を取得し、表示しますdisplayTemp(); // LEDテスト後にerrorCounter表示をアクティブにしますledDisplay(DisplayBufferBitError、 "R"、0);} // ==============================================================================// LOOP // ==============================================================================void loop(){//パルスの方向が変更されているかどうかを最初に確認します(立ち上がりまたはfall)//それ以外の場合は、同じパルスを評価し続けますif(DCFSignalState!=previousSignalState){// 'リセット'変数の状態previousSignalState =DCFSignalState; //着信パルスを評価しますscanSignal(); } //スイッチが変更されているかどうかを確認し、それに基づいて動作しますcheckSwitches(); // PIRの動きをチェックしますcheckPIR(); // 1秒、1分、または1時間に1回だけ発生する必要があるタスクを実行します// --------------------------------- ------------------------------------------- tasksEverySecond(); tasksEveryMinute();タスクEveryHour();} // ================================================================================================================////関数名:processDcfBit //呼び出し元: ////目的:受信した信号を評価します。 「1」または「0」のどちらを受信したかを判断し、//パルスタイミングが制限内にあるかどうかを確認します//パラメータ:なし//戻り値:なし//// ================================================================================================================/ *パルスパルス幅幅|-| |-| | ----- END OF MINUTEマーカー:2000ms ----- | ___ _______ ___ ___ _______ | 0 | | 1 | | 0 | | 0 | | 1 | | | | | | | | | | | | | | | | | | | | | ______ | | _______________ | | ___________ | | ___________________________________ | | _______________ | | __ _ _ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1000 2100 2000 2200 30003100パルスなし50005100 6000 6200 <<例millis()値=分の終わりの表示^ ^ ^ ^ ^ DCFbit#56 DCFbit# 57 DCFbit#58 DCFbit#0 DCFbit#1など... < 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;戻る; } //-------------------------------------------------------------------- // 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();}

カスタムパーツとエンクロージャー

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

回路図

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

製造プロセス

  1. 鳩時計
  2. Arduinoハメ撮りビジョンクロック
  3. Arduinoを使用したDIYの最もシンプルなIV9Numitron時計
  4. Adafruit 1/460リングネオピクセルを使用したシンプルな掛け時計
  5. Simple Word Clock(Arduino)
  6. イスラムの祈りの時間とArduino時計
  7. Arduino Spybot
  8. FlickMote
  9. マスタークロック
  10. ArduinoTemp。 3.2ディスプレイを備えたモニターとリアルタイムクロック
  11. DS1302RTCを備えたシンプルな目覚まし時計