HackLab.TO Bandwidth Display

From Hackstrich

The HackLab Bandwidth Display displays our current bandwidth usage on two large 4-digit 7-segment displays. It's mounted above the door in the main lab room, and is powered via PoE and controlled by sending it UDP packets, per the below protocol.

Project Status

  • 2015-04: Has been up and running without issues for a year now! It's also now displaying lab power use until we have a separate wall display for power.
  • 2014-04-26: Mounted on the wall, still want to put a proper gel over the displays but it looks pretty good for the time being as-is. Done other than that!
  • 2014-04-15: Worked out a bunch of code bugs and found that the ethernet shield I was using was flaky. Finished software so it cycles between cable and DSL stats. Taped paper over the displays which makes them way more readable, need to get a proper sheet of acrylic or gel to put over them.
  • 2014-04-12: Finished assembling and programming all boards, no manufacturing defects like there were on the first run. Lasered up a back plate and mounted all the displays. Finished the protoshield with a 7805 to drive the display electronics, since the Arduino's regulator was overheating and shutting down doing so. Last step is to finish the software up to support two internet connections and get a red acrylic filter/gel to put over the displays to increase readability.
  • 2014-04-08: Boards have arrived, 90% of assembly is done, just missing some resistors which I'll have to add another day.
  • 2014-03-10: Stuck digits ended up being a PCB manufacturing error that shorted some of the transistor bases to the ground plane. Worked around by point-to-point wiring those connections instead. Fixed many firmware bugs, wrote the software to drive this, works with two displays. Ordered 6 more boards w/ express shipping.
  • 2013-07-26: Received PCBs, assembled first board. Programs OK, all segments work except F and the DP which are stuck on. Need to troubleshoot this more.
  • 2013-06-28: Doh, thought this had been submitted but missed it. Submitted to OSH Park w/ express shipping.
  • 2013-06-01: Decided that building all the digit boards on perfboard was going to be too much of a pain, designed/schematicized/laid out a dedicated control board for each digit, takes +5, +12, and I2C, and controls the digit. Will get 8 of these made to drive all the digits. Next step is reviewing the schematic/layout tomorrow before sending off to OSH Park.
  • 2013-05-11: Built up shift register/transistors for cathode drives on a proto shield, mostly working. Built up most of the first digit except for the anode control transistor, also working. Tried to add the anode control, blew up the Arduino putting +12V into an I/O line. Next step is to redo the anode control stuff on the first digit and complete full testing of that before building the other 7 digit boards.


  • Arduino Uno
  • Arduino PoE Ethernet Shield modified to supply the VIN rail with 10.5v rather than the default 9v (to make displays brighter)
  • Proto Shield w/ a connector that has that has +5, +12, and I2C to connect to the digits, plus a 7805 to drive the +5 rail for the displays


  • PoE Ethernet Shield receives data from the lab network on udp/1000
    • Hardcoded IP is, hardcoded MAC is 0xDECAF0C0FFFE because the original ethernet shield in use was pre-assigned MACs
    • Packet format is <top display>/<bottom display>, max 4 digits per display, can include a decimal anywhere, can have blank displays
      • i.e. 2.323/12.91 or cAbL/
  • Each LED display has a custom board attached to the back which takes one byte over I2C and displays it to the attached display
    • Each display board is Arduino compatible (2 are Duemilanove/328p compatible, other 6 are Diecimila/168p compatible)
  • Arduino separates packet into 8 individual display bytes and sends each one to one of the displays via the I2C bus running between them all


  • Upon power-on, each display board displays what address it's set for (via solder jumpers on the back) for ~1s (so the sign shows 1234/5678 briefly)
  • 6 boards have ATmega168 MCUs, the other 2 have ATmega328p MCUs (Eric had a bunch of 168s to spare, so switched to that after prototyping)
    • The 328p-based boards have "328" written on the back in the lower right corner and are otherwise identical
  • Programming 168-based boards:
../../../tools/avr/bin/avrdude -c dragon_isp -P usb \
 -p m168 -e \
 -U hfuse:w:0xdd:m \
 -U lfuse:w:0xff:m \
 -U efuse:w:0x00:m \
 -U flash:w:ATmegaBOOT_168_diecimila.hex
  • Programming 328p-based boards:
../../../tools/avr/bin/avrdude -c dragon_isp -P usb \
 -p m328p -e \
 -U hfuse:w:0xde:m \
 -U lfuse:w:0xff:m \
 -U efuse:w:0x05:m \
 -U flash:w:optiboot_atmega328.hex


Video of completed/mounted display operating