The code still needs some improvement, notably a way to “snooze” the alarm. And perhaps some devious trick to prevent a sleepy user from turning it off (a math test, perhaps!). And I need to work a bit more on the enclosure, to make it easier to build without a 3D printer.
But that’s just icing. My bad old alarm clock has now been officially retired!