Introduction: Electric Imp WiFi Progress Display
We randomly fell in to an ice cream reward system at home. Bringing good grades home means we get to go out for ice cream. Not sure that this is a politically correct reward system, but it is an event we all look forward to. Naturally, I'm a beneficiary of my children's grades - after all, someone needs to drive the car! Ulterior motives aside, it became difficult to track who had done what and what the criteria for a reward was, meaning that we erred on the side of caution and were spending a lot of time at the ice cream store. To fix this "problem", I came up with a reward system that allows them to log their grades through a Smartphone Web App. The app communicates with an Electric Imp that turns on a sequence of LEDs to show progress toward the reward. When the image is complete (all elements illuminated), the Agent on the Imp Cloud Server communicates with an SMS Service sending the "Goal Met" text message to all family members. At this point, we have justification to drive to the ice cream store in celebration and the cycle restarts.
Using an electric imp in the project gives you instant WiFi control of the LED array. The initial design of the Reward system was for a square LED matrix, but after many iterations, I ended up with a mechanically irregular matrix controlled in regular LED grid fashion. For the main images above, each element of the display is a LED which is addressed in a 4x4 grid matrix. This allows for interchangeable mechanical patterns more suited to the specific goal or reward on offer. An island palm tree for vacation savings, a piggy bank for a financial goal etc.
While this example is for academic results, the software and imp code can easily be modified to display progress toward any goal.
This instructable will walk through the complete design and demonstrate 2 different ways of creating the LED panel, an easy way to create a "metallic" panel as well as electronics, firmware and software. You will notice at times a flower being used in the photography, and at others a dragonfly. The principles are the same for both and development happened in parallel until I hit burnout during the final firmware development. The firmware development for the dragonfly is complete since this ended up being my favorite visual.
Step 1: Tools and Supplies
All my past Imp projects have used the SD card format Imp plus development board. The team at electric imp recently released a solder-down module (IMP-002)that gives access to more I/O pins. The extra I/O pins ( total of 12) made it possible to drive a 4x4 grid array and still have pins to spare. The PCB I used for the reward system is a custom PCB co-developed with a friend as a plug-in board for our garage door controller kit. It has become my "go-to" generic imp board for projects.
Electrical components
- Electric Imp - I used a board co-designed with a friend. Boards can be ordered from here: (http://www.mihomeagent.net/shop/catalog/browse?sessid=hjx2WUBVTib1BJfaTFhcJv8DQJOkpwP0rjCMPlHxDvOENY7qUBCauVyKeZ3i5iXA&shop_param=)
Our design is a derivative of an Electric Imp reference design (http://electricimp.com/docs/hardware/resources/reference-designs/amber/). The board we designed is intended as a plugin module for a garage door controller kit we developed. The module was designed as a general IMP002 board which includes everything needed to get an electric imp design running (Electric Imp, phototransistors, voltage regulator, status LEDs etc).
- NPN Transistors - 8 x any general purpose NPN transistor will work. I used old ZTX692 transistors since I have a bag full of them from way back. I suggest you use something more commonly available like a 2N3904 (http://www.radioshack.com/product/index.jsp?productId=2062609) available from Radioshack.
- Resistors - 8 x 1KOhm, 1/4W or 1/8W, 1% or 5% or 10% tolerance resistors (tolerance really does not matter here). These resistors limit the current into the base of the 8 NPN transistors. http://www.radioshack.com/product/index.jsp?productId=2062343
- Resistors - 4 x 150Ohm, 1/4 or 1/8W, 1% or 5% or 10% tolerance. These resistors limit the current through the LEDs. Initially I used 150Ohm resistors. Later I switched to 100Ohm to increase the LED brightness because the transistors I used have 0.6V Collector-Emitter volt drop which in total means you have 1.2V less to drive an LED. So, some pictures will show 150Ohm and some 100Ohm. Your choice will depend on the Collector Emitter voltage drop of the row and column transistors, the volt drop across the LED and the manufacturers spec for operating current through your LED.
- 20 or 24 Pin DIP sockets - I used these instead of connectors simply because I had these in my project box. You can use anything here - you do not have to use what I used.
- 5mm LEDs - Depending on the picture you want to illuminate, select appropriately colored high brightness LEDs. I found the RGB LEDs most useful because you can select the color at wiring time giving you a lot of flexibility. The flower design required 13 LEDs and the dragonfly design required 11. The number of LEDs basically determine the number of levels before a reward is due. The electyric imp firmware expects a 4x4 matrix allowing for a maximum of 16 LEDs, but you can extend this if needed to 6x6 with the available Electric IMP pins allowing for 36 LED designs. The blue LEDs have the following Specs: High Visibility
Operating Current: 18mA
Peek Current: 30mA
Forward Voltage: 3.0V
Power Dissipation: 105mW
Wavelength: 463nM
Viewing Angle: 50deg
Luminous Intensity: 1100mcd
http://www.ebay.com/itm/181114104984?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649
Lens Style: Diffused
LED Size: 5mm
Lens Shape: Round
Wavelength/Color Temperature: 620-630nm
Luminous Intensity: 4000 - 8000 mcd
Forward Voltage: R~2.4V, G~3.4V, B~3.4V
Forward Current: ~20mA
http://www.ebay.com/itm/181204465776?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649
- A board for holding the components. I used One half of the radioshack dual mini board. http://www.radioshack.com/product/index.jsp?productId=2104052
- Sidecutters for trimming components leads, cutting wire to length etc
- Wire strippers
- 26 Gauge multi-stranded hookup wire. Multiple colors are useful.
- Long nose pliers - for holding components that will get hot when soldered and for bending wire leads
- Multimeter - for testing continuity and measuring voltages.
- Solder and Soldering Iron
- Foam board for creating the picture inserts - only needed if you do not follow the CNC Router method
- Poster board for creating stencils that are used to frost glass from the picture frames
- 8x7 Picture frames. I bough the deepest ones I could find from AC Moore. You may be able to find these on-line. I visited the brick-and-mortar store.
- Xacto knife
- Frosting Paint - I used Rust-oleum Frosted Glass Spray
- 5mm drill bit for making holes in the craft board for the LEDs
CNC Supplies
If you choose to make your patterns using CNC,
- 1/2" Plywood or MDF.
- Aluminum Flashing. I use the flashing to create "metalized" panels. By adhering the Flashing to plywood you create the look of metallic panels.
- Spray-on contact adhesive to adhere the aluminum flashing to the plywood panel. I used Locktite 300.
- 1/8" and 1/4" high speed single flute router bits
Step 2: Building the Electronics
Start by cutting one of the 20 Pin DIP sockets in half and solder it to the circuit board. Then connect 8 of the pins to 8 x 1K resistors. These resistors connect to the base pin of the NPN transistors. The Electric Imp output current is about 4mA so the transistor is used to amplify that to roughly 30mA to get good intensity from the LEDs. The transistor also allows us to use the 5V input supply instead of the 3.3V Imp supply. This is needed as the forward voltage requirement for the LED is worst case 3.2V and the expected voltage drop across the transistors will be in the order of 0.4V (using 2N3904 transistors).
Then add 2 transistors - one column transistor and one row transistor. Add the 150 Ohm resistor and connect it to the output socket. The output socket is arranged so that you have rows on one side, and columns on the other. When the first 2 transistors are soldered in place, it makes sense to test the first row/column combination just to make sure your basic circuit works before you solder the remaining transistors and resistors in place. I wrote a small test program on the Imp that enables Row 1 and Column 1 and checked to see that an LED connected across row 1 column 1 illuminated.
Then build up the remainder of the circuit as per the circuit diagram.
Step 3: Designing the LED Panel
I created the two designs using a Alibre Design, a 3D CAD program as this was the practical way for me to do it. You can most likely find line art on the web that you can copy. I have provided my designs as reference as PDF as well as the associated DXF files which are inputs for CAM software to create the toolpath for a CNC router. You can also load the DXF files into other drawing packages to modify them.
Step 4: Making the LED Panel - Crafting Method
Step 5: Making the LED Panel - CNC Method
After throwing out my miserable attempt at making a good looking LED panel from the craft board, I headed to the CNC to give me the clean cut pattern I wanted.
Create the artwork
The first step is to create the artwork. I used Alibre CAD to create both the flower and the dragonfly pictures. Once the 3D model is complete, a 2D drawing of the model is automatically generated by the CAD program. This 2 D drawing is then exported as a DXF file. THe DXF file is then imported into a trial version of CamBam and converted to g-code. The G-code is interpreted by Mach-3 machine controller software which drives the router to cut the pockets we designed into the blank panel.
Make the blank "metallic" LED panel
Start by first cutting a 1/2" plywood panel to roughly 10"x10". The panel needs to be a bit bigger than your final cutout dimensions as you need space to clamp the panel to the CNC router bed. To create a brushed metallic look, the aluminum flashing is laminated to the one side of the 1/2" plywood panel. First make sure that the plywood panel surface is clean and smooth. A light sanding may be needed but make sure to remove all dust using a tack cloth. Make sure the side of the aluminum panel that will stick to the wood is absolutely clean as well. If there are any pieces of dirt or wood splinters between the two parts when you glue them together, the defect will be clearly visible.
Spray adhesive onto the plywood and on to the inner curve of the aluminum flashing. Wait about a minute for the spray glue to "tack" and then carefully place the flashing onto the pluywood panel. Start at one end and slowly move toward the other end. You want to avoid "bubbles" in the final surface. Then trim off any excess flashing using tin snips. Apply moderate hand pressure all around the panel to make sure it is properly adhered all over.
Machine the Panel
Leave the panel to setup for 1/2 hour or so before machining. Load the blank into the CNC Router, clamp it down and load the g-code into Mach-3. The program takes about 20 minutes to run on the flower, and about 16 minutes on the dragonfly.
Step 6: Wiring the Panel
Where LEDs are close enough, you can bend and solder the leads together without using additional wire.
Step 7: Diffusing the LED
Once you have the stencil, used the Frosted Glass spray paint to spray the openings. Keep the can about 10 inches from the glass so that you get a nice frosted layer. If you are too close, the paint will not "frost" properly. After a little drying time, add a second light layer. I found 2 light layers to be sufficient but you can add more if you need to. After the panel is dry ( the Rust-oleum paint I used was very dry after 1/2 hour), remove the stencil. You should have a beautiful frosted glass panel.
To improve the reflectivity of the LED within the cavity, I used some white paint to coat the cavity. I can't tell if this improved the light output, but does make the panel look better when the LED is off. I used standard Acrylic Trim paint for this. Any paint that will work on wood will do fine.
Step 8: Faux Stained Glass
- A reusable Leaded Blank
- Simulated Liquid Leading
- Gallery Glass Paint and spoon applicator
- Place the template for the design underneath the gallery glass leading blank and secure with tape to prevent it from moving
- "Trace" the outlines of the design with the liquid leaded glass and wait 8 hours for it to set
- Fill in the outlines with the paint making sure to avoid bubbles. If you do get bubbles a tooth pick can be used to pop them. Then wait 8 hours for the paint to set.
- Carefully peel the picture elements from the leading sheet and place them on the LED frame front glass panel.
Step 9: Firmware - Driving the LEDs
- Drive Row 0 Pin high
- If the bitmap pattern has a bit set for a particular column, turn drive the column pin high. Wait a short while and set the column pin low.
- Move on to the next column until all columns have been managed.
- Drive Row 0 low and drive row 1 high and repeat the process for the column pins defined for that row.
The pattern that defines which LED needs to be illuminated in each row is arranged in row and column fashion. An array of 4 bytes defines the state of the grid at a particular point in time. Referring to the Dragonfly matrix, we can turn body components on and off by defining a zero or one for each row and column position. For example, to turn on the head, we need to drive Row 0 High and Column 1 High. This is a tedious process. The following array entries show the typical sequence needed to animate the display
Row 0, Row 1, Row 2
[0x00, 0x00, 0x00], Animation Sequence Step 0 (No column bits are set - everything off)
[0x00, 0x00, 0x04], Animation Sequence Step 1 (Row 2 column Column 2 is set on - this turns on the tail tip)
[0x00, 0x00, 0x06], Animation Sequence Step 2 (Row 2 Column 2 and 3 are on - this turns on the tail tip and abdomen)
[0x00, 0x02, 0x06] Animation Sequence Step 3 (Row 2 Column 2 and 3 and Row 1 Column 1 are on - tail tip, abdomen and thorax are on)
There is a 250ms delay between sequence steps. You can change this in the code for faster or slower. The animation is used for "celebrating" the final reward level being met. When you see the dragonfly flashing - it's time for ice cream!
Under normal operation, the LEDs illuminate in sequence as each entry is made from the remote smartphone. If an A is received, the current reward level is incremented which turns on the next body element. The display is not animated in this case and will appear static, illuminating only the LEDs corresponding to the reward level.
A diagnostic mode is also provided so that you can check your panel wiring. By clicking each body part of the dragonfly, you can toggle the illumination of an LED.
Step 10: Firmware - Electric Imp Agent and Device
Apologies for the following re-use of text from my previous electric imp instructable - the requirements are the same. Just saving you from navigating another link!
In order to get your imp to work, it needs to connect to your wireless network. Electric Imp provides a tool that does the configuration optically. The process is called BlinkUp and is detailed here https://electricimp.com/docs/gettingstarted/1-blinkup/
Once the BlinkUp is complete, your imp will appear on your IDE under New Devices. If you have not used an Electric Imp before, I suggest you first try the Hello World example on the Electric Imp site to get the hang of the Imp. There is also a great guide to the imp on instructables written by @beardedinventor: https://www.instructables.com/id/Getting-Started-with-Electric-Imp/
The firmware for the imp is attached to this step as RewardSystemDeviceCode.nut
The code for the agent is attached as RewardSystemAgentCode.nut
Firmware and Agent code interaction
Your Agent has a URL specific to it. When an HTTP message is sent to this URL, your Agent code running in the Imp Cloud checks the validity of the request by comparing the incoming API Key (any key you make up - more bits make it harder to guess) with the API Key stored in memory of the Agent (API Key idea from http://forums.electricimp.com/discussion/comment/8281#Comment_8281). If the Key's match, the message is checked to determine if the request is in the API for this system.
Events that get passed from the Agent to the Device Imp firmware, are passed over the electric imp secure communication channel between the Imp and the server based Agent. The Imp "receives" this event through the agent.on functions defined in the device firmware
- agent.on("addGoalStep", function( value ) {});
- agent.on("buttonPressed", function( value ) {});
The API for this app:
{request: buttonPressed} - used for diagnostics and to rest goal levels
{request:persistValues} - stores values for SendHub communication defined by the client App
{request:addGoalStep} - increment the current level towards the goal depending on the value of the input. In out case we manage the steps according to the following weighting (where super A is 100%):
if( value == "superA" )
goalLevel += 2;
else if( value == "A" )
goalLevel += 1;
else if( value == "B" )
goalLevel += 0.5;
else if( value == "C" )
goalLevel += 0.25;
else if ( value == "restartGoal" )
Attachments
Step 11: Client HTML App
Communicating with the Electric Imp is done by sending a message to the URL of the Agent which is specific to your particular Imp. To simplify configuration, the App has a settings page where you can enter all of your configuration data such as your Imp specific URL and your SendHub particulars. SendHub is used to send text messages.
You will need to create an account on SendHub if you want text messages. They have a free account good for 500 messages a month. https://www.sendhub.com/
To make the HTML page appear as a native App on your iPhone, you need to load it from a web site, and then add it to your home screen. The process is described in my previous instructable here: https://www.instructables.com/id/Electric-Imp-Garage-Door-Opener/step10/Configuring-IIS-Express-And-Loading-The-App-onto-y/
The iPhone files are attached to this step. The academic Cap icon is courtesy of http://www.flaticon.com/free-icon/graduation-hat_422
Attachments
Step 12: Final Thoughts
If you build one, let me know!