massaJPNのアイコン画像
massaJPN 2021年02月27日作成
製作品 製作品 閲覧数 2080
massaJPN 2021年02月27日作成 製作品 製作品 閲覧数 2080

人感センサー付き7セグメント時計

人感センサー付き7セグメント時計

概要

一般的に時計は時刻を確認したい時に時刻表示が必要ですが、常時表示している必要はありません。
そこで人感センサーを使用し間欠動作することで低消費電力化を図り、また暗所でも見ることができるように
発光する7セグメントLEDを使用したデジタル時計を作成してみました。
完成形

構成

LED表示部の上段は年月日、下段は時分秒の時刻表示としています。

ハードウェア

主に以下の部品で構成されています。
・Arduino Nano [互換機] 1個
・人感センサー [SB412A] 1個
・8桁7セグメントLEDモジュール [MAX7219] 2個
・リアルタイムクロック(RTC)モジュール [DS3231] 1個
配線はブレッドボード上で組み上げました。
Arduino NanoにLEDモジュール、人感センサー、RTCモジュールを結線し、電源には9V電池を使用しました。
筐体を3Dプリンターで作成し、時計の上に小物を置けるようにしました。
内部構造
ジャンパ線で複雑に見えますが、結線は次の通りです。

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モジュールへ現在時刻の書き込みが必要です。

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の代わりに消費電力の少ない表示デバイスに変更するなど工夫の余地があります。

massaJPNのアイコン画像
電子工作を介してプログラミングも趣味的に楽しんでいます。ブログも見ていただけると嬉しいです。 https://massa4649.com
ログインしてコメントを投稿する