Office stop light

Office Busy Signal Stoplight

Since I’m working from home these days, because of COVID-19 and social distancing to flatten the curve, I decided to clean my office. When I clean/organize I end up getting rid of a bunch of stuff I haven’t used in years. I also sometime find small treasures.

In one of the random-stuff boxes I found my Dad’s original office stoplight that he used when I was a kid. 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 let me be when I’m in the middle of something.

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 the 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

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!

Floodlight on Tripod

I recently acquired an LED flood light to help shed some light on my projects. I found that it works best if it is mounted up high. To do this, without putting holes in the wall, I used my tripod. It has a quick release attachment that I find very useful.

This quick release mechanism is designed to be used with a camera. However, the concept is pretty simple. In the image above, the left is the empty quick-release housing. By moving the lever on the left up, it makes it possible to insert the camera mount pad (center). The mounting pad is simply a square piece with beveled edges.

Now, How to mount the floodlight to the tripod? This is where I had the idea of creating another mounting pad that would mount to the floodlight using the existing hardware. I decided that is would be easiest to just 3D print the part even though it very well could have been made from wood or other materials with a little more effort.

As you can see, I simply duplicated the mounting pad and extended it. This allowed the nuts and bolts that hold the legs onto the light to also hold the mounting pad.

Now I can put my light on my tripod with just a flick of a switch.

And a big thank you to my brother for drawing up my idea and printing it.

Creative Fatal1ty Gaming Headset Hack

I’ve been using this headset with my Xbox 360 for a while now. But I always found it so cumbersome to use by running an extension from the end of the cable up to where I hold my controller. So about 3 months ago I modified them to be the perfect Xbox headset.

I realize that many of my posts would be much more helpful if they had detailed instructions on how I was able to do what I did. This is one of those times where I wish I had taken more pictures while working on them, instead of just afterwards. I don’t even have a decent before picture.

Essentially, I removed the mic plug and cable and soldered it directly into the volume/mic control

The silver adapter, in the right photo above the mic plug, makes it so I can plug it directly into my Xbox 360 controller.

Now the distance from the headset to my controller is perfect with no more extra cables. So much nicer than what I was doing before.

If I ever get my hand on another one I’ll be sure to do a How-To step-by-step guide. And if anyone would like me to mod theirs I’ll do it for free. Just shoot me an email and we can work out the details.

3 ways to Free up unnecessary used HDD space on Windows 7

NOTE: These methods work best for systems that have a large amount of memory (RAM).


1. Hibernation Reserved Space

Hibernation reserves HD space up to the amount of memory your system has. To disable hibernation and recover that drive space then type the following command with administrator privileges in cmd.exe.

powercfg -h off

2. Decrease Virtual memory

Similarly to hibernation the system page file or virtual memory also reserves HD space up to the amount of memory your system has. This shouldn’t every be disabled, but you can reduce it to a more reasonable size especially if you have over 4GB of memory. Follow the steps bellow.
  • Right click “Computer” and click “Properties”
  • Click on “Advanced system settings” in the left column
  • In the “Performance” section, click on “Settings”
  • Go to the “Advanced “ tab
  • In the “Virtual Memory” section click on “Change”
  • Uncheck “Automatically manage paging File size for all drives”
  • Chose the “Custom size” radial button
    • set the “Initial size (MB):” to 512
    • set the “Maximum size (MB):” to 1024
  • Restart your computer for changes to take effect

3. Remove Service Pack 1 backups Thanks Alan McBurney

After installing Service Pack 1 about 4GB are used to maintain backup files. If you are certain that you will never need to revert back before SP1 then you can free up this space by typing the following command with administrator privileges in cmd.exe.

DISM /online /Cleanup-Image /SpSuperseded