Introduction: DIY LED Matrix Message Display With Raspberry Pi

About: Mechatronic Engineer - 10 years of experience in software development, but maker in my heart

⚠️ AI-Enhanced Content

Transform your Raspberry Pi Zero 2W into a customizable LED matrix message display! DotNote lets you show scrolling messages controlled from any device on your network through a clean web interface or simple API. Perfect for door signs, notifications, workshop status, or creative displays.

What makes DotNote special:

  1. Clean, modern web interface
  2. Simple REST API for integrations
  3. Custom 3D printed case with IKEA Skadis mount option
  4. Fully configurable and open source
  5. Buzzer notification feedback


Supplies

Electronics

  1. 1x Raspberry Pi Zero 2W
  2. 1x MAX7219 LED Matrix Display (4x 8x8 modules = 32x8 red LEDs)
  3. 1x Buzzer (optional, any GPIO-compatible buzzer)
  4. 5x Female-to-female jumper wires
  5. 1x MicroSD card (8GB minimum, 16GB recommended)
  6. 1x USB power supply (5V, 2A minimum)
  7. 1x Micro USB cable

Hardware

  1. 6x M2.5 screws (for case assembly)

3D Printing

  1. PLA filament (~50g)
  2. 3D printer

Software

  1. Raspberry Pi OS (latest version)
  2. Python 3.12 (included in Raspberry Pi OS)

Tools

  1. Soldering iron (if buzzer needs header pins)
  2. Screwdriver (for M2.5 screws)
  3. Computer for initial Raspberry Pi setup

Step 1: Prepare the Raspberry Pi

Install Raspberry Pi OS

  1. Download Raspberry Pi Imager from raspberrypi.com
  2. Insert your microSD card into your computer
  3. Open Raspberry Pi Imager
  4. Choose "Raspberry Pi OS (32-bit)" or "Raspberry Pi OS Lite"
  5. Select your microSD card
  6. Click the gear icon (⚙️) for advanced options:
  7. Set hostname (e.g., "dotnote")
  8. Enable SSH
  9. Set username and password
  10. Configure WiFi (SSID and password)
  11. Click "Write" and wait for completion

First Boot

  1. Insert the microSD card into your Raspberry Pi Zero 2W
  2. Connect power and wait ~2 minutes for first boot
  3. Find your Pi's IP address (check your router or use: ping dotnote.local)
  4. SSH into your Pi: ssh pi@[IP-ADDRESS] or ssh pi@dotnote.local


Step 2: Enable SPI Interface

The MAX7219 LED matrix uses SPI communication, which must be enabled on the Raspberry Pi.

Enable SPI:



bash

sudo raspi-config

Navigate using arrow keys:

  1. Select "Interface Options"
  2. Select "SPI"
  3. Select "Yes" to enable
  4. Select "Finish"
  5. Reboot when prompted: sudo reboot

Verify SPI is enabled:

After reboot, SSH back in and run:



bash

lsmod | grep spi

You should see spi_bcm2835 or similar in the output.

Step 3: Wire the LED Matrix

Connect the MAX7219 LED matrix to your Raspberry Pi following this wiring diagram:

MAX7219 to Raspberry Pi Zero 2W:



MAX7219 VCC → Raspberry Pi Pin 2 or 4 (5V Power)
MAX7219 GND → Raspberry Pi Pin 6 (Ground)
MAX7219 DIN → Raspberry Pi Pin 19 (MOSI / GPIO 10)
MAX7219 CS → Raspberry Pi Pin 24 (CE0 / GPIO 8)
MAX7219 CLK → Raspberry Pi Pin 23 (SCLK / GPIO 11)
```

**Important Notes:**
- Use 5V power for VCC (not 3.3V) - the LEDs need 5V to be bright
- Double-check your connections before powering on
- Keep wires as short as possible to reduce interference

**Optional: Connect Buzzer**
```
Buzzer Positive → Raspberry Pi Pin 16 (GPIO 23)
Buzzer Negative → Raspberry Pi Pin 14 (Ground)

Step 4: Install Software Dependencies

SSH into your Raspberry Pi and run these commands:

Update system packages:



bash

sudo apt-get update
sudo apt-get upgrade -y

Install required system packages:



bash

sudo apt-get install -y python3-pip python3-dev git

Clone the DotNote repository:



bash

cd ~
git clone https://github.com/SebasPinto/DotNote-py.git
cd DotNote-py

Install Python dependencies:



bash

pip3 install -r requirements.txt

This will install:

  1. Flask (web server)
  2. luma.led-matrix (LED control)
  3. gpiozero (GPIO/buzzer control)
  4. And all other dependencies


Step 5:

Test the Installation

Before mounting everything in a case, let's test that it works!

Run DotNote:

bash

python3 dotnote.py
```

You should see output like:
```
============================================================
DotNote - LED Matrix Message Display
============================================================
Server starting on 0.0.0.0:5000
LED Matrix: 4 cascaded devices
Buzzer: Enabled
Logging: Enabled
============================================================
```

Test the display:


Your LED matrix should now show "Welcome to DotNote!" scrolling across.


Test the web interface:


1. Find your Pi's IP address: `hostname -I`

2. On another device (phone/computer) on the same network, open a browser

3. Go to: `http://[YOUR-PI-IP]:5000`

4. You should see the DotNote web interface

5. Type a message and click "Update Display"

6. Watch it scroll on your LED matrix!


If it works, press `Ctrl+C` to stop the server. We'll set it up to run automatically later.


Step 6: 3D Print the Case

Download the STL files from:


- MakerWorld/Printables:

  1. https://makerworld.com/en/models/1947147-dotnote-led-matrix-case
  2. https://www.printables.com/model/1466398-dotnote-led-matrix-case

-Print Settings:

  1. Layer Height: 0.2mm
  2. Infill: 15% Supports: Yes (minimal, mainly for screw posts)
  3. Material: PLA
  4. Print Time: ~3-4 hours total
  5. Filament: ~50g

Step 7: Assemble the Case

What you need:

  1. 3D printed case parts
  2. Raspberry Pi Zero 2W (with software installed)
  3. MAX7219 LED Matrix
  4. 6x M2.5 screws
  5. Buzzer (optional)
  6. All wiring connected

Assembly steps:

  1. Place LED matrix into case bottom: The LED matrix should fit snugly in the designated slot
  2. Orient it so the LEDs face outward through the front opening
  3. Position Raspberry Pi Zero 2W: Place the Pi in its designated compartment
  4. Route cables
  5. Ensure all GPIO connections are secure
  6. Add buzzer (optional) Mount buzzer in the designated space
  7. Connect to GPIO 23 and GND
  8. Ensure no wires will be pinched when closing the case
  9. Attach top cover: Choose either Skadis mount or flat top
  10. Align screw posts carefully
  11. Insert 6x M2.5 screws and tighten gently
  12. Don't overtighten - PLA can crack!

Mounting options:

  1. Skadis Top: Hang on IKEA Skadis pegboard
  2. Flat Top: Place on desk or shelf


Step 8: Configure DotNote (Optional)

You can customize DotNote by editing the configuration section at the top of dotnote.py.

Common customizations:


# Change scroll speed (lower = faster)
SCROLL_SPEED = 0.03 # Default is 0.05

# Change brightness (0-15)
BRIGHTNESS = 10 # Default is 5

# Change default message
DEFAULT_MESSAGE = "Your Custom Message! "

# Disable buzzer
BUZZER_ENABLED = False

# Change buzzer GPIO pin
BUZZER_PIN = 24 # Default is 23

# Change server port
SERVER_PORT = 8080 # Default is 5000

# Disable logging
LOG_ENABLED = False

If your display is upside down or rotated:


# Try different values: -90, 0, 90, 180
BLOCK_ORIENTATION = 90

# Try different values: 0, 1, 2, 3
ROTATE = 2

Save the file after making changes: Ctrl+X, then Y, then Enter

Step 9: Set Up Auto-Start on Boot

Make DotNote start automatically when your Raspberry Pi boots up.

Create systemd service file:



bash

sudo nano /etc/systemd/system/dotnote.service

Paste this content (adjust paths if different):


ini

[Unit]
Description=DotNote LED Matrix Display
After=network.target

[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/DotNote-py
ExecStart=/usr/bin/python3 /home/pi/DotNote-py/dotnote.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Save with Ctrl+X, then Y, then Enter

Enable and start the service:



bash

sudo systemctl daemon-reload
sudo systemctl enable dotnote.service
sudo systemctl start dotnote.service

Check status:



bash

sudo systemctl status dotnote.service

You should see "active (running)" in green.

Useful commands:



bash

sudo systemctl stop dotnote # Stop service
sudo systemctl restart dotnote # Restart service
sudo journalctl -u dotnote -f # View live logs


Step 10: Using DotNote

Web Interface:

  1. Open browser on any device on your network
  2. Go to: http://[YOUR-PI-IP]:5000
  3. Enter your message
  4. Click "Update Display"
  5. Watch it scroll!

API Usage:

Update messages from command line, scripts, or other programs:



bash

# Simple curl command
curl "http://[YOUR-PI-IP]:5000/update?message=Hello%20World"

Python example:



python

import requests

requests.get('http://192.168.1.100:5000/update',
params={'message': 'Hello from Python!'})

Integration ideas:

  1. Home Assistant automation
  2. Cron jobs for scheduled messages
  3. Motion sensor triggers
  4. Weather updates
  5. GitHub notifications
  6. Meeting room status

Troubleshooting

LED matrix not lighting up:

  1. Check VCC is connected to 5V (not 3.3V)
  2. Verify all 5 wires are connected correctly
  3. Check SPI is enabled: lsmod | grep spi
  4. Try different BLOCK_ORIENTATION values in config

Display is garbled or upside down:

  1. Edit dotnote.py configuration section
  2. Try BLOCK_ORIENTATION = 90 or 180 or -90
  3. Try ROTATE = 1 or 2 or 3

Can't access web interface:

  1. Verify Pi and your device are on same WiFi network
  2. Check if service is running: sudo systemctl status dotnote
  3. Try using IP address instead of hostname
  4. Check firewall: sudo ufw status

Buzzer not working:

  1. Verify wiring (positive to GPIO 23, negative to GND)
  2. Check BUZZER_ENABLED = True in config
  3. Try different GPIO pin in config

Service won't start:

  1. Check logs: sudo journalctl -u dotnote -n 50
  2. Verify paths in service file are correct
  3. Make sure dotnote.py has no syntax errors

Characters not displaying correctly:

  1. Some special characters aren't supported
  2. Stick to ASCII characters for best results
  3. The error will show on display: "Error: Unsupported character"