I made an LED indicator for my portfolio site

Job hunting is tough – I’m busy until February 2022 but already feeling anxious about finding the next gig. That’s why I wanted to give myself a bit of an incentive – a visible indicator of success. I decided that whenever someone visits my portfolio site, I wanted an LED to light up. Read on to find out how I did it (using Flask, http requests, and an ESP8266)

Self Hosting

I recently had a bad experience with an online service shutting down on me – had a bit of a rant about it, although in the end it wasn’t too serious – but I am now determined to do self-hosting wherever possible *disclaimer: my current work project is hosted on Google Cloud, and I’m using Firebase and push services for some Android apps also.

The Flask api

The first step was to create a simple Flask api to facilitate tracking of site visits. This is based on this minimal flask api template on GitHub. I used a simple global variable to keep track of website visits because I’m doing this in my spare time and because it works fine – and I love boolean switches. Here is how it works in one simple gif:

Think of the hand as a visitor to my site, and the “switcher offer” is the ESP8266 at my home checking the api (the switch)

HTTP request from resume site

Since I am learning React my portfolio site was a good way to have another look at the framework. I used this single-page React resume site template as a base, adding my own details and an http request to the Flask api endpoint on load.

ESP8266 code

I used the basic http requests example with my own api details, and added in EEPROM code to record the incrementing number of visitors to persistent memory. The ESP8266 module checks once per second with the api whether there has been a new visitor to my site. If there has, the built in LED on my D1 Mini switches on. Although I have mostly moved over to using PlatformIO, for this very simple sketch I used the Arduino IDE.

Deployment

Like I said, this one is self-hosted. I’m using Digital Ocean droplets, which are a fixed cost of 5 dollars per month, for as many sites and services you can cram on there (trust me, it’s a lot). The React site was surprisingly simple to deploy, just build, copy the build folder and point Nginx at it. Flask is a little bit more complicated, compared to how easy it would be on Google Cloud, for example, but a few config files are really not too much to handle.

The result

Whenever someone visits my website, the LED lights up. Simple as that. And I can plug in and check how many visitors I have had. I’m hoping that one of those visitors will like what I do enough to hire me next year!

Visit my site https://devsoft.co.za to light up my visitor tracking LED.

Potential improvements

If I was making this into a product, I would certainly upgrade the Flask API to include a database to keep track of the number of visits, rather than doing this on the ESP8266 EEPROM – which maxes out at 255!* Obviously this could include a web interface for accessing the information, I could log the times… But most of this tracking stuff has been done already – analytics for websites. Perhaps the ESP8266 could pick up some of this information and display it on an LCD screen. A flask service for accessing Google Analytics from Arduino perhaps? Let me know if this is something you are interested in!

Also, proper authentication – if this wasn’t just for myself… JWT, rate limiting, CRUD endpoints and a web interface to change LED behaviour.

And maybe an RGB LED would be nice, then I could add in some of my other websites, in different colours!

*apparently the Arduino EEPROM library works differently on ESP8266 – ignore that part of the code, I need to update it (the counter still increments while the module is plugged in, though)

Traffic Light with Button

Fritzing is a great open source project. It turns out that plugging wires into a breadboard is a great way for 5 year olds to develop hand-eye co-ordination, so I have started making some kid-friendly projects for my son.

The first was a traffic light project. This is conveniently located in the Fritzing examples, although you have to go to their website (link) to get the Arduino code. They use an Uno as controller, but I prefer the breadboard-friendly Nano. I didn’t have to make any modifications to this project for it to be fun, apart from using the Nano instead of the Uno in the screenshot, and adding a blue LED with a separate switch, as my son insisted on having his favorite colour represented.

This project offered multiple opportunities for learning. For one, it’s a working traffic light, so we went over the rules with some of his lego characters, look before you cross, press the button and wait, etc. Secondly I left the jumper wires to my son to plug into the board, and tried to explain a bit about DC current as well. We had fun turning the LED’s the wrong way, I just made sure the board wasn’t powered when he was busy plugging things in.

For power I used a power bank, plugged into the nano with USB. The power bank has two outputs, so we can have two projects powered at the same time. There are quite a few projects which are fun for kids, and since my kid loves “helping his dad” it’s going to be something I will be doing a lot in the future. More to come soon.

Simple D1 mini Circuit

Although the Smart Poi is based on ESP-01 for size reasons, I find it easier to use the excellent D1 mini for testing. Here is the basic setup:

Notice that the D1 mini is powered from a battery source (4 x NiMH AA in series). This is not entirely necessary, you could get away with plugging in the D1 mini via USB, and connecting the APA102 strip to the 5v pin. The problem comes in when the LED strip starts drawing too much power, you will have dropouts in Wifi connectivity, or wdt resets and won’t know if it’s the code or just power.

Use the offline code from my Github repo to get started:

SmartPoiOffline code

This code works fine on other Arduinos as well as ESP8266 chips. Just change the pins.