[How To] Digital Alarm Clock with Matrix Led 4x8x8

Raspberry projects

[How To] Digital Alarm Clock with Matrix Led 4x8x8

Messaggio da leggereda root » 06/10/2018, 7:51

I've done a lot of searching but haven't found any tutorial about how to create a simple alarm digital clock with MAX7219 Matrix Led 4x8x8 (nice piece of hardware), all the tutorials I found are just for Arduino :cry:

So I decided to create my own one ;) .

This is the complete and simple tutorial.


Total cost: about 60 Euro
Difficulty = easy
Time = 1 hour
Skills required = dummy :lol:



Hardware requisites:

- one 5V 3A power supply, or better two: one 5V 2A for "Raspberry + amplifier" and one 5V 1A for "Led matrix".
- Raspberry Pi1 512 or above
- Raspbian Stretch Lite on 4 GB sd card (or bigger)
- USB Wifi dongle - optional (for Pi1 and Pi2, not needed for Pi3)
- RTC Module (DS3231 suggested)
- MAX7219-LED-4x8x8-Matrix
- 5V 2W mini audio amplifier (mono is OK)
- 2W Mini speaker(s)
- a plastic box
- some wires (arduino jumper wires)

---------------------------------------------------------
Max Mem usage: less than 100 Mbytes
Max CPU usage: less than 30% @ RP1 no overclock
---------------------------------------------------------

Important Notes:
connect the Vcc pin of the Led Matrix directly to the 5V of the power supply, do not connect it to the Raspberry +5V pins.
All GND pins ('ground' or '-') of Raspberry, Amplifier and MAX7219 Led matrix, need to be connected together (just one pin per board)
The audio amplifier gets +5V directly to the +5V (pin 2 or 4) of the raspberry

[hr][/hr]

Raspberry
Immagine

RTC
Immagine

RTC installation
Immagine

MAX7219 Led Matrix module
Immagine

Pin-out description on the bottom side
Immagine

BOX
Immagine

Immagine

Immagine

Immagine

Immagine

Stereo mini audio amplifier
Immagine

Immagine

I decided to solder the audio wires from raspberry to the amp, but you can use the 3.5 audio connector as well.

Immagine

Finished project :)
note: in this picture the TIME is shifted to the right, I modified the code to better center it, also the leds bright is settable (see code comments)
Immagine

You can also add scrolling text to the clock (there is a little startup demo in my code):

Immagine

[hr][/hr]
[hr]
[/hr]

You might use Raspberry Zero, but you need a mini adapter like this, to have an audio connection output (HDMI to VGA/Audio):

Immagine

[hr][/hr]

Raspberry GPIO pin-outs (needed for connecting MAX7219-LED matrix)
Immagine
Maurizio
Avatar utente
root
Amministratore
 
Messaggi: 390
Iscritto il: 10/04/2012, 10:55
Località: Turin

Re: [How To] Digital Alarm Clock with Matrix Led 4x8x8

Messaggio da leggereda root » 06/10/2018, 7:52

- Installation of RTC (real time clock module with backup battery):

https://thepihut.com/blogs/raspberry-pi ... spberry-pi

- MAX7219 Driver installation:

https://luma-led-matrix.readthedocs.io/ ... requisites

- Matrix pin-outs connections to Raspberry:

https://luma-led-matrix.readthedocs.io/ ... o-pin-outs

- My Digital Clock Python script:

Codice: Seleziona tutto
sudo nano /root/clock.py


Codice: Seleziona tutto
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2017-18 Richard Hull and contributors
# See LICENSE.rst for details.
# MAX7219-LED-4x8x8-Matrix digital clock By Lovisolo Pier Maurizio - Italy

import re
import time
import argparse
import locale
import datetime

# NOTE: change the following according to your locale setting
locale.setlocale(locale.LC_ALL,'it_IT.UTF-8')

from luma.led_matrix.device import max7219
from luma.core.interface.serial import spi, noop
from luma.core.render import canvas
from luma.core.virtual import viewport
from luma.core.legacy import text, show_message
from luma.core.legacy.font import proportional, CP437_FONT, TINY_FONT, SINCLAIR_FONT, LCD_FONT
from itertools import repeat

def demo(n, block_orientation, rotate):
    # create device for linear preassembled 4x8x8 max7219 matrix
    serial = spi(port=0, device=0, gpio=noop())
    device = max7219(serial, cascaded=4, block_orientation=-90)
    device.contrast(0x05)
    print("Created device")
    # note: change device.contrast value (0xXX) to change leds brightness

    # start scrolling text demo - just once at startup
    msg = "DIGITAL CLOCK by Lovisolo Pier Maurizio - 2018"
    print(msg)
    show_message(device, msg, fill="white", font=proportional(LCD_FONT), scroll_delay=0.05)

    # MAX7219 4x8x8 LED Matrix Clock
    for _ in repeat(None):
     time.sleep(1)
     msg = time.asctime()
     msg= time.strftime("%H%M")
     with canvas(device) as draw:
      text(draw, (1, 0), msg, fill="white")
    time.sleep(1)
    pass


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='matrix_demo arguments',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('--cascaded', '-n', type=int, default=1, help='Number of cascaded MAX7219 LED matrices')
    parser.add_argument('--block-orientation', type=int, default=0, choices=[0, 90, -90], help='Corrects block orientation when wired vertically')
    parser.add_argument('--rotate', type=int, default=0, choices=[0, 1, 2, 3], help='Rotate display 0=0°, 1=90°, 2=180°, 3=270°')

    args = parser.parse_args()

    try:
        demo(args.cascaded, args.block_orientation, args.rotate)
    except KeyboardInterrupt:
        pass


Audio for alarm clock (MP3 player):

Codice: Seleziona tutto
sudo apt-get install madplay


My crontab for alarm wakeup and "hour/ half hour" bell (you might use any MP3 audio you like):

Codice: Seleziona tutto
crontab -e


insert the following:

Codice: Seleziona tutto
# Big-Ben bell every hour from 09:00 to 22:00
00 09-22 * * * /usr/bin/madplay /root/westminster_classic.mp3
#
# haf hour bell 09:30 to 22:30
30 09-22 * * * /usr/bin/madplay /root/mezzora.mp3
#

# Wake up at 07:00 Mon to Fri
00 07 * * 1-5 /usr/bin/madplay /root/church.mp3
Maurizio
Avatar utente
root
Amministratore
 
Messaggi: 390
Iscritto il: 10/04/2012, 10:55
Località: Turin

Re: [How To] Digital Alarm Clock with Matrix Led 4x8x8

Messaggio da leggereda root » 06/10/2018, 7:52

Digital Clock autostart at boot:

Codice: Seleziona tutto
sudo nano /etc/rc.local


put the following just before "exit 0" line:

Codice: Seleziona tutto
/usr/bin/python /root/clock.py &


[hr][/hr]

Immagine

I also connected a blue led directly to GPIO 22 without any resistor :o ,
but I used this python script to reduce gpio output voltage by controlling the PWM duty cycle ;)
and also to start pulsing the led (dim to brighten and viceversa).
You might use this led as a visible alarm for something.

NOTE: never connect red, orange, yellow or green LEDs directly to the GPIO without a series resistor!
You might directly connect a blue or a white led to the gpio since those leds have higher drop voltage (at your own risk).

Codice: Seleziona tutto
#!/usr/bin/python3
# script to connect a "blue" or "white" led directly to gpio pin and control it
# never connect red, orange, yellow or green LED directly to the GPIO without a series resistor

import RPi.GPIO as GPIO # always needed with RPi.GPIO 
from time import sleep  # pull in the sleep function from time module 

GPIO.setmode(GPIO.BCM)  # choose BCM or BOARD numbering schemes. I use BCM 

GPIO.setup(22, GPIO.OUT)# set GPIO 22 as output for blue led 

white = GPIO.PWM(22, 100)    # create object white for PWM on port 22 at 100 Hertz 

white.start(0)              # start white or blue led on 0 percent duty cycle (off) 

# now the fun starts, we'll vary the duty cycle to   
# dim/brighten the led 

pause_time = 0.01           # you can change this to slow down/speed up 

try:
    while True:
        for i in range(0,50):      # 50% to reduce max output voltage 
            white.ChangeDutyCycle(i)
            sleep(pause_time)
        for i in range(50,-1,-1):      # from 50% to zero in steps of -1 
            white.ChangeDutyCycle(i)
            sleep(pause_time)

except KeyboardInterrupt:
    white.stop()            # stop the white PWM output 
    GPIO.cleanup()          # clean up GPIO on CTRL+C exit 


How to determine the right resistor value for different types of led:

Immagine

notes and translation:
volt caduta = led drop voltage
infrarosso = infrared
valori standard resistenze = standard resistor values in ohm (x10, x100, x1000, etc.)
all the colors are self-explanatory ;)
Raspberry GPIO output voltage is 3.3V
the drop resistor has to be connected in series to one of the two terminals of the led (better to the catode +)
LED catode (+) is the longer terminal
Maurizio
Avatar utente
root
Amministratore
 
Messaggi: 390
Iscritto il: 10/04/2012, 10:55
Località: Turin

Re: [How To] Digital Alarm Clock with Matrix Led 4x8x8

Messaggio da leggereda root » 10/10/2018, 11:39

Just an improvement:

Let the raspberry say current date and time:

1) install picotts, offline text to speech:

Codice: Seleziona tutto
sudo apt-get install libttspico-utils


2) create the code:

Codice: Seleziona tutto
sudo nano /root/time.sh


insert the following:

Codice: Seleziona tutto
#!/bin/sh
# Clock says in English: date, day of the week and hour
data=$(date +%d%B)
pico2wave -l en-GB -w /tmp/data.wav "<volume level='55'><pitch level='105'> today is the"$data
data1=$(date +%A)
pico2wave -l en-GB -w /tmp/data1.wav "<volume level='55'><pitch level='105'>"$data1
ora=$(date +"%H:%M")
cadena=$(echo $ora | sed 's/\:00/and zero/g')
pico2wave -l en-GB -w /tmp/ora.wav "<volume level='55'><pitch level='105'>the current time is"$cadena"minutes"
aplay -r 8000 -t wav -c 2 -f S16_LE -D plughw:0,0 /tmp/data.wav
aplay -r 8000 -t wav -c 2 -f S16_LE -D plughw:0,0 /tmp/data1.wav
aplay -r 8000 -t wav -c 2 -f S16_LE -D plughw:0,0 /tmp/ora.wav


3) give the right permisions to the script

Codice: Seleziona tutto
sudo chmod 755 /root/time.sh


4) launch the script:

Codice: Seleziona tutto
/bin/sh /root/time.sh


[hr][/hr]

Note: Picotts supported languages : ‘en-US’, ‘en-GB’, ‘de-DE’, ‘es-ES’, ‘fr-FR’, ‘it-IT’.
On some Raspbian release, this package is missing but you can just copy the arm deb package from debian.
Maurizio
Avatar utente
root
Amministratore
 
Messaggi: 390
Iscritto il: 10/04/2012, 10:55
Località: Turin

Re: [How To] Digital Alarm Clock with Matrix Led 4x8x8

Messaggio da leggereda root » 10/10/2018, 11:39

Update:

I noticed that connecting the +Vcc of the mini audio amplifier to the 3.3V pin instead of the 5V pin of Raspberry, the high frequency digital noise is much less audible, probably because Raspberry has the 3.3V line more filtered and stabilized than the 5V.

By looking at the data sheet I found that this little amp can work with power supply voltage from DC 2.5 to 5.5V
Maurizio
Avatar utente
root
Amministratore
 
Messaggi: 390
Iscritto il: 10/04/2012, 10:55
Località: Turin


Torna a Raspberry

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron