massaJPN が 2021年02月27日20時21分04秒 に編集
初版
タイトルの変更
人感センサー付き7セグメント時計
タグの変更
秋葉原2021
Arduino
7segment
時計
メイン画像の変更
記事種類の変更
製作品
本文の変更
# 概要 一般的に時計は時刻を確認したい時に時刻表示が必要ですが、常時表示している必要はありません。 そこで人感センサーを使用し間欠動作することで低消費電力化を図り、また暗所でも見ることができるように 発光する7セグメントLEDを使用したデジタル時計を作成してみました。 ![完成形](https://camo.elchika.com/5b47755cc27125348b2d3cd9110a1882879347c5/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30303030313165312d373162662d346564352d383966352d3833636434656630326232372f34643538643930332d316432632d343839322d386537362d396162616638656637633838/) # 構成 LED表示部の上段は年月日、下段は時分秒の時刻表示としています。 ### *ハードウェア* 主に以下の部品で構成されています。 ・Arduino Nano [互換機] 1個 ・人感センサー [SB412A] 1個 ・8桁7セグメントLEDモジュール [MAX7219] 2個 ・リアルタイムクロック(RTC)モジュール [DS3231] 1個 配線はブレッドボード上で組み上げました。 Arduino NanoにLEDモジュール、人感センサー、RTCモジュールを結線し、電源には9V電池を使用しました。 筐体を3Dプリンターで作成し、時計の上に小物を置けるようにしました。 ![内部構造](https://camo.elchika.com/3157e882304334649ba60c65cefe9b9646f9a68c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30303030313165312d373162662d346564352d383966352d3833636434656630326232372f62386437623434612d366434382d346363372d393664622d626362653634343961326166/) ジャンパ線で複雑に見えますが、結線は次の通りです。 | Arduino | RTCモジュール | |:---:|:---:| | A5 | SCL | | A4 | SDA | | 5V | VCC | | GND | GND | | Arduino | 人感センサー | |:---:|:---:| | D2 | Vout | | 5V | VCC | | GND | GND | | Arduino | LEDモジュール1(IN)| LEDモジュール1(OUT) | LEDモジュール2 | |:---:|:---:|:---:|:---:| | D5 | DIN | DOUT | DIN | | D6 | CS | LOAD | CS | | D7 | CLK | CLK | CLK | | 5V | VCC | VCC | VCC | | GND | GND | GND | GND | | Arduino | Battery | |:---:|:---:| | VIN | 9V | | GND | GND | ### *ソフトウェア* Arduino IDEにて作成しています。 メインのスケッチは以下となります。 なお、メインのスケッチの書き込みの前にRTCモジュールへ現在時刻の書き込みが必要です。 ```html:7segment_LED_Clock.ino /* 7セグメントLED デジタル時計 */ #include "LedControl.h" #include <Wire.h> #include <RtcDS3231.h> #include <avr/sleep.h> RtcDS3231<TwoWire> Rtc(Wire); LedControl lc = LedControl(5,7,6,2); //5-DIN,7-CLK,6-CS,numer of unit void setup() { pinMode(2, INPUT); set_sleep_mode(SLEEP_MODE_PWR_DOWN); Serial.begin(9600); lc.setIntensity(0,0); lc.setIntensity(1,0); lc.clearDisplay(0); lc.clearDisplay(1); Rtc.Begin() ; } void loop() { interrupt(); Serial.println("In operation"); delay (300); while(digitalRead(2)){ lc.shutdown(0,false); lc.shutdown(1,false); lc.setIntensity(0,1); lc.setIntensity(1,1); RtcDateTime dt = Rtc.GetDateTime() ; lc.setDigit(0,7,dt.Hour()/10%10,false); lc.setDigit(0,6,dt.Hour()%10,true); lc.setDigit(0,4,dt.Minute()/10%10,false); lc.setDigit(0,3,dt.Minute()%10,true); lc.setDigit(0,1,dt.Second()/10%10,false); lc.setDigit(0,0,dt.Second()%10,false); lc.setDigit(1,7,dt.Year()/10%10,false); lc.setDigit(1,6,dt.Year()%10,true); lc.setDigit(1,4,dt.Month()/10%10,false); lc.setDigit(1,3,dt.Month()%10,true); lc.setDigit(1,1,dt.Day()/10%10,false); lc.setDigit(1,0,dt.Day()%10,false); } lc.shutdown(0,true); lc.shutdown(1,true); lc.setIntensity(0,0); lc.setIntensity(1,0); lc.clearDisplay(0); lc.clearDisplay(1); } void interrupt(){ attachInterrupt(0,wakeUp,RISING); Serial.println("In Sleep"); delay (300); PRR = PRR | 0b00100000; sleep_mode(); detachInterrupt(0); } void wakeUp(){ Serial.println("Wake up"); delay (300); PRR = PRR & 0b00000000; } ``` # 最後に 電池駆動にしているのですが、LEDの消費電力が大きいために3日ほどで電池がなくなります。 使用条件に合わせて、ACアダプターを使用する、電池容量を増やす、あるいはLEDの代わりに消費電力の少ない表示デバイスに変更するなど工夫の余地があります。