Build a Physical Internet Speed Monitor With Raspberry Pi

by dimas_art in Circuits > Raspberry Pi

2486 Views, 43 Favorites, 0 Comments

Build a Physical Internet Speed Monitor With Raspberry Pi

Codex Image Aug 29, 2026, 05_10_41 PM.png

I wanted to know whether my home internet connection was actually working properly—not just how fast it was at the moment I ran a test.

This project turns a Raspberry Pi Zero 2 W into a small physical internet monitor. It periodically measures ping, download speed, and upload speed, sends the results to Grafana, and shows the latest measurement on a small OLED display.

The monitor uses Ethernet instead of Wi-Fi, runs unattended, and keeps a history of network performance. This makes it possible to identify short outages, latency spikes, regional routing problems, and recurring slowdowns.

The project software and setup details are available on GitHub. I also documented the complete engineering story, including the 100 Mbps Ethernet adapter mistake, in the full build log on my blog.


Full build log: https://blog.artemiev.org/building-a-physical-internet-speed-monitor/

Supplies

  1. Raspberry Pi Zero 2 W
  2. Gigabit-capable Ethernet expansion board
  3. 1.3-inch OLED display
  4. microSD card
  5. Raspberry Pi power supply
  6. Ethernet cable
  7. Screws or fasteners for the enclosure
  8. 3D printer and filament
  9. Raspberry Pi OS
  10. Ookla Speedtest CLI
  11. Grafana or another metrics dashboard

Prepare the Raspberry Pi and Network Connection

Install Raspberry Pi OS on the microSD card and boot the Raspberry Pi Zero 2 W.

Set up network access and install the dependencies required by the project software. The complete installation commands are available in the project repository:

https://github.com/dartemiev/internet-speed-monitor/blob/master/README.md

Before assembling the case, connect the Raspberry Pi to the gigabit-capable Ethernet expansion board and run one manual speed test.

Check that the negotiated Ethernet link speed is appropriate for your connection. My first adapter was limited to 100 Mbps, which created a bottleneck inside the monitor itself. Make sure the adapter, cable, and router port can support the speed you intend to measure.

Run and Validate the First Speed Test

Run a manual speed test from the Raspberry Pi and record the three basic results:

  1. Ping or latency
  2. Download speed
  3. Upload speed

Compare the result with a known-good device connected to the same network.

If the result is unexpectedly close to 100 Mbps, check the measurement path before changing the software. Inspect the Ethernet adapter, cable, router port, and negotiated link speed.

The measurement device must not become the bottleneck. This validation is especially important when using a Raspberry Pi Zero 2 W with an external Ethernet expansion board.

Configure Scheduled Measurements

Once the manual test produces sensible results, configure the monitor to run measurements automatically.

The monitor should periodically collect ping, download, and upload values and publish them to the monitoring stack. Use the setup instructions from the project repository:

https://github.com/dartemiev/internet-speed-monitor/blob/master/README.md

Keep frequent measurements lightweight. More expensive tests against distant regions should run less often so the monitor does not constantly saturate the internet connection it is measuring.

The goal is to build a consistent history of network performance, not to run the fastest possible test every few minutes.

Measure Different Network Regions

Screenshot 2026-08-29 at 17.22.14.png
Screenshot 2026-08-29 at 17.23.21.png
Screenshot 2026-08-29 at 17.25.05.png
Screenshot 2026-08-29 at 17.26.12.png
Screenshot 2026-08-29 at 17.26.38.png

A speed test against a nearby server only shows that the local connection is working. It may not reveal problems farther along the route.

Configure additional measurements for the regions that matter to you, for example:

  1. Europe
  2. North America
  3. Asia

Run these regional tests less frequently than the lightweight local measurements. Keep the targets consistent so the results can be compared over time.

Comparing regions helps distinguish a local ISP problem from routing or latency issues affecting only a specific destination.

Send Measurements to Grafana

Screenshot 2026-08-29 at 17.28.03.png
Screenshot 2026-08-29 at 17.28.24.png

Configure the monitor to publish its measurements to your metrics storage, then connect that data source to Grafana.

Create dashboard panels for:

  1. Download speed over time
  2. Upload speed over time
  3. Latency over time
  4. Region or test target, if you collect measurements from multiple regions

A dashboard makes it possible to see how the connection behaves throughout the day and identify short outages, latency spikes, or recurring slowdowns.

The monitor does not need to explain why a problem happened. It only needs to collect consistent measurements and preserve the history for later investigation.

Connect and Test the OLED Display

EC790117-536C-4D25-807D-129B23F6F984_1_102_o.jpeg
3C13D77C-5A8E-4171-B2F4-0271371CD3B6_1_105_c.jpeg
6DBD3E63-8EA8-4C3E-8D71-122E732E0003_1_105_c.jpeg
964E0D48-E732-497A-B482-AFC6C0C8D656_1_102_o.jpeg

Connect the 1.3-inch OLED display to the Raspberry Pi according to the wiring and software instructions in the project repository:

https://github.com/dartemiev/internet-speed-monitor/blob/master/README.md

The display provides a quick local view of the latest measurement. It should show:

  1. Ping
  2. Download speed
  3. Upload speed

Add clear progress states so it is obvious whether the monitor is currently measuring, waiting, or showing the latest completed result.

Grafana is useful for investigating historical data. The OLED is useful when you simply walk past the device and want to know what the connection is doing right now.

Print the Enclosure Parts

Print the three enclosure parts included with this project:

  1. base.stl — main enclosure body
  2. back.stl — rear panel
  3. top.stl — front panel with the OLED opening

The enclosure was designed specifically for the Raspberry Pi Zero 2 W, Ethernet expansion board, OLED display, and connector layout used in this build.

Before final assembly, dry-fit the parts and check that:

  1. the OLED fits securely in the front opening;
  2. Ethernet and power connectors remain accessible;
  3. cables have enough clearance;
  4. the ventilation openings are not blocked.

If your hardware differs, verify the dimensions and port positions before printing all parts.

Assemble the Monitor

C6BB33C4-566F-42D7-A837-E633D1473864_1_102_o.jpeg

Install the Raspberry Pi, Ethernet expansion board, and OLED display inside the printed enclosure.

Connect the display and Ethernet board, route the cables carefully, and fasten the enclosure panels with screws or suitable fasteners.

Before closing the case completely, check that:

  1. the OLED is aligned with the front opening;
  2. the Ethernet and power ports are accessible;
  3. no cable is pressed against the electronics;
  4. the ventilation openings remain clear.

Power on the device and confirm that the Raspberry Pi boots, connects through Ethernet, and starts the monitoring software.

Verify the Finished Monitor

IMG_1984.jpeg
942BF4D7-EBD1-4B7C-BEA2-D83E1B1520EE_1_105_c.jpeg

Leave the monitor running long enough to collect several measurements, then verify the complete system:

  1. the Ethernet link negotiates at the expected speed;
  2. scheduled tests continue after a reboot;
  3. measurements arrive in the metrics storage;
  4. Grafana displays new data;
  5. the OLED updates after a completed test;
  6. the enclosure does not block ports or ventilation;
  7. the monitor does not unnecessarily saturate the network.

If the results are unexpectedly close to 100 Mbps, inspect the Ethernet adapter, cable, and router port first. A network monitor can only provide useful data when its own measurement path is not the bottleneck.

Use the Monitor

ECE9DC81-DDAF-4F5D-9814-29D45E23423F_1_105_c.jpeg
0D34CFC4-E8B5-47D1-9933-C856C060A617_1_105_c.jpeg

The finished device now runs quietly on the network, performs scheduled measurements, and shows the latest results on the OLED display.

Use the OLED when you need a quick answer about the current connection. Open Grafana when you want to investigate historical performance, compare regions, or find recurring problems.

The project software and setup instructions are available in the GitHub repository.

The complete engineering story, including the original 100 Mbps bottleneck, is documented in the full build log on my blog.