⏰ Unusual watches from ping-pong balls

The design, on which he stopped, uses 12 balls for each digit, after some experiments it turned out that this allowed us to get the clearest idea of the numbers.

This amazing LED watch is a fairly simple project that almost everyone can do.

Since the ping-pong balls are not oriented in the matrix, the author had to come up with a good way to display numbers. The design, on which he stopped, uses 12 balls for each digit, after some experiments it turned out that this allowed us to get the clearest idea of the numbers.

In total, the entire display took 128 balls.

 Step 1: Materials / Tools:

  • MDF 80 * 30 cm (you can replace the MDF laminate or fiberboard)
  • 128 ping-pong balls (white, preferably milky white)
  • Small furniture nails
  • An old USB cable (to power the Arduino nano)
  • Cable with plug from unnecessary equipment
  • Power supply 5V 10A
  • Arduino Nano
  • LED tape ws2812b (5m, 30 LEDs / meter, class IP30)
  • DS3231 Real Time Clock Module
  • Wire with 3 wires (2+ meters)


  • Miter saw (or a sufficient level of skill to cut exactly under 30 degrees without it)
  • Hacksaw
  • Soldering iron
  • Drill or screwdriver
  • 32 mm crown
  • Wood glue
  • Hot melt glue gun (with glue)
  • Torch
  • Sandpaper


Ball selection is an important part. Ping-pong balls usually have a seam that connects two hemispheres together. This in itself is not a problem, since, with the correct arrangement of the balls, this joint will ultimately not be visible on the display. However, often the balls have the logo of the manufacturer’s company, which will be cut out in the process. It is necessary to look that the logo would not lay down on a seam, and was on one of the parties of a hemisphere. Colored balls also do not fit. It is advisable to use seamless ping-pong balls without printing, but not all of these can be bought.

Step 2: Cutting the Balls


Each ball will have its own LED. In order to achieve the best light transmission and good dispersion, the balls must be cut off on one side, making a kind of ceiling of it (example: as on street lights). These holes should be large enough (about 30 mm) since it does not always turn out to position the LEDs strictly in the center.

To do this, a hole with a diameter of 32 mm is drilled in a piece of dense material, a ball is pressed against this hole and, on the other hand, the projecting part is cut by a hacksaw. The logo should get onto the cut-off part, if there is one, and to make sure that there is no seam on the “front” – the ball is highlighted with a flashlight. This complicates the task, it is for this reason that it is desirable to use seamless balls.

Step 3: Gluing the balls in rows

Having made holes in all ping-pong balls, they must be glued together in rows (2 rows of 17, 18 and 19 balls each, and one row of 20). These rows should be as straight as possible, and there should be no gap between the balls. It is convenient to do this by placing the balls between the two slats, placing their holes upwards. After that, the balls are glued together with a small amount of hot melt on each side. The glue should be a bit, otherwise, it will be seen in the end.

Step 4: Gluing the rows

Step 5: Frame

Step 6: Solder the LED strip

The LED strip must be cut into segments (one part of 1 LED, one of three LEDs, one of 5 LEDs and 17 of 7 LEDs). The segments are connected by wire according to the picture (1 LED, then 5, then all the segments of 17, and at the end – 3 LEDs).




Step 7: Back Wall

The back wall is cut out of MDF or MDF along the inner perimeter of the assembled frame, onto which the LED tape will be glued. The arrangement of the LEDs on the tape and their correspondence with the balls can be seen in the schematic image below.

Step 8: Install the LED strip

The wires connecting the pieces of tape interfere with the normal installation of the panel of balls, for this they are removed back. For this, the holes in the back cover are drilled a little more than the width of the tape, and a tape is inserted into them. Making sure that each LED falls on its own ball, you can remove the backing of the adhesive layer of the tape and glue it to the base.

 Step 9: Glue the balls to the frame

 The panel is laid face down, and at each point of contact is fixed with a small drop of hot melt glue.

 Step 10: Install the LED Panel


 LED panel is laid on top. The panel is fixed by several small carnations, according to the principle of how framed a picture or photo is. This will make it easy to disassemble the structure in case something breaks down and provides opportunities for further modifications.



 Step 11: Electronics

Arduino pins were soldered to the PLS “mother” connectors, to which the clock, power, and LED strip modules are connected. The tape is powered directly from the 5V 3A power supply, the “data” is connected to the Arduino via a 300-500 Ohm resistor (optional, but highly desirable). Arduino itself is powered by the same unit, but it is not necessary to connect the power supply of the ribbon to the Arduino, no need for high currents to follow the Arduino paths. Feed the tape, by the way, it is desirable to connect on both sides of the tape.

Step 12: Code

When loading the code, make sure that the power is off!
First, you need to set the time on the module.
After that, you can download the main code. Down here you can see the code that was used in the attached video and on most of the pictures. (TimeWhiteBackgroundRainbow.ino)

#include #define LED_PIN 9 #define NUM_LEDS 128 DS3232RTC myRTC(false); tmElements_t tm; CRGB leds[NUM_LEDS]; CHSV colour( 0, 255, 180); int counter=0; const int Digits[10][10] = { {7,8,10,11,14,18,22,24}, {14,16,18,22,24}, {7,8,9,11,14,16,18,24}, {7,9,11,14,16,18,22,24}, {9,10,11,16,18,22,24}, {7,9,10,11,14,16,18,22}, {7,8,9,14,15,16,18,22}, {7,11,14,16,17,24}, {7,8,9,10,11,14,16,18,22,24}, {7,9,10,11,14,16,17,24}, }; void setup() { pinMode(17, OUTPUT); //ground and v5 for clock module pinMode(16, OUTPUT); digitalWrite(17, HIGH); digitalWrite(16, LOW); FastLED.addLeds(leds, NUM_LEDS);

myRTC.begin(); }

//function that uses the Digit aray to display numbers between 0 and 100 void displaynumber( int place , int number){ for (int i = 0 ; i < 10 ; i++) { if (Digits[number/10][i] != 0) { leds[(Digits[number/10][i]+place)] = CRGB(255,255,255);; } if (Digits[number%10][i] != 0) { leds[(Digits[number%10][i]+28+place)] = CRGB(255,255,255);; } } }

void loop(){ RTC.read(tm); //changes the colour of background every 10 cycles if (counter<10){ counter++; }else{ colour.hue = (colour.hue+1)%256; counter=0; }

// sets background to rainbow colours for ( int i=0; i< 128;i++){ colour.hue = (colour.hue+1)%256; leds[i]= colour; } colour.hue = (colour.hue+128)%256; displaynumber(0,tm.Hour); displaynumber(70,tm.Minute);

//display colons if ( tm.Second%2 == 0 ){ leds[64] = CRGB(255,255,255); leds[66] = CRGB(255,255,255); } FastLED.show(); }


 This project may be something more than an ordinary watch. For example, you can add a button control, change the brightness depending on the lighting, display only certain colors, respond to music, connect it to Wi-Fi. Since the project is built on Arduino – the possibilities are wide.



Share on facebook
Share on google
Share on twitter
Share on linkedin
Share on pinterest