How to address 16 LEDs from single UNO

I have 16 LED's that I would like to turn on in random sequence within 45 seconds. I want to turn them off in the same way. My first thought was to use 16 digital pins on my Arduino Uno but there are only 14 available and I think I can accomplish this using addressing on I2C.

Before I go further down this path I would like to know any other thoughts of how best to accomplish this? Thanks in advance for any help.

A serial in - parallel out shift register : sipo site:https://forum.arduino.cc - Google Search

4x4 matrix?

There are 20 pins on an Uno that can be used for digital I/O, which includes the analog input pins.

However, you must limit the total chip current to less than the 200 mA absolute maximum, so for 16 LEDs, at most about 10 mA/LED.

LED light strip, 1 Uno pin.

Check out this link LEDs and Multiplexing - Arduino Forum

There are special purpose serially-addressed (shift register) LED drivers. The [u]MAX6979[/u] is a 16-LED version. These can be daisy-chained (like regular shift registers) so you can individually-address a virtually-unlimited number of LEDs using just 3 Arduino output pins. (The datasheet says it's a "4-wire" interface but in most applications you can simply ground the Output Enable line.)

This particular chip has built-in current limiting so you don't need resistors in series with the LEDs, and it can driver the LEDs with more current than a "regular" shift register.

I used use 6 similar 8 LED chips to control/address 48 individual LEDs. (I didn't use the 16-LED version because it's a stereo sound-activated effect with 24 LEDs on each side, and I used a separate Data connection for each side, with common Clock & Latch connections so I actually used 4 output pins.)

Port expander? Or did I miss something?