Concept:
We wanted to create a musical instrument that works without touching anything (of course but the switch button). So we used the ultrasonic sensor to control the frequency of the sound outputted by the buzzer. While coding we found it very annoying for the buzzer to run all of the time, without any option to stop it. Hence, we found it critical to add a button that controls whether the ultrasonic sensor and the buzzer are running. We also wanted to make it fancy in a way that you don’t hold the button for it to work but just press on it to start and press again to stop it, and that’s what we did. The ultrasonic measures the distance by the duration of time of the ultrasonic wave takes to come back, and by that controls the frequency of the buzzer. We also created a feedback loop from the serial by which we can know the distance and the frequency outputted.
Code:
The pins were declared:
int buttonPin = 2; int echo = 6; int trig = 5; int speaker = 9; long duration; long distance; bool isPressed = false;
then the ultrasonic trig and echo were settled up to the pins and the serial was set up as well:
void setup() { // setup pin modes Serial.begin(9600); pinMode(speaker, OUTPUT); pinMode(trig, OUTPUT); pinMode(echo, INPUT); // pinMode(buttonPin, INPUT); // pinMode(buttonPin, INPUT_PULLUP); }
the void loop basically has everything to do with the switch. a global variable was declared so that we save the last state of the ultrasonic and the buzzer, and when the button is pressed it switches the state. so when if the sensor is not running it makes it start running and vice versa. Moreover, I noticed that a delay had to be added because the void loop runs numerous times while the button is being pressed so it basically turns the sensor on and off numerous times giving us a 50% possibility of tuning the sensors on when the button is released. Hence, the delay is crucial for the project to work.
oid loop() { digitalWrite(trig, LOW); delayMicroseconds(2); int buttonState = digitalRead(buttonPin); if(buttonState == HIGH){ Serial.println("button pressed"); // delay(5000); if(isPressed == false){ isPressed = true; delay(1000); }else if(isPressed == true){ Serial.print("came pressed "); noTone(speaker); isPressed = false; Serial.println(isPressed); delay(1000); } // blink(2); } // Serial.println(isPressed); if(isPressed == true){ updateSensor(); } }
Finally, the function that makes the sensor work, as in Tarek’s previous project the sensor calculates the distance by measuring the time it takes for the waves to go out and come back to the sensor again. based on that it scales the distance from 0 to 100 cm to the frequencies from 0 to 455. then it makes the buzzer start the sound in that specific frequency.
void updateSensor(){ digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); duration = pulseIn(echo, HIGH); distance = duration * 0.034 / 2; int frequency = ((int)(distance * 4.55) ); frequency = (frequency > 455)? 455 : frequency; Serial.print("Distance: "); Serial.print(distance); Serial.print(" cm, "); Serial.print("frequency: "); Serial.println(frequency); tone(speaker,frequency); delay(200); }
Reflections:
While working on the project we noticed the potential that we have with just this Arduino and minor sensors like the ultrasonic and small gadgets like the buzzer. It also spiked our curiosity to find out what else can be done with such gadgets.