Overall Image
LED-photoresistor setup with coin slot. The coin passing through these breaks the light to the photoresistor, triggering the flag motor.
Flag in front of ultrasonic sensor before released state. The movement of the motor raises the flag, increasing the detected distance, which triggers a speaker (left) to play a tone.

Demo Video

Basic functionality: The user drops a coin into the top of a box. This turns off an LED, which raises a small flag. This causes a short song to play, giving you a lot of satisfaction.

Progress Images and Notes

Creating the circuit on a breadboard, using an LED and covering the photo-resistor with our fingers to simulate the functionality of the speaker and coin drop. This was the phase in which we tested the different steps in our code.
Creating the box, and putting it together. Needed to get special acrylic cement, and was a time consuming process.
Building the box and placing the parts inside it, aligning them so that the coin was dropped in a precise location and the flag had space to rise. Practicality of the setup was tested and design was modified here.

Schematic

Code

  1. <span class="com">/*
  2. Project 1
  3. Eric Mendez (emendez)
  4. Tanvi Bhargava (tanvib)
  5. Description: The user drops a coin into the top of a box. This turns off an
  6. LED which is looking at a photoresistor.The light level goes below the
  7. defined threshold for the photoresistor which raises a small flag. The flag
  8. was covering a sonar sensor, but now the distance detected is over the
  9. defined threshold which causes a short song to play, giving you
  10. a lot of satisfaction.
  11. */</span><span class="pln">
  12. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Servo.h></span><span class="pln">
  13. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><NewPing.h></span><span class="pln">
  14. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><TimerFreeTone.h></span><span class="pln">
  15. </span><span class="com">// pin assignments</span><span class="pln">
  16. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> TRIGGER_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12</span><span class="pun">;</span><span class="pln">
  17. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> ECHO_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">11</span><span class="pun">;</span><span class="pln">
  18. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MAX_DISTANCE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">200</span><span class="pun">;</span><span class="pln"> </span><span class="com">//max distance we want for ping</span><span class="pln">
  19. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SERVO_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
  20. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> LED_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8</span><span class="pun">;</span><span class="pln">
  21. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PHOTO_RESISTOR </span><span class="pun">=</span><span class="pln"> A2</span><span class="pun">;</span><span class="pln">
  22. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SOUND_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln">
  23. </span><span class="com">// declare servo and sonar from libraries</span><span class="pln">
  24. </span><span class="typ">NewPing</span><span class="pln"> sonar</span><span class="pun">(</span><span class="pln">TRIGGER_PIN</span><span class="pun">,</span><span class="pln"> ECHO_PIN</span><span class="pun">,</span><span class="pln"> MAX_DISTANCE</span><span class="pun">);</span><span class="pln">
  25. </span><span class="typ">Servo</span><span class="pln"> flagMotor</span><span class="pun">;</span><span class="pln">
  26. </span><span class="com">// note intervals for song</span><span class="pln">
  27. </span><span class="kwd">int</span><span class="pln"> quarter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">250</span><span class="pun">;</span><span class="pln">
  28. </span><span class="kwd">int</span><span class="pln"> eighth </span><span class="pun">=</span><span class="pln"> </span><span class="lit">125</span><span class="pun">;</span><span class="pln">
  29. </span><span class="kwd">int</span><span class="pln"> sixteenth </span><span class="pun">=</span><span class="pln"> eighth</span><span class="pun">/</span><span class="lit">2</span><span class="pun">;</span><span class="pln">
  30. </span><span class="kwd">int</span><span class="pln"> D </span><span class="pun">=</span><span class="pln"> </span><span class="lit">587</span><span class="pun">;</span><span class="pln">
  31. </span><span class="kwd">int</span><span class="pln"> E </span><span class="pun">=</span><span class="pln"> </span><span class="lit">659</span><span class="pun">;</span><span class="pln">
  32. </span><span class="kwd">int</span><span class="pln"> F </span><span class="pun">=</span><span class="pln"> </span><span class="lit">698</span><span class="pun">;</span><span class="pln">
  33. </span><span class="kwd">int</span><span class="pln"> G </span><span class="pun">=</span><span class="pln"> </span><span class="lit">784</span><span class="pun">;</span><span class="pln">
  34. </span><span class="kwd">int</span><span class="pln"> A </span><span class="pun">=</span><span class="pln"> </span><span class="lit">880</span><span class="pun">;</span><span class="pln">
  35. </span><span class="kwd">int</span><span class="pln"> melody</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> D</span><span class="pun">,</span><span class="pln"> D</span><span class="pun">,</span><span class="pln"> A</span><span class="pun">,</span><span class="pln"> F</span><span class="pun">,</span><span class="pln"> G</span><span class="pun">,</span><span class="pln"> A</span><span class="pun">,</span><span class="pln"> G</span><span class="pun">,</span><span class="pln"> F</span><span class="pun">,</span><span class="pln"> E</span><span class="pun">,</span><span class="pln"> D</span><span class="pun">};</span><span class="pln">
  36. </span><span class="kwd">int</span><span class="pln"> duration</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">(</span><span class="pln">quarter</span><span class="pun">+</span><span class="pln">eighth</span><span class="pun">),</span><span class="pln"> eighth</span><span class="pun">,</span><span class="pln"> eighth</span><span class="pun">,</span><span class="pln"> eighth</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">quarter</span><span class="pun">*</span><span class="lit">4</span><span class="pun">),</span><span class="pln">
  37. sixteenth</span><span class="pun">,</span><span class="pln"> sixteenth</span><span class="pun">,</span><span class="pln"> eighth</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">quarter</span><span class="pun">*</span><span class="lit">4</span><span class="pun">),</span><span class="pln"> </span><span class="pun">(</span><span class="pln">quarter</span><span class="pun">*</span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
  38. </span><span class="com">// declare variables used throughout loop</span><span class="pln">
  39. </span><span class="kwd">int</span><span class="pln"> playedSong </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  40. </span><span class="kwd">int</span><span class="pln"> ledState </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 1 - on | 0 - off</span><span class="pln">
  41. </span><span class="kwd">int</span><span class="pln"> lightLevel</span><span class="pun">;</span><span class="pln"> </span><span class="com">//photoresistor</span><span class="pln">
  42. </span><span class="kwd">int</span><span class="pln"> distance</span><span class="pun">;</span><span class="pln">
  43. </span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  44. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
  45. pinMode</span><span class="pun">(</span><span class="pln">LED_PIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  46. pinMode</span><span class="pun">(</span><span class="pln">PHOTO_RESISTOR</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln"> </span><span class="com">// eliminates need for pullup/pulldown resistor</span><span class="pln">
  47. pinMode</span><span class="pun">(</span><span class="pln">SOUND_PIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  48. flagMotor</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">SERVO_PIN</span><span class="pun">);</span><span class="pln">
  49. flagMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="lit">90</span><span class="pun">);</span><span class="pln">
  50. digitalWrite</span><span class="pun">(</span><span class="pln">LED_PIN</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  51. digitalWrite</span><span class="pun">(</span><span class="pln">SOUND_PIN</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  52. </span><span class="pun">}</span><span class="pln">
  53. </span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  54. lightLevel </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">PHOTO_RESISTOR</span><span class="pun">);</span><span class="pln">
  55. distance </span><span class="pun">=</span><span class="pln"> sonar</span><span class="pun">.</span><span class="pln">ping_cm</span><span class="pun">();</span><span class="pln">
  56. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">distance</span><span class="pun">);</span><span class="pln">
  57. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">lightLevel </span><span class="pun">></span><span class="pln"> </span><span class="lit">200</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  58. </span><span class="com">// scale reversed since using input pullup: low -> high light level</span><span class="pln">
  59. digitalWrite</span><span class="pun">(</span><span class="pln">LED_PIN</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  60. ledState </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  61. </span><span class="com">// throw flag up</span><span class="pln">
  62. flagMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="lit">170</span><span class="pun">);</span><span class="pln">
  63. </span><span class="pun">}</span><span class="pln">
  64. </span><span class="com">// case over sonar detection of flag</span><span class="pln">
  65. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ledState </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> distance </span><span class="pun">></span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> playedSong </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  66. </span><span class="com">// flag goes up and trigger sound</span><span class="pln">
  67. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"play sound"</span><span class="pun">);</span><span class="pln">
  68. playedSong </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  69. </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> thisNote </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> thisNote </span><span class="pun"><</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> thisNote</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  70. </span><span class="com">// Loop through the notes in the array.</span><span class="pln">
  71. </span><span class="typ">TimerFreeTone</span><span class="pun">(</span><span class="pln">SOUND_PIN</span><span class="pun">,</span><span class="pln"> melody</span><span class="pun">[</span><span class="pln">thisNote</span><span class="pun">],</span><span class="pln"> duration</span><span class="pun">[</span><span class="pln">thisNote</span><span class="pun">]);</span><span class="pln">
  72. </span><span class="com">// Play thisNote for its coresponding duration.</span><span class="pln">
  73. delay</span><span class="pun">(</span><span class="lit">50</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Short delay between notes.</span><span class="pln">
  74. </span><span class="pun">}</span><span class="pln">
  75. </span><span class="pun">}</span><span class="pln">
  76. </span><span class="pun">}</span>
<span class="com">/*
   Project 1
   Eric Mendez (emendez)
   Tanvi Bhargava (tanvib)
   
   Description: The user drops a coin into the top of a box. This turns off an 
   LED which is looking at a photoresistor.The light level goes below the 
   defined threshold for the photoresistor which raises a small flag. The flag 
   was covering a sonar sensor, but now the distance detected is over the 
   defined threshold which causes a short song to play, giving you
   a lot of satisfaction.
*/</span><span class="pln">

</span><span class="com">#include</span><span class="pln"> </span><span class="str"><Servo.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><NewPing.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><TimerFreeTone.h></span><span class="pln">

</span><span class="com">// pin assignments</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> TRIGGER_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> ECHO_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">11</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MAX_DISTANCE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">200</span><span class="pun">;</span><span class="pln"> </span><span class="com">//max distance we want for ping</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SERVO_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> LED_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PHOTO_RESISTOR </span><span class="pun">=</span><span class="pln"> A2</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SOUND_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln">

</span><span class="com">// declare servo and sonar from libraries</span><span class="pln">
</span><span class="typ">NewPing</span><span class="pln"> sonar</span><span class="pun">(</span><span class="pln">TRIGGER_PIN</span><span class="pun">,</span><span class="pln"> ECHO_PIN</span><span class="pun">,</span><span class="pln"> MAX_DISTANCE</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Servo</span><span class="pln"> flagMotor</span><span class="pun">;</span><span class="pln">

</span><span class="com">// note intervals for song</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> quarter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">250</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> eighth </span><span class="pun">=</span><span class="pln"> </span><span class="lit">125</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> sixteenth </span><span class="pun">=</span><span class="pln"> eighth</span><span class="pun">/</span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> D </span><span class="pun">=</span><span class="pln"> </span><span class="lit">587</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> E </span><span class="pun">=</span><span class="pln"> </span><span class="lit">659</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> F </span><span class="pun">=</span><span class="pln"> </span><span class="lit">698</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> G </span><span class="pun">=</span><span class="pln"> </span><span class="lit">784</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> A </span><span class="pun">=</span><span class="pln"> </span><span class="lit">880</span><span class="pun">;</span><span class="pln"> 
</span><span class="kwd">int</span><span class="pln"> melody</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> D</span><span class="pun">,</span><span class="pln"> D</span><span class="pun">,</span><span class="pln"> A</span><span class="pun">,</span><span class="pln"> F</span><span class="pun">,</span><span class="pln"> G</span><span class="pun">,</span><span class="pln"> A</span><span class="pun">,</span><span class="pln"> G</span><span class="pun">,</span><span class="pln"> F</span><span class="pun">,</span><span class="pln"> E</span><span class="pun">,</span><span class="pln"> D</span><span class="pun">};</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> duration</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">(</span><span class="pln">quarter</span><span class="pun">+</span><span class="pln">eighth</span><span class="pun">),</span><span class="pln"> eighth</span><span class="pun">,</span><span class="pln"> eighth</span><span class="pun">,</span><span class="pln"> eighth</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">quarter</span><span class="pun">*</span><span class="lit">4</span><span class="pun">),</span><span class="pln"> 
                   sixteenth</span><span class="pun">,</span><span class="pln"> sixteenth</span><span class="pun">,</span><span class="pln"> eighth</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">quarter</span><span class="pun">*</span><span class="lit">4</span><span class="pun">),</span><span class="pln"> </span><span class="pun">(</span><span class="pln">quarter</span><span class="pun">*</span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">};</span><span class="pln">

</span><span class="com">// declare variables used throughout loop</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> playedSong </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> ledState </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 1 - on | 0 - off</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> lightLevel</span><span class="pun">;</span><span class="pln"> </span><span class="com">//photoresistor</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> distance</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
  
  pinMode</span><span class="pun">(</span><span class="pln">LED_PIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">PHOTO_RESISTOR</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln"> </span><span class="com">// eliminates need for pullup/pulldown resistor</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">SOUND_PIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">

  flagMotor</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">SERVO_PIN</span><span class="pun">);</span><span class="pln">
  flagMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="lit">90</span><span class="pun">);</span><span class="pln">

  digitalWrite</span><span class="pun">(</span><span class="pln">LED_PIN</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="pln">SOUND_PIN</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  lightLevel </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">PHOTO_RESISTOR</span><span class="pun">);</span><span class="pln">
  distance </span><span class="pun">=</span><span class="pln"> sonar</span><span class="pun">.</span><span class="pln">ping_cm</span><span class="pun">();</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">distance</span><span class="pun">);</span><span class="pln">

  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">lightLevel </span><span class="pun">></span><span class="pln"> </span><span class="lit">200</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// scale reversed since using input pullup: low -> high light level</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">LED_PIN</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
    ledState </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// throw flag up</span><span class="pln">
    flagMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="lit">170</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="com">// case over sonar detection of flag</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ledState </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> distance </span><span class="pun">></span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> playedSong </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// flag goes up and trigger sound</span><span class="pln">
    </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"play sound"</span><span class="pun">);</span><span class="pln">
    playedSong </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> thisNote </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> thisNote </span><span class="pun"><</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> thisNote</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// Loop through the notes in the array.</span><span class="pln">
      </span><span class="typ">TimerFreeTone</span><span class="pun">(</span><span class="pln">SOUND_PIN</span><span class="pun">,</span><span class="pln"> melody</span><span class="pun">[</span><span class="pln">thisNote</span><span class="pun">],</span><span class="pln"> duration</span><span class="pun">[</span><span class="pln">thisNote</span><span class="pun">]);</span><span class="pln">
      </span><span class="com">// Play thisNote for its coresponding duration.</span><span class="pln">
      delay</span><span class="pun">(</span><span class="lit">50</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Short delay between notes.</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span>

Discussion

The base idea for this project was formed within seconds of us starting to brainstorm. Although we continued to consider other designs for double transducers, we eventually settled on our initial idea. Our extra thinking paid off, as some of the components we decided to use were different than originally planned. This saved us some time in deciding which parts were extraneous, and it helped choose more efficient components which saved us some hassle when it came to making the project function as a whole.

While constructing the project, we found it relatively straightforward to create the circuit and write the code so that each action occurred in sequence. However, I spent some more time constructing the box in Solidworks, laser cutting it, and gluing it together. Additionally, we put effort into making the setup functional and easy to use; for example, making sure the coin always fell between the LED and photoresistor.

We also learned some interesting things about the components we were using and how they worked internally. We found that we could not use the ultrasonic rangers and a speaker together due to timing issues within the libraries they both relied on. We had to find an alternate tone library for the speaker, which was called TimerFreeTone. It was similar, but it was necessary to enter both the frequencies and beat lengths in two separate, corresponding matrices. To make the song, I looked up 12-tet note frequencies, saved them as note-named variables, and recreated the tune by looking at the note progressions online.