Because my team at work recently moved to a new location and we no longer have a visible spot for our Jenkins build monitor screen, I wanted to make a simple visual indicator of our project's build status. I made a tree monitor last year, but it claimed a static IP (so it couldn't be connected directly to the work network) and it required a computer actually query the Jenkins status and parse the responses. Plus, the holiday theme only really works a few months of the year.
This iteration uses a 24V industrial stack light I found on eBay along with an Arduino Pro Micro and an ENC28J60 ethernet adapter to directly monitor a job on a Jenkins server. The Arduino hosts a web server for a configuration page and accepts new configurations via a RESTful API. It uses the Ethercard library to acquire a DHCP address on the network, perform DNS lookups, and send HTTP queries to the configured Jenkins server. The Arduino software parses the JSON responses from Jenkins to set color
Arduino Pro Micro 5V/16MHz
I used a clone I found on Amazon
ENC28J60 Ethernet LAN Module
To fit in the enclosure, use the Gikfun Mini form factor
PATLITE LES-AW 50mm 24V Stack Light
24V DC Power Supply with 5.5x2.1mm Jack
eBoot Mini MP1584EN DC-DC Buck Converter Adjustable Power Step Down Module
Any 24V to 5V converter should work
Let me be the first to say that the Arduino makes a pretty bad web server. With only 32KB flash (<28KB available for program memory) and only 2.5KB RAM, there's not much room to store or serve anything. Thankfully, the ENC28J60 can handle a lot of the lower-level stuff and the Ethercard library from [jcw] has some good abstractions for TCP connections. I ended up writing the website as a single file HTML/CSS/JS page that I then minified, GZIP compressed, and converted into a program memory character array in a header file. This enabled the whole webpage to be static and stored in program flash saving valuable ram for other tasks. Since I had a little extra room, I used the Pure css framework to make the site pretty. Oh, and I also made a compressed favicon.ico so everything looks a little more professional.
The Arduino uses a RESTful API to interact with the config page. The webpage uses a GET request to retrieve the current configuration of the Arduino, then it uses a PUT request to save new settings. The Arduino does some internal validation before saving settings in EEPROM and sending a http response code to the web page.
The Arduino uses these configuration settings to send HTTP API requests to the Jenkins server. It then parses the JSON returned by the server to set the light pattern.
TL;DR: The Arduino is acting as an HTTP server and HTTP client simultaneously in under 28KB flash and under 2.5K ROM
As a software engineer, CADing the stand was a learning experience. I'd done some modeling of existing objects before, but creating something in the computer first was interesting. It was especiallly challenging to identify and rectify the interferences between the PCB and the CAD model, but my rough assembly (available on GitHub) was a good predictor of the physical assembly.
I did everything in Autodesk Inventor because that's what I had some experience with.
I don't want a rectangular base for my round light, so I've decided to design a round PCB this time. Thankfully, OSHPark doesn't care about the shape. I was a little concerned about the rounded-rectangle shaped plated holes for the barrel jack, but it turned out perfectly. I made a couple mistakes on the silkscreen by keeping a label that was supposed to be hidden and swapping the "-" and "I" labels for the regulator. Otherwise I'm pretty happy with how it turned out.
I used a LulzBot TAZ 4 with PLA filament. Layer height was 0.2mm and speed was moderate. I used 2mm wall thickness and 20% infill. Because the enclosure is pretty much a shell anyway, the wall thickness and infill can be adjusted, but definitely keep at least 1.5mm wall thickness so the machine screw threads have something to bite into.
Sand the outside of the enclosure as desired to create a more finished, smooth look. I used up to 2000 grit sandpaper and the results were very nice. Don't worry about the inside since it won't be visible anyway.
Use a 2.5mm (3/32" if you don't have metric bits) drill bit to prepare the holes in the top enclosure piece for threading. When I printed the enclosure, the holes were slightly too small to accept the M3x0.5 tap.
Tap the holes in the top enclosure with a M3x0.5 tap. This should be very easy since the plastic is fairly soft, so you may be able to skip this and directly screw the machine screws into the plastic.
Ensure Components near the screw notches are as far away as possible so there is no interference with the enclosure. Use hot glue if necessary to stabilize ENC28J60 module on bottom of PCB.