Office stop light

Office Busy Signal Stoplight

COVID-19 has forced many of us to work from and practice social distancing to flatten the curve. As a result, I’ve been spending a lot of time in my home office. Since I’ll be working from home for the foreseeable future, I decided it was time to clean and organize my office. When I clean/organize I end up digging up a bunch of stuff I haven’t used in years. Most of these items usually get recycled or donated, and some sometimes I’ll find small treasures that I’ve held on to but forgot about.

This time I found my Dad’s original office stoplight that he used when I was a kid in one of the random-stuff boxes. Essentially, it’s miniature stoplight that was used to indicate my Dad’s availability at any given moment. It was made with incandescent light fixtures with colored light covers. The light were controlled by two toggle switches.

Since my kids are home from school too, for the same reason I’m working from home, I thought this would be a perfect opportunity to give this stoplight box new life. Hopefully it will help the kids understand when I’m in the middle of something and can’t be bothered.

While I could have made this from scratch that would have a much smaller profile, I wanted to keep the original look. I did replace the 6V incandescent light bulbs with colored LED’s. This was simple enough to do by cutting the light bulb fixture in half on the bandsaw. Then it was as simple as wiring up the LED’s and programming an ESP8266 thing with a very simple web interface.

Parts list:

  • Red LED
  • Yellow LED
  • Green LED
  • 220Ω resistor
  • Sparkfun ESP8266 thing
  • USB Cable
  • USB power adapter

Code:

/*
 *  Simple web LED control for a stop light.
 *  The server IP address of the ESP8266 module, will be printed to Serial when the module is connected.
 */

#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>

//////////////////////
// WiFi Definitions //
//////////////////////
const char *ssid = "your_wifi";
const char *password = "your_password";
const char *hostname = "office-stop-light";
const String title = "OFFICE STOP LIGHT CONTROL";

/////////////////////
// Pin Definitions //
/////////////////////
const int RED_LED_PIN = 4;
const int YEL_LED_PIN = 0;
const int GRN_LED_PIN = 5; // Thing's onboard, green LED

// Create an instance of the server
// specify the port to listen on as an argument
ESP8266WebServer server(80);


/* Homepage Webcode */
void send_homepage() {
  String server_index = "<!DOCTYPE html><html lang=\"en\"><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\"/><title>"+title+"</title>";
  server_index += "<style>.c{text-align: center;} div,input{padding:5px;font-size:1em;}  input{width:90%;}  body{text-align: center;font-family:verdana;} button{border:0;border-radius:0.6rem;background-color:#1fb3ec;color:#fdd;line-height:2.4rem;font-size:1.2rem;width:100%;} .q{float: right;width: 64px;text-align: right;} .button_blue {background-color: #008CBA;} .button_red {background-color: #f44336;} .button_yellow {background-color: #ffdd00; color: black;} .button_dark_grey {background-color: #555555;} .button_green {background-color: #4CAF50;} </style>";
  server_index += "<script>function c(l){document.getElementById('s').value=l.innerText||l.textContent;document.getElementById('p').focus();}</script>";
  server_index += "</head><body><div style='text-align:left;display:inline-block;min-width:260px;'>";
  server_index += "<H3>"+title+"</H3>";
  server_index += "<form action=\"/cmd_red_on\" method=\"get\"><button class=\"button_red\">Red</button></form><br/><form action=\"/cmd_yellow_on\" method=\"get\"><button class=\"button_yellow\">Yellow</button></form><br/> <form action=\"/cmd_green_on\" method=\"get\"><button class=\"button_green\">Green</button></form><br/><form action=\"/cmd_all_off\" method=\"get\"><button class=\"button_dark_grey\">Off</button></form><br/>    ";
  server.send(200, "text/html", server_index);
}

/* Go to http://office-stop-light in a web browser with a device on the same network as this ESP8266 thing. */
void handleRoot() {
  send_homepage();
}

void cmd_red_on() {
  send_homepage();
  digitalWrite(RED_LED_PIN, 1);
  digitalWrite(YEL_LED_PIN, 0);
  digitalWrite(GRN_LED_PIN, 0);
}

void cmd_yellow_on() {
  send_homepage();
  digitalWrite(RED_LED_PIN, 0);
  digitalWrite(YEL_LED_PIN, 1);
  digitalWrite(GRN_LED_PIN, 0);
}

void cmd_green_on() {
  send_homepage();
  digitalWrite(RED_LED_PIN, 0);
  digitalWrite(YEL_LED_PIN, 0);
  digitalWrite(GRN_LED_PIN, 1);
}

void cmd_all_off() {
  send_homepage();
  digitalWrite(RED_LED_PIN, 0);
  digitalWrite(YEL_LED_PIN, 0);
  digitalWrite(GRN_LED_PIN, 0);
}

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO / LED
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(YEL_LED_PIN, OUTPUT);
  pinMode(GRN_LED_PIN, OUTPUT);
  digitalWrite(RED_LED_PIN, 0);
  digitalWrite(YEL_LED_PIN, 0);
  digitalWrite(GRN_LED_PIN, 0);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.hostname(hostname);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Configure and start the server
  server.on("/", handleRoot);
  server.on("/cmd_red_on", cmd_red_on);
  server.on("/cmd_yellow_on", cmd_yellow_on);
  server.on("/cmd_green_on", cmd_green_on);
  server.on("/cmd_all_off", cmd_all_off);
  
  //get heap status, analog input value and all GPIO statuses in one json call
  server.on("/all.json", HTTP_GET, []() {
    String json = "{";
    json += "\"heap\":" + String(ESP.getFreeHeap());
    json += ", \"analog\":" + String(analogRead(A0));
    json += ", \"gpio\":" + String((uint32_t)(((GPI | GPO) & 0xFFFF) | ((GP16I & 0x01) << 16)));
    json += "}";
    server.send(200, "text/json", json);
    json = String();
  });
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  server.handleClient();
}

Wiring Diagram

Web Interface

Installing Bath Tile

Finishing My Basement

In case anyone has been wondering why I haven’t been posting as much, I’ve been finishing my own basement for the past year and a half and counting. Just started on the bathroom today.

I’ll be sure to update this post with more details and lessons learned.

Growing up with a Space Ship

I was looking though my photos today, and I came across this one of a spaceship console my dad built for us kids. I remember it being one of the coolest things ever. It wasn’t even anything too fancy. Most of if was the face of an old stereo, that he wired up to make the knobs change the rate of blinking LED’s. Simple but so fun!

Makes me want to do something like this for my kids…

Power Wheel Hacks

We inherited this power wheels ATV from a dear family that moved out of state. It needed some “fixing” before we could have some fun with it. These are the things I’ve done to it since we got it.

New Battery

The original battery had long since died, and my 18V cordless drill batteries were the only ones I had that were remotely powerful enough to make it move. Sure the voltage is a bit higher than the 12V ATV is designed to run on, but now it goes faster! Also, I’ve been running it on 18V for 3 years now and it still runs great. As you can see in the photo’s I used a standard RC battery plug. Then created battery adapter to spade wire terminals. I used bits of wood to keep the right spacing of the spade wire terminals for battery connection and removal.

Bike trailer hitch

The problem with having siblings is you need to share. So I thought they could all have fun together if they could pull each other around. So I came up with this trailer hitch. Get a 3/4 in. PVC 45 degree elbow, and drill a hole clear through one side for the trailer cotter pin to go through. Then place a piece of scrap 2×4 on the inside of the battery bay, and put at least 3 screws through the PVC elbow through the body into the 2×4.

Painted it Metallic Blue

RGB Undercarriage Lights

Simply added some 12V RGB LED strips to the undercarriage of the power wheels, and added the controller that came with it. The LEDs were able to operate just fine at 18V using the LED IR controller that they came with. It also adds visibility at night.

Unfortunately the LED strips eventually fell off even after gluing them down.

Battery Level Indicator

New Treads

Now that the kids are getting bigger I noticed that the wheels tend so spin out longer, and that the ATV wont stop as quickly as it used to. This was especially apparent when they tried to pull a heavier wagon. So I found a hack online on how to take a bike tire (not inner-tube) and apply it to the hard plastic wheels to give it more traction.

Pull a Parade Float

Okay this one isn’t really a hack, but was made possible because of some of the hacks. And it is a neat thing I was able to do with my kids. We had a lot of fun, and they were able to help promote Mommy’s business (pebblebaysoaps.com). We also won 3rd place for best float!

Repairing the AC

Oh fun, the AC died on us in the middle of the hot season. It seems to want to run, but doesn’t kick on properly.

Doing some research online, I discovered that it must be either the relay, or the starting capacitor. Luckily I was able to find some replacements on Amazon. Those two days seemed like forever! But one I replaced the parts (and the fuses) it started right back up.

Star Wars Thermal Detonator

This is a repair job my brother came across. Apparently there were a few of these replica Star Wars Thermal Detonators made with lights and sound. Unfortunately, the one I was asked to look at, was completely dead. It didn’t take me long to find out the problem. The owner of this prop made a very terrible but honest mistake. When it came time to replace the batteries, they accidentally replaced the required N size 1.5V batteries with the similarly sized A23 12V batteries. There’s no indication at all on the battery compartment or elsewhere to clue the owner in on what size to use. Very unfortunate. At this point the internal electronics are toast and will need to be replaced, however the owner didn’t want to spend the money to get it working again. Still, it’s a pretty cool prop.

Let’s Play Kerbal!

My brother and I love to play video and computer games together. Usually it’s Halo, Sins of a Solar Empire, or more recently Kerbal Space Program. Tonight we decided to see how many big screens we could play it on.

It worked out pretty well. Oh, and how do you play a single player game with two people? You take turns.

Smart Chicken Coop Light

When we first got chickens, we were trying all kinds of things we read online to get the most out of our laying hens. This project was one of those silly ideas to try and provide more “daylight” for the chickens year round, so they would lay eggs year round.

I threw this together on a weekend. With these basic features in mind:

  • On and off schedule
  • Dimmable
  • Log temperature and Humidity
  • Battery Powered

I used the following parts to make it happen (mostly because I already had them available):

I’m not going to go into a detailed step by step process on how I put this together, but hopefully between the pictures and description you can get the idea.

I followed these general steps to assemble the hardware:

  1. Layout placement of parts in the lights
  2. Modify light fixture
    • Cut out battery holder
    • Join the two lights together
    • Drill out holes for charge port, and mounting points
  3. Wire components and fit into lights
    • Solder the JST Jumper wire to the battery so it can be plugged straight into the Blynk board
    • Wire the MOSFET Source -> GND, LED Cathode -> MOSFET Drain, LED Anode -> Vin, MOSFET Gate -> Pin 5. (Circuit Demo)
    • Wire temperature sensor to the ADC pin
  4. Test, rinse, repeat
  5. Semi-permanently mount board and battery
  6. Close it all up and test

Arduino sketch and Blynk app source: https://github.com/RubenFixit/smart_light_sf_blynk