Analog Sensors: Safeguard

For this assignment, we were asked to control an LED in an “unexpected” way using information from an analog sensor. Going off of this prompt, I created a ‘Safeguard’ using a motion sensor, a servo motor, a buzzer, and an RGB LED light. Here is a rough circuit sketch:

The LED lights up based on readings from the motion sensor about the object’s proximity; so if the object or person is at a safe distance, the LED turns green. At a medium distance, it turns yellow. When the object gets too close to the sensor, the LED turns red and triggers sound from the buzzer along with a movement from the servo motor. Although the stop sign kind of hints at the outcome, there is a sense of ‘surprise’ in that you don’t know how or when it is triggered unless you interact with the sensor. Here is an image of the circuit:

One of the challenges I faced while making this was that I wanted the stop sign to be part of the circuit, rather than a mere cardboard cutout. However, I realized that using a servo to move the sign around reconciles that. If I were to improve this project, I would incorporate an LCD screen to use instead of the cardboard sign.

Here is a final video demonstration:

And here, you can find the code I used to make it work:

    #include <Servo.h>                
    const int trigPin = 11;                
    const int echoPin = 12;                  
    const int redPin = 3;             
    const int greenPin = 5;           
    const int bluePin = 6;            
    const int buzzerPin = 10;         
    float distance = 0;               
    Servo myservo;                    
    void setup()
      Serial.begin (9600);        
      pinMode(trigPin, OUTPUT);   
      pinMode(echoPin, INPUT);    
      //set the RGB LED pins to output
      pinMode(redPin, OUTPUT);
      pinMode(greenPin, OUTPUT);
      pinMode(bluePin, OUTPUT);
      pinMode(buzzerPin, OUTPUT);   
    void loop() {
      distance = getDistance();  
      Serial.println(" in");    
      if(distance <= 10){            //close distance            
        //make the RGB LED red
        analogWrite(redPin, 255);
        analogWrite(greenPin, 0);
        analogWrite(bluePin, 0);
        //this code moves the servo and triggers the buzzer
        tone(buzzerPin, 272);         //turn buzzer on
        myservo.write(60);            //move servo to 45 degrees
        noTone(buzzerPin);            //turn buzzer off
        myservo.write(150);           //move servo to 135 degrees
      } else if(10 < distance && distance < 20){  //medium distance
        //make the RGB LED yellow
        analogWrite(redPin, 255);
        analogWrite(greenPin, 50);
        analogWrite(bluePin, 0);
      } else{                                     //far distance
        //make the RGB LED green
        analogWrite(redPin, 0);
        analogWrite(greenPin, 255);
        analogWrite(bluePin, 0);    
      delay(50);      //delay 50ms between each reading
    float getDistance()
      float echoTime;                  
      float calculatedDistance;       
      digitalWrite(trigPin, HIGH);
      digitalWrite(trigPin, LOW);
      echoTime = pulseIn(echoPin, HIGH);      
      calculatedDistance = echoTime / 148.0;  
      return calculatedDistance;              
  //credits: SparkFun Electronics.





Leave a Reply