概要
一般的に時計は時刻を確認したい時に時刻表示が必要ですが、常時表示している必要はありません。
そこで人感センサーを使用し間欠動作することで低消費電力化を図り、また暗所でも見ることができるように
発光する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
さんが
2021/02/27
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する