### What are we making?

We are going to create a controllable 6x7 LED grid with minimal components.

### Charlieplexing

Charlieplexing is a method to individually control more LEDs than pins used. This method is popular since it doesn't require any additional components like shift registers.

It mostly works by changing the mode of two pins to an input and an output to light a specific LED. By cycling through and lighting up each LED at a time quick enough it gives the illusion of multiple LEDs being lit at once.

The formula for working out the amount of LEDs you can control from the amount of pins (N) you want to use is:

N*(N-1)

So 3 pins = 6 LEDs, 4 = 12, 5 = 20, 6 = 30, 7 = 42, 8 = 56, 9 = 72 and so on.

For this tutorial we are going to use 7 pins, so that means we have 42 LEDs that we can control.

The Adafruit Huzzah is an ESP8266 breakout board - I used it for this project its easier to program and power compared to a bare ESP8266, but still is still super cheap. This board is great because it has built in WiFi, so we can add the ability to change the grid over the Internet.

## Step 1: Parts Needed

FTDI Cable - Needed to program the Huzzah via USB

42 LEDs - 42 matching LEDs, and not too big

7 Resistors - Find some resistors that match your LEDs

Some small wires to connect stuff on the breadboard - stubby little ones rather than long ones, so that they don't get it the way of the LEDs

3.7v LiPo Battery - Optional to make it portable.

PHP server - We need somewhere to put our code that the device can access and you can visit to change the grid.

The Huzzah comes with headers unsoldered, so unfortunately you'll have to solder them yourself. This tutorial from Adafruit is super useful.

Also download the attached code.zip which contains the PHP code, test sketch and final WiFi sketch.

## Step 2: Set Up the Arduino IDE

First off you'll need to add support for the board following this tutorial is you haven't already.

You'll also need to install the pfodESP8266WiFi library. This library seemed to fix most of the flickering by not blocking the main loop as much the default esp8266wifi one when it was making network requests.

## Step 4: Place LEDs on Breadboard

Once you have placed the wires on the bread boards, then start placing the LEDs.

For rows 1,3,5 the LEDs must all have the anode (longer leg) on the left side.

For rows 2,4,6 the anode is on the right.

## Step 5: Add Resistors and Connect to the Huzzah

The value resistors you want to use will probably depend on the LEDs you use, I've used 10Ω (Brown Black Black) for this.

Then connect each of the resistors to the Huzzah (Which we've placed on it's own breadboard).

1st -> pin 5
2nd -> pin 4
3rd -> pin 15
4th -> pin 16
5th -> pin 14
6th -> pin 12
7th -> pin 13

Try running this sketch to test out the different pins, if all is well then it should cycle through each row one by one. If not, then check your wiring.

## Step 7: Set Up PHP Script

### PHP

Once you've checked that cycling through each LED works, the next step is to add an interactivity.

We're going to use a PHP script to manage our LEDs, since it's easier to get online.

Create a folder on your server and move the two files in the PHP folder of code.zip

### API

We have one page, index.php and if called with GET parameters, will do other stuff. We have an accompanying text file.

I've made a basic API to control the LEDs with these methods, and all of the methods return a JSON state of the LEDS, except ?read=simple which returns a simplified version with less punctuation for the ESP8266 to parse.

Methods:

?toggle=[number]

?light=[number / all]

?unlight=[number/ all]

The API is a okay, but things can go wrong occasionally. It things don't seem right check state.txt isn't broken or missing.

### Try it out

You should be able to click different circles on and off and refresh the page to check it's all working. The next step is to upload a new sketch to the device that loads the state of the LEDs from the server.

## Step 8: Edit and Run WiFi Sketch

Then change the variables at the top of the sketch to match the server and location of your PHP script.

At every interval (default 500ms) the script will make a call to the server and load the current state of the dots, it will then parse the result and updates the ledState variable, which is used by the script to light up the LEDs.

Try going to your PHP page to test if its all working and you can control the LEDs.

## Step 9: Experiment!

It should be possible to make a 72 LED version with the 9 regular GPIO pins on the Huzzah!

Also, try playing around with the code to see if you can develop it further, or create a PHP script to change the state.txt depending on an API

You could also not use WiFi at all and instead create a cool animation that loops.

<p>I am always in awe of people like yourself that can understand and set up a charlieplexed system like this. The way you broke it down in the pictures makes me feel like I could do it. Great job!</p>
<p>Great LED setup.</p>