ベルリン時計
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 13 | ||||
| × | 11 | ||||
| × | 1 |
このプロジェクトについて
まず第一に...
これは、InstructablesWebサイトで作成したチュートリアルからのコピー/貼り付けです。あるサイトから別のサイトにどのように移動するかを理解する必要があります。ですから、これは本来あるべきほど滑らかではないかもしれません...しかし、それほど毎日ではない時計から始めましょう。
イントロ:ベルリン時計
ベルリンの時計、BerlinUhrまたはMengenlehreuhrは、おそらく最初のデジタル時計でした。
1975年以来そこにあります...
ここで見つけることができる多くの情報:https://en.wikipedia.org/wiki/Mengenlehreuhr
どのように作られていますか、どのように時間を教えていますか?
つまり、4列のライトがあります。上の行は時間x5を示し、次の行は1から4までの「1時間」を示します。3番目の行は「分x5」を示し、下の行は分を示します。
示されている写真では(実際には1つのランプが壊れています...)時間は次のとおりです:2x5時間+3時間+ 6x5分+2分。
つまり、13:32です。 OK、私たちヨーロッパ人は24時間で時間を伝えるのに慣れていると思います。フォーマット、時計もそうです。
上部の最大のライトが毎秒点滅します。
この時計はArduinoで作るのが楽しいかもしれないと思いました。
ステップ1:一部の電子機器
このプロジェクトには何が必要ですか?
まず第一に、(もちろん)私たちのArduino。
コンピューターの近くにある宇野の1つを使用しています。
時計について話しているので、RTCを使用する場合があります。 DS1307で安価なものを使用しました。
「ディスプレイ」には、いくつかのLEDが必要です。私は13個の黄色のもの、5mm、11個の赤を使用しました。 (赤が足りなかったので、実際には赤にRGBを使用しました...)
ブレッドボード、穴と「はんだ島」のみのプリントボード。いわゆる「ユーロカードフォーマット」の一部を使用しました。
私が使用した2つの抵抗器。 220オーム(秒LED)の1つと、68Kのもう1つ。
そしてもう1つのIC:MAX7219。
MAXは8桁のLEDディスプレイドライバです。 LEDマトリックスにも使用されているので、私たちの多くはそれを知っています。
簡単にするために、「LedControl」Arduinoライブラリも使用しました。それでもお持ちでない場合は、こちらからダウンロードできます:
https://github.com/wayoda/LedControl
ステップ2:設定します。
そのMAX7219の非常に優れたデータシートは、次の場所にあります。
https://www.sparkfun.com/datasheets/Components/Gen ...
COM-09622-MAX7219-MAX7221.pdfそのデータシートについてはこれ以上説明しませんが、使用する価値があります。一種の「楽しい」ICです。
Arduinoへのジャンプ。
そのスキームでは、非常に単純な構造が見られます。SDAとSCLを使用してクロック(A 1307ブレークアウト)を使用し、さらに4つの出力:MAX 7219に接続するDataIn、Clock、Chipselect、およびOUT13を使用します。 「秒」LEDが点滅します。
<図>
ほとんどのことがArduinoで発生します。時計を読み取り、それをさまざまな種類の出力に変換してから、データを7219に送信します。
コードを読むと、私が自分の言語であるオランダ語を使用していることがわかります。例:私が使用するint "vijfuren"は、 "vijfminuten"と "vijfminuten1"と同じ、 "Five-hours"をカウントする変数です。これらは "Five-minutes"出力を提供します。
スケッチでは、年、月、日、平日も使用しています。このスケッチでは、これらは必要ありませんが、後でカレンダーを追加することができます。
Fritzing(c)レイアウトでは、ICは配線されていません。出力が多いので、簡単にするために配線しました。
それらを要約しましょう:
<図>
ピン4と9はGNDに接続されています
19はVCCです
18、ISetは抵抗でVCCに接続されています。これは出力に流れる電流を制限します。最初は20Kの抵抗で試してみましたが、10分ほどですべてが暗くなりました... 68Kの抵抗でも、時計はまだ動いています(24時間以上経っても)。しかし、赤と黄色の明るさには違いがあります。これは、赤が実際にはRGBLEDであるためだと思います。私はそれを整理する必要があります...
ピン1はDataInで、これはArduino、ピン12からのものです
ピン12はロードで、Arduinoピン10から来ています
ピン13はClkで、Arduino11から来ています。
これまでのところ、7219の入力についてです。
出力を見てみましょう:
7219には、87セグメントディスプレイに電力を供給する可能性があります。
これらの出力、DIG0からDIG4は、LEDの「ライン」を駆動するためにここで使用されます。「5分」ラインには11個のLEDがあるため、DIG1とDIG2を使用してそれらを駆動します。
>その他の出力:セグメントAからG(通常の7Segディスプレイの)DP。
この場合(LedControlを使用)、バイナリワードを送信します(B01010100などのバイト形式)。
そしてそこで私は間違いを犯しました。一部のロジックでは、SEG AがMSB、Bが2番目に上位のビット、というように、DPが最下位ビット(LSB)になると考えていました。間違った...何らかの理由で、ICのメーカーはDPがMSBになると考えていました。その論理がわかりません...
すでにLEDをはんだ付けしているので、コーディングを変更しました...
ステップ3:LED
この回路図では、LEDがどのように接続されているかがわかります。私は最初の3つだけを描きましたが、他は同じように進みます。
<図>
秒LEDはピン13に直接接続されています。
写真は「仕組み」を示しています。 17時47分です...
<図>わかりました。一番下の行はそれほど明確ではありません。ブレッドボード上にあります。私はあなたがそれが本当にうまくいくと私を信じてくれることを願っています。 (そうです!)
ああ、これからもう1つのステップ...
ステップ4:コードの「最後」のステップ。
#include #include const int DS1307 =0x68; // A5 =SCL、A4 =SDA const char * days [] ={"Sunday"、 "Monday" 、 "火曜日"、 "水曜日"、 "木曜日"、 "金曜日"、 "土曜日"}; const char * months [] ={"1月"、 "2月"、 "3月"、 "4月"、 "5月"、 「6月」、「7月」、「8月」、「9月」、「10月」、「11月」、「12月」};バイト秒=0;バイト分=0;バイト時間=0;バイト平日=0;バイトmonthday =0;バイト月=0;バイト年=0;バイトlastMinute =0;バイトlastSecond =0; int Led =13;バイトnul =B0000000;バイトeen =B01000000;バイトトゥイー=B01100000;バイトドライブ=B01110000;バイトvier =B01111000;バイトvijf =B01111100;バイトzes =B01111110;バイトzeven =B01111111;バイトacht =B11111111;バイトネゲン=B01000000;バイトtien =B01100000;バイトエルフ=B01110000; Int a =0; int b =0; int c =0; int vijfMinTwee =0; int uitgang =LOW; / *ピン12はDataInに接続されていますピン11はCLKに接続されていますピン10はLOADに接続されています* / LedControl lc =LedControl(12、11、10、1); unsigned long delaytime =100; void setup(){Wire.begin(); Serial.begin(9600); pinMode(Led、OUTPUT); lc.shutdown(0、false); / *明るさを中程度の値に設定します* / lc.setIntensity(0、8); / *表示をクリアします* / lc.clearDisplay(0);} void loop(){readTime(); digitalWrite(Led、uitgang); if(second!=lastSecond){if(uitgang ==LOW)uitgang =HIGH;それ以外の場合、uitgang =LOW; digitalWrite(Led、uitgang); lastSecond =秒; } if(minute!=lastMinute){printTime(); lastMinute =minutes;}} byte bcdToDec(byte val){return((val / 16 * 10)+(val%16));} void printTime(){char buffer [3]; longminuten =minute; long uren =時間; intvijfmin =minutesn / 5; int eenminuut =minutesn-(vijfmin * 5); int vijfuren =uren / 5; int eenuren =uren-(vijfuren * 5); a =vijfmin; Digitaal(); vijfmin =b; vijfMinTwee =c; a =eenminuut; digitaal(); eenminuut =b; a =vijfuren; Digitaal(); vijfuren =b; a =eenuren; Digitaal(); eenuren =b; lc.setRow(0、4、vijfuren); lc.setRow(0、3、eenuren); lc.setRow(0、1、vijfmin); lc.setRow(0、2、vijfMinTwee); lc.setRow(0、0、eenminuut);} void readTime(){Wire.beginTransmission(DS1307); Wire.write(byte(0)); Wire.endTransmission(); Wire.requestFrom(DS1307、7);秒=bcdToDec(Wire.read());分=bcdToDec(Wire.read());時間=bcdToDec(Wire.read());平日=bcdToDec(Wire.read());月日=bcdToDec(Wire.read());月=bcdToDec(Wire.read());年=bcdToDec(Wire.read()); } void digitaal(){switch(a){case 0:b =nul; c =nul;壊す;ケース1:b =een; c =nul;壊す;ケース2:b =トゥイー; c =nul;壊す;ケース3:b =drie; c =nul;壊す;ケース4:b =vier; c =nul;ブレーク;ケース5:b =vijf; c =nul;壊す;ケース6:b =zes; c =nul;壊す;ケース7:b =zeven; c =nul;壊す;ケース8:b =acht; c =nul;壊す;ケース9:b =acht; c =ネゲン;壊す;ケース10:b =acht; c =tien;壊す;ケース11:b =acht; c =エルフ;壊す; }}
かなり簡単だと思います。
このスケッチのもう1つの利点は、オランダ語で数える方法を学ぶことです... 0から11まで...;-)
これを楽しんでください!
マーク
コード
Github
https://github.com/wayoda/LedControlhttps://github.com/wayoda/LedControl製造プロセス