This project explores using a waving gesture to control the brightness of a desk lamp in order to prevent needing to fumble for a button/switch as well as make the lamp more accessible to those without fine motor control.

LED strip and IR emitters

IR break-beam sensors

Danny interacting with lamp

Cynthia interacting with lamp


Process Images and Review

As an industrial design student, I really wanted to emphasize the form of the lamp and create an object that would be ready to use. After debating on a few different variants, I decided on a shape that I thought would be inviting to look at and also serve its purpose on a desk.

In addition, the ability to program different input thresholds and responses using the installed hardware allowed me to hone in on a method of triggering the brightness that made sense and worked as intended. I really wanted to incorporate an additional “fast wave” that could trigger a rainbow sequence, but was ultimately not able to figure out the proper code before the due date of the project. I attempted to use a timer that initiated when any of the break beam sensors were triggered and looked for a certain number of break beams triggered within a small amount of time; however, I experienced issues with getting those rules to apply in parallel with the standard brightness settings.

I did small thumbnail sketches to explore different proportions and orientations

Testing the LED strip light to learn the wiring as well as basic features

Crude mockup of break beam sensors in series connected to an LED

Cutting all of the housing components by hand turned out to be quite time consuming

I opted to solder and heat shrink most of the connections rather than use a breadboard so that the internal components could be more durable and compact



During the in-class critique, I received a lot of valuable comments from my peers. One individual wrote that he/she “really like[d] the design [but] another row of lights would be great to make it brighter.” This is something I definitely agree with since I needed to dim the lights during the demo in order to make the change in brightness more visible, and I’ll definitely incorporate this into the next version. Someone else had the comment of, “Could use a movable arm on the top to allow for more movement. Maybe a warmth dial for warm yellow light to bright blue light.” While I agree that it would be great to pack more features into the lamp, I’ll need to do a lot of thinking in how I can set up the sensors to be multidimensional and allow for a greater variety of gestures.

While I wasn’t able to get all of the intended functions to work properly, I’m still satisfied with the outcome as my first project to incorporate electronics. I expected that one aspect of such a project would involve designing a form around technical constraints (such as size of components, etc.), but I didn’t realize how much of a challenge the coding aspect would be in terms of refining the interaction. I found that it’s difficult to contend with both the hardware and software aspects at once since the two are interconnected. For example, if I were to change the distance that the break beam sensors were from one another, some of the thresholds in the code would need to change and vice versa. I enjoyed this added layer of problem solving, but it was difficult none the less.

In terms of next steps, I have begun to make CAD drawings of how this lamp could look as a realized product. In addition, as I stated before, I’d like to further develop the possible interactions in order to enable more features.

CAD render of possible form


Technical Information

Wiring diagram

 * Gesture Controlled Desk Lamp
 * by Eric Wong
 * Pololu LED strip library was used along with modified example code

#include <PololuLedStrip.h>

// Create an ledStrip object and specify the pin it will use.
PololuLedStrip<12> ledStrip;

// Create a buffer for holding the colors (3 bytes per color).
#define LED_COUNT 12
rgb_color colors[LED_COUNT];

void setup()
  //Turn on all of the IR beams/sensors
  pinMode(1, INPUT);     
  digitalWrite(1, HIGH);
  pinMode(2, INPUT);     
  digitalWrite(2, HIGH);
  pinMode(3, INPUT);     
  digitalWrite(3, HIGH);

  pinMode(4, INPUT);     
  digitalWrite(4, HIGH);

  pinMode(5, INPUT);     
  digitalWrite(5, HIGH);

void loop()
  //Loop executes LED commands for all 12 lights in strip
  int x;
  for (uint16_t i = 0; i < LED_COUNT; i++) {
    //LED color is a ratio of X so that the color can remain consistent while brightness can easily be manipulated
    colors[i] = rgb_color(15*x, 7*x, 3*x);

    //First if statement represents the first beam that turns light off
    if (digitalRead(1) == LOW) {
    ledStrip.write(colors, LED_COUNT);

    if (digitalRead(2) == LOW) {
    ledStrip.write(colors, LED_COUNT);

    if (digitalRead(3) == LOW) {
    ledStrip.write(colors, LED_COUNT);

    if (digitalRead(4) == LOW) {
    ledStrip.write(colors, LED_COUNT);

    //Last if statement represents the last beam that turns on full brightness
    if (digitalRead(5) == LOW) {
    ledStrip.write(colors, LED_COUNT);