バレンタインデーの贈り物:DIY 交際日数カウンター
必要な部品と材料
| 部品 | 詳細 | 数量 |
|---|---|---|
| リアルタイムクロック (RTC) | DS3231 | 1 |
| Arduino KYX-5461AS 4桁7セグメントディスプレイ | 1 | |
| ブレッドボード (汎用) | 1 | |
| ジャンパーワイヤー (汎用) | 1 | |
| Arduino UNO | 1 | |
| 抵抗 1kΩ | 1 |
このプロジェクトについて
2017年9月、大学2年生の時に素敵な女性と出会いました。彼女と彼女の友人たちと共同生活を始め、同じフロアで過ごすうちに親友になり、数ヶ月後に交際をスタート。記念日は2017年12月10日(イギリス式日付)です。
交際1周年を目前に、何か特別なプレゼントをと思案していたところ、専攻の電子工学を活かしたアイデアが浮かびました。交際開始日からの日数をカウントし、写真立てに組み込んで二人の写真と一緒に飾る装置を作ることにしたのです。
この記事を見つけたあなたは、記念日のプレゼントを探しているのかもしれませんし、単に面白そうなプロジェクトを探しているのかもしれません。どちらにしても、楽しく作れるプロジェクトです。作り方を詳しく解説します。
このプロジェクトで唯一難しいのはコード部分です。サンプルコードを用意しました。コンパイルしてアップロードすれば、私の交際記念日が表示されますが、コメントで自分の記念日に書き換えられるようにしてあります。
ぜひ楽しんで作ってみてください!
コード
DaysCounter.ino (C/C++)
事前準備として以下が必要です:
- Arduino IDE
- RTCライブラリ (ZIPファイル)
- 7セグメントライブラリ (ZIPファイル)
両ライブラリをArduino IDEのlibrariesフォルダに保存し、IDEで「スケッチ」→「ライブラリをインクルード」→「ZIP形式のライブラリをインストール」で追加してください。
日付の設定方法: コードの7行目 DateTime dtBegin (2017, 12, 9, 0, 0, 0); の最初の3数字(年、月、日)を交際開始日に書き換えてください。例:2014年4月6日なら 2014, 4, 6 に変更。
#include <RTClib.h>
#include <SevSeg.h>
SevSeg sevseg;
RTC_DS3231 rtc;
DateTime dtBegin(2017, 12, 9, 0, 0, 0); // ここを自分の記念日に変更!
TimeSpan tsPassed;
void showInfo(const DateTime& dt) {
Serial.print("NOW:");
Serial.print(dt.year(), DEC); Serial.print('/');
Serial.print(dt.month(), DEC); Serial.print('/');
Serial.print(dt.day(), DEC); Serial.print(' ');
Serial.print(dt.hour(), DEC); Serial.print(':');
Serial.print(dt.minute(), DEC); Serial.print(':');
Serial.print(dt.second(), DEC); Serial.print("\tPASSED:");
Serial.print(tsPassed.days(), DEC); Serial.print(' ');
Serial.print(tsPassed.hours(), DEC); Serial.print(':');
Serial.print(tsPassed.minutes(), DEC); Serial.print(':');
Serial.print(tsPassed.seconds(), DEC); Serial.println();
}
void delayWithUpdate(uint32_t parDelay) {
uint32_t started = millis();
while (millis() < started + parDelay) {
sevseg.refreshDisplay();
}
}
void setup() {
Serial.begin(9600);
Serial.println(__TIME__);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1); // エラー時は停止
}
delay(1000);
// 初回のみ時刻合わせ用(その後はコメントアウトして再アップロード)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
byte numDigits = 4;
byte digitPins[] = {7, 8, 9, 10};
byte segmentPins[] = {2, 3, 4, 5, 11, 12, 13, 6};
bool resistorsOnSegments = false;
byte hardwareConfig = COMMON_CATHODE;
bool updateWithDelays = false;
bool leadingZeros = false;
bool disableDecPoint = true;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins,
resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(100);
sevseg.setNumber(1234, 1);
delayWithUpdate(1000);
sevseg.setNumber(8888, 1);
delayWithUpdate(1000);
}
void loop() {
sevseg.refreshDisplay();
DateTime now = rtc.now();
tsPassed = now - dtBegin;
static uint32_t nextReportMillis = 0;
static uint16_t prevDaysPassed = 0;
if (tsPassed.days() != prevDaysPassed) {
prevDaysPassed = tsPassed.days();
sevseg.setNumber(prevDaysPassed, 0);
}
if (millis() > nextReportMillis) {
showInfo(now);
nextReportMillis = millis() + 5000;
}
}
回路図
回路図は circuito.io で確認できます。リンクを開き「Add Components」で以下を追加してください:
- RTC
- 7セグメントディスプレイ 20mm(Genericを選択、SparkFunではない)
表示される図に従ってジャンパーワイヤーで各ピンを接続してください。
製造プロセス
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- スマート駐車場カウンター:Arduino、Processing、PHPでリアルタイム車両管理
- Arduinoで高速・高精度RPM測定 – レーザーとIRセンサーによる新アルゴリズム
- Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
- ゲーム用カスタムArduinoジョイスティックハンドルの製作
- ArduinoとTEA5767で作る高性能FMラジオ受信機
- Arduino 101で作る万歩計:DHT11温湿度センサー&LCD表示付き