Introduction
In today’s technology-driven world, efficient communication is crucial. Traditional notice boards, often requiring manual updates, are increasingly being replaced by modern solutions. A Bluetooth controlled notice board using the HC-05 Bluetooth module and Arduino UNO exemplifies this shift, offering wireless, real-time updates. The HC-05 module facilitates communication with Bluetooth-enabled devices like smartphones, while the Arduino UNO, a versatile microcontroller, processes and displays messages on an LCD screen or LED matrix. This setup allows for convenient remote updates, making it ideal for schools, colleges, offices, and public spaces. The project highlights the practical application of Bluetooth technology and microcontrollers, providing an excellent learning opportunity in electronics and wireless communication. This innovative system offers ease of use, flexibility, and potential for enhancements like multi-board integration and added security, representing a significant advancement in information display technology.
The main parts of this project are the Arduino UNO, a flexible microcontroller that acts as the system’s brain, and the HC-05 Bluetooth module, which enables wireless connection. Instantaneous message display from a Bluetooth-enabled device, like a tablet or smartphone, is made possible by the HC-05 Bluetooth module on the notice board. This is a useful and practical solution for a variety of locations, including offices, public areas, colleges, and schools, as it removes the requirement for physical access to the notice board for updates.
About P10 Display
A P10 display, also known as a P10 LED module, is a high-resolution, dot matrix LED display commonly used for creating dynamic and vibrant digital signage. The “P10” designation refers to the 10mm pixel pitch, meaning the distance between the centers of adjacent pixels is 10 millimeters. This pixel pitch provides a good balance between display clarity and cost, making P10 displays popular for both indoor and outdoor applications.
P10 displays consist of an array of LEDs arranged in a matrix, typically 32×16 pixels per module. They are capable of displaying text, graphics, animations, and videos with high brightness and wide viewing angles, ensuring visibility even in bright daylight conditions. The modular nature of P10 displays allows for scalability; multiple modules can be connected to create larger screens, making them suitable for a range of uses from small information boards to large billboards.
- Pin1 (OE) – is the enable pin and it is used to control the brightness of the panel.
- Pin2 (A) and Pin3 (B) are the two selection line to select from multiple rows.
- Pin8 (CLK), Pin10 (SCLK), and Pin12 (DATA): are the control and data pins of the shift register.
- P10 display uses SPI communication to communicate with Arduino. So, in our code, we will use the SPI library.
Hardware Requirements
Notice: There might be affiliate links to Amazon on this page. which implies that I may receive a tiny commission from the sale. This may be your way of indirectly assisting me. Regards
Software Requirements
- Arduino IDE
- DMD Library
- TimerOne Library
Block Diagram

Circuit Diagram

Circuit Explanation
To connect a P10 display to an Arduino UNO, connect the P10 module’s data input (DIN) to the Arduino’s digital pin (usually D8). Connect the P10 module’s CLK, LAT, and OE pins to Arduino’s D9, D10, and D11 respectively. Power the P10 module with 5V and GND from the Arduino. Use appropriate libraries to control the display.
Follow the below table and create own circuit.
P10 Display | Arduino UNO |
PIN1 (OE) | D9 |
PIN2 (A) and PIN3 (B) | D6 and D7 respectively |
PIN8 (CLK) | D13 |
PIN10 (SCLK) | D8 |
PIN12 (DATA) | D11 |
To connect the HC-05 Bluetooth module to an Arduino UNO, connect the HC-05’s VCC to 5V and GND to GND on the Arduino. Connect the RXD pin of the HC-05 to the TX (D1) pin of the Arduino and the TXD pin of the HC-05 to the RX (D0) pin of the Arduino.
HC-05 | Arduino UNO |
Tx | Pin2 (Rx of software serial) |
Rx | Pin3 (Tx of software serial) |
VCC | 5v |
GND | GND |
Source Code
#include <SPI.h>//SPI.h must be included as DMD is written by SPI (the IDE complains otherwise)
#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"
#include "Arial_black_16.h"
#include <SoftwareSerial.h>// import the serial library
SoftwareSerial testserial(2, 3); // RX, TX
//Fire up the DMD library as dmd
#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
//number max of characters in your message
#define max_char 100
char message[max_char]; // stores you message
char r_char; // reads each character
byte index = 0; // defines the position into your array
int i;
char greeting[] = "MyEngineeringStuffs";
void ScanDMD()
{
dmd.scanDisplayBySPI();
}
void setup(void)
{
//initialize TimerOne's interrupt/CPU usage used to scan and refresh the display
Timer1.initialize( 5000 );//period in microseconds to call ScanDMD. Anything longer than 5000 (5s) and you can see flicker.
Timer1.attachInterrupt( ScanDMD );//attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI()
//clear/init the DMD pixels held in RAM
dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on)
testserial.begin(9600); //Software serial initialization
Serial.begin(9600);
strcpy(message,greeting);
}
void loop(void)
{
//check if serial is avaible an before reading a new message delete's the old message
if(testserial.available())
{
for(i=0; i<99; i++){
message[i] = '\0';
Serial.print(message[i]);
}
//resests the index
index=0;
}
//while is reading the message
while(testserial.available() > 0){
//the message can have up to 100 characters
dmd.clearScreen( true );
if(index < (max_char-1))
{
r_char = testserial.read(); // Reads a character
message[index] = r_char; // Stores the character in message array
index++; // Increment position
}
}
//prepares the display to print our message
dmd.selectFont(Arial_Black_16);
//displays the message
dmd.drawMarquee(message ,max_char,(32*DISPLAYS_ACROSS)-1 ,0);
long start=millis();
long timer=start;
boolean ret=false;
while(!ret)
{
if ((timer+30) < millis()) {
ret=dmd.stepMarquee(-1,0);
timer=millis();
}
}
}