Ingo Hoffmann
Published © GPL3+

Genaue Echtzeituhr abfragen

Das Grove Uhrmodul ist leicht abzufragen, wenn man die richtigen I2C Register nutzt und die richtige Entkodierung.

IntermediateProtip1 hour414
Genaue Echtzeituhr abfragen

Things used in this project

Hardware components

Calliope mini
Calliope mini
×1
Seeed Studio Grove - High Precision RTC
×1

Story

Read more

Code

Grove RTC Modul ansprechen

JavaScript
Einfach kopieren und in den PXT Editor unter JavaScript einfügen
let year = 0
let month = 0
let weekday = 0
let day = 0
let hours = 0
let minutes = 0
let seconds = 0
let rtcModule = 0
input.onButtonPressed(Button.A, () => {
    // Sonntag, 29. Oktober 2017, 21:55 Uhr (0 Sekunden)
    pins.i2cWriteNumber(0x51, 0x0021, NumberFormat.UInt16BE) // control 1 stop
    pins.i2cWriteNumber(0x51, 0x0400, NumberFormat.UInt16BE) // seconds
    pins.i2cWriteNumber(0x51, 0x0555, NumberFormat.UInt16BE) // minutes
    pins.i2cWriteNumber(0x51, 0x0621, NumberFormat.UInt16BE) // hours
    pins.i2cWriteNumber(0x51, 0x0729, NumberFormat.UInt16BE) // day
    pins.i2cWriteNumber(0x51, 0x0800, NumberFormat.UInt16BE) // weekday
    pins.i2cWriteNumber(0x51, 0x0910, NumberFormat.UInt16BE) // month
    pins.i2cWriteNumber(0x51, 0x0a17, NumberFormat.UInt16BE) // year
    pins.i2cWriteNumber(0x51, 0x0001, NumberFormat.UInt16BE) // control 1 start
})
input.onButtonPressed(Button.B, () => {
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE)
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE)
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE) % 256
    seconds = (rtcModule / 16 * 10) + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE) % 256
    minutes = (rtcModule / 16 * 10) + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE) % 256
    hours = (rtcModule / 16 * 10) + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE) % 256
    day = (rtcModule / 16 * 10) + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE) % 256
    weekday = (rtcModule / 16 * 10) + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE) % 256
    month = (rtcModule / 16 * 10) + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE) % 256
    year = (rtcModule / 16 * 10) + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE)
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE)
    if (weekday == 0) {
        serial.writeString("Sonntag")
    } else if (weekday == 1) {
        serial.writeString("Montag")
    } else if (weekday == 2) {
        serial.writeString("Dienstag")
    } else if (weekday == 3) {
        serial.writeString("Mittwoch")
    } else if (weekday == 4) {
        serial.writeString("Donnerstag")
    } else if (weekday == 5) {
        serial.writeString("Freitag")
    } else {
        serial.writeString("Samstag")
    }
    serial.writeString(", " + day.toString() + ". ")
    if (month == 1) {
        serial.writeString("Januar")
    } else if (month == 2) {
        serial.writeString("Februar")
    } else if (month == 3) {
        serial.writeString("März")
    } else if (month == 4) {
        serial.writeString("April")
    } else if (month == 5) {
        serial.writeString("Mai")
    } else if (month == 6) {
        serial.writeString("Juni")
    } else if (month == 7) {
        serial.writeString("Juli")
    } else if (month == 8) {
        serial.writeString("August")
    } else if (month == 9) {
        serial.writeString("September")
    } else if (month == 10) {
        serial.writeString("Oktober")
    } else if (month == 11) {
        serial.writeString("November")
    } else {
        serial.writeString("Dezember")
    }
    serial.writeString(" 20" + year.toString() + ", ")
    serial.writeString(hours.toString() + ":")
    if(minutes < 10) {
        serial.writeString("0")
    }
    serial.writeString(minutes.toString() + " Uhr und " + seconds.toString() + " Sekunden.")
    serial.writeLine("")
})
basic.forever(() => {

})

Updated Code (new MakeCode Version (May 2020)

JavaScript
updated according to info from @DL1EKM
let year = 0
let month = 0
let weekday = 0
let day = 0
let hours = 0
let minutes = 0
let seconds = 0
let rtcModule = 0
input.onButtonPressed(Button.A, () => {
    // Sonntag, 29. Oktober 2017, 21:55 Uhr (0 Sekunden)
    pins.i2cWriteNumber(0x51, 0x0021, NumberFormat.UInt16BE) // control 1 stop
    pins.i2cWriteNumber(0x51, 0x0400, NumberFormat.UInt16BE) // seconds
    pins.i2cWriteNumber(0x51, 0x0555, NumberFormat.UInt16BE) // minutes
    pins.i2cWriteNumber(0x51, 0x0621, NumberFormat.UInt16BE) // hours
    pins.i2cWriteNumber(0x51, 0x0729, NumberFormat.UInt16BE) // day
    pins.i2cWriteNumber(0x51, 0x0800, NumberFormat.UInt16BE) // weekday
    pins.i2cWriteNumber(0x51, 0x0910, NumberFormat.UInt16BE) // month
    pins.i2cWriteNumber(0x51, 0x0a17, NumberFormat.UInt16BE) // year
    pins.i2cWriteNumber(0x51, 0x0001, NumberFormat.UInt16BE) // control 1 start
})
input.onButtonPressed(Button.B, () => {
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false)
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false)
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false) % 256
    seconds = Math.idiv(rtcModule, 16) * 10 + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false) % 256
    minutes = Math.idiv(rtcModule, 16) * 10 + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false) % 256
    hours = Math.idiv(rtcModule, 16) * 10 + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false) % 256
    day = Math.idiv(rtcModule, 16) * 10 + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false) % 256
    weekday = Math.idiv(rtcModule, 16) * 10 + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false) % 256
    month = Math.idiv(rtcModule, 16) * 10 + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false) % 256
    year = Math.idiv(rtcModule, 16) * 10 + rtcModule % 16
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false)
    rtcModule = pins.i2cReadNumber(81, NumberFormat.UInt16BE, false)
    if (weekday == 0) {
        serial.writeString("Sonntag")
    } else if (weekday == 1) {
        serial.writeString("Montag")
    } else if (weekday == 2) {
        serial.writeString("Dienstag")
    } else if (weekday == 3) {
        serial.writeString("Mittwoch")
    } else if (weekday == 4) {
        serial.writeString("Donnerstag")
    } else if (weekday == 5) {
        serial.writeString("Freitag")
    } else {
        serial.writeString("Samstag")
    }
    serial.writeString(", " + day.toString() + ". ")
    if (month == 1) {
        serial.writeString("Januar")
    } else if (month == 2) {
        serial.writeString("Februar")
    } else if (month == 3) {
        serial.writeString("März")
    } else if (month == 4) {
        serial.writeString("April")
    } else if (month == 5) {
        serial.writeString("Mai")
    } else if (month == 6) {
        serial.writeString("Juni")
    } else if (month == 7) {
        serial.writeString("Juli")
    } else if (month == 8) {
        serial.writeString("August")
    } else if (month == 9) {
        serial.writeString("September")
    } else if (month == 10) {
        serial.writeString("Oktober")
    } else if (month == 11) {
        serial.writeString("November")
    } else {
        serial.writeString("Dezember")
    }
    serial.writeString(" 20" + year.toString() + ", ")
    serial.writeString(hours.toString() + ":")
    if(minutes < 10) {
        serial.writeString("0")
    }
    serial.writeString(minutes.toString() + " Uhr und " + seconds.toString() + " Sekunden.")
    serial.writeLine("")
})
basic.forever(() => {

})

Credits

Ingo Hoffmann

Ingo Hoffmann

1 project • 8 followers
Maker, Friedenauer, Alba-Fan
Thanks to Stephan Noller, Matthias L. Jugel, and Michael Klein.

Comments