Safety Glasses

The concept of the Safety Glasses project is inspired by the Joo Janta 200 Super-Chromatic Peril Sensitive Sunglasses of tThe Hitchhiker’s Guide to the Galaxy. These glasses turned completely black at the sight of any danger, to give a relaxed attitude when presented with an alarming situation.
I made a pair of glasses that cover your eyes when you are scared or nervous. These would be specially useful at the movie theater, where some graphic scenes are excruciating enough for covering your eyes. The glasses would have the pulse sensor on an earring clipped to one of the lobes. When the sensor detects an exaltation in pulse servos on both sides of the glasses will close the curtains covering both eyes. The arduino board and two demo buttons are housed in a small plastic box that fits in your pocket.

 

 

 

 

 

 

 

 

 

#include Servo myservo; // create servo object to control a servo

// a maximum of eight servo objects can be created
int buttonPin = 2;
int buttonPin2 = 3;
int buttonState = 0;
int buttonState2 = 0;
boolean opened= false;
int pulseThreshold = 76; // This or above opens it up
// Heart rate
unsigned long time; // Holds current time for pulse rate calculation
unsigned long lastTime; // Used for calculating time between beats
int Sensor; // Holds current analog Sensor Reading
int lastSensor; // Used to find waveform direction
int Peak; // Holds value of peak in waveform
int Trough; // Holds value of trough in waveform
int beats[10]; // Array to collect time between beats for calculating BPM
int beatCounter = 0; // Used to hold position in beats array
int QuantifiedSelf; // Used to hold the heart rate value (BPM)
int drop; // Holds the amplitude of waveform
int fadeRate = 10; // when arduino finds a heartbeat, it will fade an LED on pin 11 (PWM)
int Fade = 0; // Fade variable will set PWM
boolean falling = false; // used to keep track of waveform direction
// PINS
int LED = 13; // pin 13 LED blinks on each pulse
int dimLED = 11; // LED on pin 11 fades with each pulse
int PulseSensor = 5; // Pulse Sensor purple wire connected to analog pin 5
//
void setup() {
Serial.begin(9600);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
myservo.attach(10); // attaches the servo on pin 10 to the servo object
pinMode(buttonPin, INPUT);
pinMode(buttonPin2, INPUT);
setupPulseSensor();
}
//
void setupPulseSensor() {
pinMode(LED, OUTPUT); // set the LED pins as outputs
pinMode(dimLED, OUTPUT);
Serial.begin(115200); // start the hardware serial block and set the baud rate
lastTime = millis(); // initialize lastTime variable
}
//
void loop() {
loopPulseSensor();
//
buttonState = digitalRead(buttonPin);
buttonState2 = digitalRead(buttonPin2);
if (!opened && (buttonState == HIGH || QuantifiedSelf > pulseThreshold)) {
Serial.println(“yay”);
myservo.attach(9);
myservo.write(50);
delay(202.5);
myservo.attach(10);
myservo.write(130);
delay(202.5);
opened= true;
} else if (opened && (buttonState2 == HIGH || (QuantifiedSelf < pulseThreshold && QuantifiedSelf > 50))) {
Serial.println(“yay2”);
myservo.attach(9);
myservo.write(130);
delay(190);
myservo.attach(10);
myservo.write(50);
delay(190);
opened= false;
} else {
myservo.detach();
// Serial.println(“1=”);
}
}
void loopPulseSensor() {
Sensor = analogRead(PulseSensor); // take a reading
// Serial.print(“s”); // send raw analog data to Processing sketch (or other)
// Serial.println(Sensor); // ‘s’ = Raw Sensor Data
Serial.println(QuantifiedSelf);
// USE WITH LED ON PIN 11 FOR FADE EFFECT
Fade -= fadeRate; // Fade variable set to 255 when heart beat is found
Fade = constrain(Fade,0,255); // these lines fade the LED
analogWrite(dimLED,Fade);
// KEEP TRACK OF THE DIRECTION OF THE WAVEFORM
if (falling == false){ // if the sensor values are rising
if (Sensor < lastSensor-1){ // if current reading is less than last reading – noise falling = true; // a peak has been reached Serial.print(“P”); // send peak value to Processing scketch (or other) Serial.println(Peak); // ‘P’ = Peak in waveform digitalWrite(LED,LOW); // turn off pin 13 LED }else if(Sensor > lastSensor){ // otherwise, if current reading is bigger, values are still rising
Peak = Sensor; // record the next potential peak
lastSensor = Sensor; // keep track of rising signal
}
}
if (falling == true){ // if the sensor values are falling
if (Sensor > lastSensor){ // if current reading is bigger than last reading
falling = false; // a trough has been reached
Serial.print(“T”); // send trough value to Processing sketch (or other)
Serial.println(Trough); // ‘T’ = Trough in waveform
drop = Peak – Trough; // difference = signal amplitude
Peak = 0; // setting Peak to 0 here helps get rid of noise
// THIS IF STATEMENT IS HOW THE HEARTBEAT IS FOUND IN PULSE SENSOR WAVEFORM
if (drop > 4 && drop timeBeat(); // go work out the BPM
Serial.print(“d”); // send the amplitude to Processing Sketch (or other)
Serial.println(drop); // ‘d’ = amplitude of waveform
digitalWrite(LED,HIGH); // start pin 13 LED blink
Fade = 255; // set fading LED to high brightness
}
}else if (Sensor < lastSensor){ // otherwise, if current reading is smaller weʻre still falling
Trough = Sensor; // record the next potential trough
lastSensor = Sensor; // keep track of falling signal
}
}
delay(20); // break for 20mS. Processing frame-rate = 100.
}// END VOID LOOP
void timeBeat(){
time = millis(); // take note of the current time
beats[beatCounter] = time – lastTime; // record miliseconds since the last pulse in beats array
lastTime = time; // stay up to date!
beatCounter ++; // move array pointer to next position in array
if (beatCounter == 10){ // if we’ve taken 10 readings, it’s time to derive heart rate
QuantifiedSelf = getBPM(); // go derive the heart rate
Serial.print(“q”); // send the heart rate to Processing sketch (or other)
Serial.println(QuantifiedSelf); // ‘q’ = heart rate
beatCounter = 0;
}
}// END OF timeBeat FUNCTION
// This function will return a value for heart rate (Beats Per Minute)
int getBPM(){
int dummy; // used in sorting
int mean; // used in averaging
boolean done = false; // clear sorting flag
// this simple sorting routine will arrange values in the beat array from lowest to highest
while(done != true){
done = true;
for (int j=0; j beats[j + 1]){ // sorting numbers here
dummy = beats[j + 1];
beats [j+1] = beats[j] ;
beats[j] = dummy;
done = false;
}
}
}
// this FOR loop selects the longer beat time values to avoid incorrect heart rate readings
for(int k=1; k mean += beats[k]; // add beat times together
}
mean /=8; // averaging
mean = 60000/mean; // devide 60 seconds by average pulse length
return mean; // return beats per minute
}// END OF getBPM function