Get Back! Brooch


1. Team Ahaar – The Get Back! Brooch
Oomung, Phuong Anh, Tzu-Ching and André

2. Ideal Product:

Get Back! is a brooch/pendant that visually and audibly shows the comfortable amount of personal space by the user. It uses a built-in infrared sensor to judge distance, and a Neopixel to show different colors. With these pieces, the product would judge the distance between the user and another person, and glow green to indicate acceptable, yellow to indicate discomfort, red to indicate anxiety, and pulsing red to indicate panic depending on distance. Ideally, it can also:

  • Produce sounds when others are getting too close to the wearer
  • Have an on/off switch
  • Allow the wearer to set his/her own comfortable distance

Ideal User Scenario:

We envision this product as a discreet, daily wearable for those with crowd anxiety disorders, personal space issues, or women subject to subtle harassment by unknowingly aggressive people. This product would be switched on continually throughout the day, and act as a social advocate of sorts, alerting others to their behavior in a subtle way without pressuring the user to do so themselves.

A user scenario could be a young man with anxiety who wears the product as a lapel pin on his suit jacket. During a normal day at the office, whenever a colleague got uncomfortably close, the product would flash and alert them to slightly back away, at once restoring personal space for our young man and avoiding embarrassment for his colleague.

Where the Product Would Be Sold:

This product would be marketed as a “smart” fashion accessory, and could be sold at premium menswear clothiers, women’s fashion boutiques, and department stores.

3. The technical steps to our prototype:

  1. Design the look
    IMG_6177 copy.jpg
  2. Design the circuit diagram
  3. Code it
  4. Get the materials: Sharp IR Distance Sensor, Neopixel ring (12 x WS2812 5050 RGB LED Ring), plastic case for the dome, 3D model design and some wires
  5. Construct the device
    • Solder wires
    • 3D model and printed case
    • Attach everything together


We had some run-ins with the sensor not working properly as it was placed behind the transparent dome. Thus, we decided to sawed the front off. And it worked!!


Our circuit

4. If given more time on this project, we would:

Work out a way to hide all of the wires and it would have a small battery pack encased with the Neopixel.

5. By building this project, we learned:

How to design a form with the intention of a circuit board inside. We also learned to troubleshoot and try to fix the problems that came up along the way (both in coding and the process of making the casing and attaching all the parts together.

Oomung’s experience: Every time the code was iterated upon to solve old problems, new ones arose. This experience reaffirmed the difficulty and importance of coding and bug-testing. The key element for me was understanding the use of arrays to generate an average ‘smooth’ input from the raw and glitchy analog input. Also, understanding the circuit board and electronic components helped in form development, wherein our design fit together all the pieces while maintaining our core sense of aesthetics.

6. Other potential applications

  • Mounted on a wall next to paintings in a gallery, to let people know if they’re being too close
  • Late night protection wear on the back: warning people with bad intention that the wearer is aware they are there.
  •  Don’t touch my hairpin

7. Our code

/this code requires the Sharp.IR code libary and a sharp ir sensor, the VFL has them to lend out
//this specifies what model and pin the sensor is on, i called it sensor
SharpIR sensor(GP2YA41SK0F, A2);

#ifdef __AVR__
#include <avr/power.h>

#define NUM_LEDS 12

#define BRIGHTNESS 5

const int numReadings = 50;

int readings[numReadings]; // the readings from the analog input
int readIndex = 0; // the index of the current reading
int total = 0; // the running total
int average = 0; // the average

//you all know what this is

#define PIN 6

//specify the which type of neopixel strip this is, RGBW
Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800);

void setup()
strip.begin();; // starts with all the pixels off
// initialize all the readings to 0:
for (int thisReading = 0; thisReading < numReadings; thisReading++) { readings[thisReading] = 0; } } void loop() { // subtract the last reading: total = total - readings[readIndex]; // read from the sensor: readings[readIndex] = sensor.getDistance(); // add the reading to the total: total = total + readings[readIndex]; // advance to the next position in the array: readIndex = readIndex + 1; // if we're at the end of the array... if (readIndex >= numReadings) {
// ...wrap around to the beginning:
readIndex = 0;

// calculate the average:
average = total / numReadings;
// send it to the computer as ASCII digits

delay(1); // delay in between reads for stability

//an if+else reacting to 3cm-10cm distance with a specific color for every individual pixel

//first led
if (average >22) {
strip.setPixelColor(0,strip.Color(0, 217, 0));;
} else {
strip.setPixelColor(0, 0);;

//second led
}if (average == 22) {
strip.setPixelColor(1,strip.Color(10, 217, 0));;
} else {
strip.setPixelColor(1, 0);;

//third led
}if (average == 21) {
strip.setPixelColor(2,strip.Color(30, 190, 0));;
} else {
strip.setPixelColor(2, 0);;

//fourth led
}if (average == 20) {
strip.setPixelColor(3,strip.Color(60, 150, 0));;
} else {
strip.setPixelColor(3, 0);;

//fifth led
}if (average == 19) {
strip.setPixelColor(4,strip.Color(150, 120, 0));;
} else {
strip.setPixelColor(4, 0);;

//sixth led
}if (average == 18) {
strip.setPixelColor(5,strip.Color(150, 100, 0));;
} else {
strip.setPixelColor(5, 0);;

//seventh led
}if (average == 17) {
strip.setPixelColor(6,strip.Color(150, 70, 0));;
} else {
strip.setPixelColor(6, 0);;

//eighth led
}if (average == 16) {
strip.setPixelColor(7,strip.Color(150, 60, 0));;
} else {
strip.setPixelColor(7, 0);;

//ninth led
}if (average == 15) {
strip.setPixelColor(8,strip.Color(150, 40, 0));;
} else {
strip.setPixelColor(8, 0);;

//tenth led
}if (average == 14) {
strip.setPixelColor(9,strip.Color(180, 20, 0));;
} else {
strip.setPixelColor(9, 0);;

//eleventh led
}if (average == 13) {
strip.setPixelColor(10,strip.Color(217, 0, 0));;
} else {
strip.setPixelColor(10, 0);;

//twelvth led
}if (average <=12) {
strip.setPixelColor(11,strip.Color(0, 217, 0));;
} else {
strip.setPixelColor(11, 0);;