ゆるく楽しむプログラミング

RTCを使ってチャイムを鳴らそう

RTC(リアルタイムクロック:要するに時計ユニット)を使って決まった時刻にチャイムを鳴らしてみます。
時計ユニットを付ければ時刻を知ることが出来るのですが、いかんせんmicro:bitは表示能力が (´・ω・`) なので工夫してみました。

チャイムはガチャポンで入手した「学校のチャイム」を使用します。
何でも良い…と言うか、よく考えたら自前で音を出してもよかったですね。
実のところガチャありきで利用方法をでっち上げた…のでこんな事になってます。



ばらしてみたらタクトスイッチを使っており更にうまい事に端子が空いていたのでココからコードを引き出して利用しています。


接続はこんな感じ。
micro:bitとRTCはI2Cインターフェイスで接続していますので、電源、GND、SDA、SDLをそれぞれ接続すればOK
micro:bitは19番がSCL、20番がSDAになっています。

今回使用した部品はトランジスタ 2SC1815Y:適当なところでコレクタ電流が飽和すればなんでも良いです(多分)。
ベースに1KΩの抵抗を付けてあります。
RTCユニットはDS1307 RTC リアルタイムクロックモジュール
Arduino用になってますが、micro:bitでも問題なく使えました。
【割と重要】RTCユニット使用時の注意


回路図に乗ってないけど後の動画には載ってるLEDはデバック用に付けたものです、毎度毎度キンコンカンコンなるのも煩くてウザイかったので。

makecodeの[拡張機能]を選んでメニューからRTCを検索、DS1307を選択します。
すると、DS1307用のブロックが増えます。




----- ▼ MP4動画 「ブロックされているコンテンツを許可」 しないと見えないかも -----

-----

ソースコード

makecodeブロック図(PFD)

// Aボタンを押すと時刻が12:00にセットされます。
// 日付はこの際気にしない。
input.onButtonPressed(Button.A, function () {
    DS1307.DateTime(
    2021,
    1,
    11,
    1,
    12,
    00,
    0
    )
})

// Bボタンを押すと直ちにチャイムが鳴ります。
input.onButtonPressed(Button.B, function () {
    basic.showIcon(IconNames.Yes)
    ch = 1
    tp = input.runningTime()
    chmin = DS1307.getMinute()
    pins.digitalWritePin(DigitalPin.P0, 1)
    pins.digitalWritePin(DigitalPin.P1, 1)
})

let disp = ""
let m = ""
let h = ""
let tm = 0
let chmin = 0
let tp = 0
let ch = 0
DS1307.start()
pins.digitalWritePin(DigitalPin.P0, 0)
pins.digitalWritePin(DigitalPin.P1, 0)
ch = 0
tp = 0
chmin = 0

// チャイムを鳴らす時刻は時間x100+分の数値で配列に羅列しておきます。
let list = [1200, 1300, 700, 845, 1730, 915, 1540]
basic.showIcon(IconNames.TShirt)
basic.forever(function () {
    if (ch == 0) {
        tm = DS1307.getHour() * 100 + DS1307.getMinute()
        for (let value of list) {
            if (value == tm) {
                if (ch == 0) {
                    basic.showIcon(IconNames.Rollerskate)
                    ch = 1
                    tp = input.runningTime()
                    pins.digitalWritePin(DigitalPin.P0, 1)
                    pins.digitalWritePin(DigitalPin.P1, 1)
                }
            }
        }
    }
    if (ch == 0) {
        if (DS1307.getHour() < 10) {
            h = "0" + convertToText(DS1307.getHour())
        } else {
            h = convertToText(DS1307.getHour())
        }
        if (DS1307.getMinute() < 10) {
            m = "0" + convertToText(DS1307.getMinute())
        } else {
            m = convertToText(DS1307.getMinute())
        }
        disp = "" + h + ":" + m
        basic.showString(disp)
        basic.pause(2000)
    } else {
        if (ch == 1) {
            basic.showIcon(IconNames.Heart)
            if ((input.runningTime() - tp) / 1000 > 30 && chmin != DS1307.getMinute()) {
                pins.digitalWritePin(DigitalPin.P0, 0)
                pins.digitalWritePin(DigitalPin.P1, 0)
                ch = 0
            }
        }
    }
})