Overview – A music player that detects heart rate when user is ready to sleep and turns the volume of the music down when they fall asleep.

Music player in its natural habitat

A tiny speaker on each side of the product

hand-hold size, easy for user to place their thumb on

anatomy of the music player

 

 

 

 

 

 

 

Sleep Music Player from Meijie Hu on Vimeo.

Process

the first major turning point was how to accurately get the pulse. Since the pulse sensor does not always give out accurate output unless user place their finger in a very specific way, I chose to address the problem by designing a divit that guides people to press their thumb onto the pulse sensor in specific place and direction, which led to the result of the pulse sensor more accurate than before (still pretty terrible but much better). And through code I tried to eliminate all the abnormal values.

the second turning point was that as I tried to connect all the functional pieces together the data of pulse sensor got weird. After consulting with Zach we figured out that sharing the same power source between pulse sensor and the DFPlayer might lead to music player interferes the signals the pulse sensor tries to detect. Therefore, we solved the problem by using two seperate battery packs.

ideation sketch

writing pulse sensor code

testing ergonomic placement of the sensor

using a second battery pack for the speaker

making the form

test out speaker

 

Response

“Interesting project, i would suggest maybe making something more huggable. Maybe making it out of fur or something. I like the intention of the project.”

This would be an interesting next step. I guess the project would be even more interesting if it is a pillow. Free your hand and more intimate.

The location of the sensor could be moved, or it is a another separate system (wireless if possible) that could help detect even if the user is not cuddling it. “

This is definitely something that I have been struggling with since you cannot ask users to keep their hand on the speaker forever. Increase the surface area of detection (maybe turning it into a finger cap or something) might help.

 

Self-critique

I really hope the project worked during presentation:( I think it has a lot of potential, given that I got every part to function and spent so much effort on the form, the final result could definitely be better. I definitely under-estimate the delicacy of pulse sensor and wires, which gave me a lot of troubles in the final assembly since I need to stuck everything inside of the tiny tube. Another hard hard lesson to learn in this project is the importance of documentation. During the process I missed out some documentation of some critical steps, which gave me not enough materials to prove my thing is working when it malfunctioned during class.

 

What I learnt

I really enjoy brainstorming the form and the process of making it, and the coding part is also relatively simple. The hardest part was assembling and handling the wiring. The process of optimizing the wiring of the machine really drove me crazy because one misplacement of the wiring can make the whole thing stop working and I had to spend hours to spot the wrong wiring out.

 

Next Step

Like what I mentioned above, turning it into a pillow would be fun, and probably less pain in fixing the wiring since there would be more room. Upgrade the speaker and maybe giving some visual feedbacks such as dimming the light might add more fun to the product.

Schematics

 

Code

  1. <span class="com">/*TITILE:
  2. * Sleeping Music Player
  3. *
  4. * meijieh
  5. *
  6. * DESCRIPTION:
  7. * The code first check whether the current time reaches the alarm time, and
  8. * play songs when it is alarm time. It also calculates the BPM using the data
  9. * sent from the pulse sensor,and as BPM value drops when user falls asleep.
  10. *
  11. * PIN MAPPING
  12. *
  13. * A0 pulse sensor
  14. * 11 RX for DFplayer
  15. * 10 TX for DFplayer mini
  16. * SCL I2C LCD screen+ Real-time clock
  17. * SDA I2C LCD screen+ Real-time clock
  18. *
  19. * CREDIT:
  20. *
  21. * DFplayer mini - https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299
  22. * RTC - RTClib library
  23. * BPM - https://www.xtronical.com/basics/heart-beat-sensor-ecg-display/
  24. */</span><span class="pln">
  25. </span><span class="com">#define</span><span class="pln"> </span><span class="typ">UpperThreshold</span><span class="pln"> </span><span class="lit">800</span><span class="pln">
  26. </span><span class="com">#define</span><span class="pln"> </span><span class="typ">LowerThreshold</span><span class="pln"> </span><span class="lit">600</span><span class="pln">
  27. </span><span class="com">#include</span><span class="pln"> </span><span class="str">"Arduino.h"</span><span class="pln">
  28. </span><span class="com">#include</span><span class="pln"> </span><span class="str">"SoftwareSerial.h"</span><span class="pln">
  29. </span><span class="com">#include</span><span class="pln"> </span><span class="str">"DFRobotDFPlayerMini.h"</span><span class="pln">
  30. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Wire.h></span><span class="pln">
  31. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><RTClib.h></span><span class="pln">
  32. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><LiquidCrystal_I2C.h></span><span class="pln">
  33. </span><span class="com">//LCD screen</span><span class="pln">
  34. </span><span class="typ">LiquidCrystal_I2C</span><span class="pln"> screen</span><span class="pun">(</span><span class="lit">0x27</span><span class="pun">,</span><span class="pln"> </span><span class="lit">16</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
  35. </span><span class="com">//DFplayer</span><span class="pln">
  36. </span><span class="typ">SoftwareSerial</span><span class="pln"> mySoftwareSerial</span><span class="pun">(</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">11</span><span class="pun">);</span><span class="pln"> </span><span class="com">// RX, TX</span><span class="pln">
  37. </span><span class="typ">DFRobotDFPlayerMini</span><span class="pln"> myDFPlayer</span><span class="pun">;</span><span class="pln">
  38. </span><span class="kwd">void</span><span class="pln"> printDetail</span><span class="pun">(</span><span class="typ">uint8_t</span><span class="pln"> type</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="kwd">value</span><span class="pun">);</span><span class="pln">
  39. </span><span class="kwd">bool</span><span class="pln"> isPlaying </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  40. </span><span class="kwd">int</span><span class="pln"> volume </span><span class="pun">=</span><span class="pln"> </span><span class="lit">30</span><span class="pun">;</span><span class="pln">
  41. </span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> taskTimer </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  42. </span><span class="kwd">int</span><span class="pln"> interval </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">;</span><span class="pln">
  43. </span><span class="com">//detect pulse</span><span class="pln">
  44. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PULSEPIN </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</span><span class="pln">
  45. </span><span class="kwd">bool</span><span class="pln"> </span><span class="typ">BPMTiming</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  46. </span><span class="kwd">bool</span><span class="pln"> </span><span class="typ">BeatComplete</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  47. </span><span class="kwd">long</span><span class="pln"> </span><span class="typ">LastTime</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  48. </span><span class="kwd">int</span><span class="pln"> BPM </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  49. </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">BPMs</span><span class="pun">[</span><span class="lit">10</span><span class="pun">];</span><span class="pln">
  50. </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">BPMIndex</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  51. </span><span class="com">//running average</span><span class="pln">
  52. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> numReadings </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// the index of the current reading</span><span class="pln">
  53. </span><span class="kwd">int</span><span class="pln"> readings</span><span class="pun">[</span><span class="pln">numReadings</span><span class="pun">];</span><span class="pln"> </span><span class="com">// the readings from the analog input</span><span class="pln">
  54. </span><span class="kwd">int</span><span class="pln"> readIndex </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  55. </span><span class="kwd">int</span><span class="pln"> dif </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  56. </span><span class="com">//alarm</span><span class="pln">
  57. RTC_DS3231 rtc</span><span class="pun">;</span><span class="pln">
  58. </span><span class="kwd">char</span><span class="pln"> t</span><span class="pun">[</span><span class="lit">32</span><span class="pun">];</span><span class="pln">
  59. </span><span class="kwd">char</span><span class="pln"> alarmT</span><span class="pun">[</span><span class="lit">32</span><span class="pun">];</span><span class="pln">
  60. </span><span class="kwd">int</span><span class="pln"> alarmH </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="kwd">int</span><span class="pln"> alarmM </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  62. </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">
  63. mySoftwareSerial</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">
  64. </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">
  65. </span><span class="typ">Wire</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">
  66. </span><span class="com">//set time</span><span class="pln">
  67. rtc</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">
  68. </span><span class="com">//rtc.adjust(DateTime(2020,3,3,3,27,0));</span><span class="pln">
  69. pinMode</span><span class="pun">(</span><span class="pln">BUT1PIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  70. pinMode</span><span class="pun">(</span><span class="pln">BUT2PIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  71. pinMode</span><span class="pun">(</span><span class="pln">PULSEPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  72. </span><span class="com">//LCD screen</span><span class="pln">
  73. screen</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  74. screen</span><span class="pun">.</span><span class="pln">backlight</span><span class="pun">();</span><span class="pln">
  75. delay</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
  76. screen</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  77. screen</span><span class="pun">.</span><span class="pln">home</span><span class="pun">();</span><span class="pln">
  78. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  79. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"ALARM:"</span><span class="pun">);</span><span class="pln">
  80. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  81. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"BPM:"</span><span class="pun">);</span><span class="pln">
  82. </span><span class="com">//DFPlayer</span><span class="pln">
  83. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">();</span><span class="pln">
  84. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"DFRobot DFPlayer Mini Demo"</span><span class="pun">));</span><span class="pln">
  85. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Initializing DFPlayer ... (May take 3~5 seconds)"</span><span class="pun">));</span><span class="pln">
  86. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">myDFPlayer</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="pln">mySoftwareSerial</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">//Use softwareSerial to communicate with mp3.</span><span class="pln">
  87. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Unable to begin:"</span><span class="pun">));</span><span class="pln">
  88. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"1.Please recheck the connection!"</span><span class="pun">));</span><span class="pln">
  89. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"2.Please insert the SD card!"</span><span class="pun">));</span><span class="pln">
  90. </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
  91. </span><span class="pun">}</span><span class="pln">
  92. </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
  93. </span><span class="pun">{</span><span class="pln">
  94. </span><span class="typ">BPMs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> random</span><span class="pun">(</span><span class="lit">40</span><span class="pun">,</span><span class="pln"> </span><span class="lit">90</span><span class="pun">);</span><span class="pln">
  95. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="typ">BPMs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln">
  96. </span><span class="pun">}</span><span class="pln">
  97. </span><span class="pun">}</span><span class="pln">
  98. </span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln">
  99. </span><span class="pun">{</span><span class="pln">
  100. </span><span class="com">//read time</span><span class="pln">
  101. </span><span class="typ">DateTime</span><span class="pln"> now </span><span class="pun">=</span><span class="pln"> rtc</span><span class="pun">.</span><span class="pln">now</span><span class="pun">();</span><span class="pln">
  102. sprintf</span><span class="pun">(</span><span class="pln">t</span><span class="pun">,</span><span class="pln"> </span><span class="str">"%02d:%02d"</span><span class="pun">,</span><span class="pln"> now</span><span class="pun">.</span><span class="pln">hour</span><span class="pun">(),</span><span class="pln"> now</span><span class="pun">.</span><span class="pln">minute</span><span class="pun">());</span><span class="pln">
  103. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  104. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">t</span><span class="pun">);</span><span class="pln">
  105. </span><span class="com">//set alarm</span><span class="pln">
  106. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  107. alarmH </span><span class="pun">=</span><span class="pln"> </span><span class="lit">17</span><span class="pun">;</span><span class="pln">
  108. alarmM </span><span class="pun">=</span><span class="pln"> </span><span class="lit">36</span><span class="pun">;</span><span class="pln">
  109. sprintf</span><span class="pun">(</span><span class="pln">alarmT</span><span class="pun">,</span><span class="pln"> </span><span class="str">"%02d:%02d"</span><span class="pun">,</span><span class="pln"> alarmH</span><span class="pun">,</span><span class="pln"> alarmM</span><span class="pun">);</span><span class="pln">
  110. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">alarmT</span><span class="pun">);</span><span class="pln">
  111. </span><span class="com">//play music</span><span class="pln">
  112. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">rtc</span><span class="pun">.</span><span class="pln">now</span><span class="pun">().</span><span class="pln">hour</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> alarmH </span><span class="pun">&&</span><span class="pln"> rtc</span><span class="pun">.</span><span class="pln">now</span><span class="pun">().</span><span class="pln">minute</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> alarmM </span><span class="pun">&&</span><span class="pln"> </span><span class="pun">!</span><span class="pln">isPlaying</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  113. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"DFPlayer Mini online."</span><span class="pun">));</span><span class="pln">
  114. myDFPlayer</span><span class="pun">.</span><span class="pln">volume</span><span class="pun">(</span><span class="pln">volume</span><span class="pun">);</span><span class="pln"> </span><span class="com">//Set volume value. From 0 to 30</span><span class="pln">
  115. myDFPlayer</span><span class="pun">.</span><span class="pln">play</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">//Play the first mp3</span><span class="pln">
  116. isPlaying </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  117. </span><span class="pun">}</span><span class="pln">
  118. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">myDFPlayer</span><span class="pun">.</span><span class="pln">available</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  119. printDetail</span><span class="pun">(</span><span class="pln">myDFPlayer</span><span class="pun">.</span><span class="pln">readType</span><span class="pun">(),</span><span class="pln"> myDFPlayer</span><span class="pun">.</span><span class="pln">read</span><span class="pun">());</span><span class="pln"> </span><span class="com">//Print the detail message from DFPlayer to handle different errors and states.</span><span class="pln">
  120. </span><span class="pun">}</span><span class="pln">
  121. </span><span class="com">// calc bpm</span><span class="pln">
  122. </span><span class="kwd">long</span><span class="pln"> </span><span class="kwd">value</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">A0</span><span class="pun">);</span><span class="pln">
  123. </span><span class="com">//Serial.println(value);</span><span class="pln">
  124. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">value</span><span class="pln"> </span><span class="pun">></span><span class="pln"> </span><span class="typ">UpperThreshold</span><span class="pun">)</span><span class="pln">
  125. </span><span class="pun">{</span><span class="pln">
  126. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">BeatComplete</span><span class="pun">)</span><span class="pln">
  127. </span><span class="pun">{</span><span class="pln">
  128. BPM </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="typ">LastTime</span><span class="pun">;</span><span class="pln">
  129. BPM </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">(</span><span class="lit">60</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">float</span><span class="pun">(</span><span class="pln">BPM</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">));</span><span class="pln">
  130. </span><span class="typ">BPMTiming</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  131. </span><span class="typ">BeatComplete</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  132. </span><span class="pun">}</span><span class="pln">
  133. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">BPMTiming</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
  134. </span><span class="pun">{</span><span class="pln">
  135. </span><span class="typ">LastTime</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">();</span><span class="pln">
  136. </span><span class="typ">BPMTiming</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  137. </span><span class="pun">}</span><span class="pln">
  138. </span><span class="pun">}</span><span class="pln">
  139. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="kwd">value</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="typ">LowerThreshold</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&</span><span class="pln"> </span><span class="pun">(</span><span class="typ">BPMTiming</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  140. </span><span class="typ">BeatComplete</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  141. </span><span class="pun">}</span><span class="pln">
  142. </span><span class="com">//show time</span><span class="pln">
  143. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">millis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> taskTimer </span><span class="pun">>=</span><span class="pln"> interval</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  144. taskTimer </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">();</span><span class="pln">
  145. </span><span class="com">// get running average of BPM</span><span class="pln">
  146. readings</span><span class="pun">[</span><span class="pln">readIndex</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> BPM</span><span class="pun">;</span><span class="pln">
  147. readIndex </span><span class="pun">=</span><span class="pln"> readIndex </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  148. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">readIndex </span><span class="pun">>=</span><span class="pln"> numReadings</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  149. readIndex </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  150. </span><span class="pun">}</span><span class="pln">
  151. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">BPM </span><span class="pun">></span><span class="pln"> </span><span class="lit">100</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> BPM </span><span class="pun"><</span><span class="pln"> </span><span class="lit">40</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  152. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">BPM</span><span class="pun">);</span><span class="pln">
  153. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"invalid data1"</span><span class="pun">);</span><span class="pln">
  154. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">14</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  155. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="typ">BPMs</span><span class="pun">[</span><span class="pln">random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">10</span><span class="pun">)]);</span><span class="pln">
  156. </span><span class="pun">}</span><span class="pln">
  157. </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  158. </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> numReadings </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  159. dif </span><span class="pun">=</span><span class="pln"> readings</span><span class="pun">[</span><span class="pln">i </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> readings</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln">
  160. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">dif </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"> dif </span><span class="pun">></span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  161. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="pln"> dif </span><span class="pun">+</span><span class="pln"> </span><span class="str">"invalid data2"</span><span class="pun">);</span><span class="pln">
  162. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">14</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  163. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="typ">BPMs</span><span class="pun">[</span><span class="pln">random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">10</span><span class="pun">)]);</span><span class="pln">
  164. </span><span class="pun">}</span><span class="pln">
  165. </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  166. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">BPM</span><span class="pun">);</span><span class="pln">
  167. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">14</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  168. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">BPM</span><span class="pun">);</span><span class="pln">
  169. </span><span class="typ">BPMs</span><span class="pun">[</span><span class="typ">BPMIndex</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> BPM</span><span class="pun">;</span><span class="pln">
  170. </span><span class="typ">BPMIndex</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BPMIndex</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  171. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">BPMIndex</span><span class="pln"> </span><span class="pun">>=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  172. readIndex </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  173. </span><span class="pun">}</span><span class="pln">
  174. </span><span class="pun">}</span><span class="pln">
  175. </span><span class="pun">}</span><span class="pln">
  176. volume </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">BPM</span><span class="pun">,</span><span class="pln"> </span><span class="lit">50</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">30</span><span class="pun">);</span><span class="pln">
  177. myDFPlayer</span><span class="pun">.</span><span class="pln">volume</span><span class="pun">(</span><span class="pln">volume</span><span class="pun">);</span><span class="pln">
  178. </span><span class="pun">}</span><span class="pln">
  179. </span><span class="pun">}</span><span class="pln">
  180. </span><span class="pun">}</span><span class="pln">
  181. </span><span class="kwd">void</span><span class="pln"> printDetail</span><span class="pun">(</span><span class="typ">uint8_t</span><span class="pln"> type</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="kwd">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  182. </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">type</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  183. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">TimeOut</span><span class="pun">:</span><span class="pln">
  184. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Time Out!"</span><span class="pun">));</span><span class="pln">
  185. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  186. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">WrongStack</span><span class="pun">:</span><span class="pln">
  187. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Stack Wrong!"</span><span class="pun">));</span><span class="pln">
  188. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  189. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">DFPlayerCardInserted</span><span class="pun">:</span><span class="pln">
  190. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Card Inserted!"</span><span class="pun">));</span><span class="pln">
  191. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  192. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">DFPlayerCardRemoved</span><span class="pun">:</span><span class="pln">
  193. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Card Removed!"</span><span class="pun">));</span><span class="pln">
  194. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  195. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">DFPlayerCardOnline</span><span class="pun">:</span><span class="pln">
  196. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Card Online!"</span><span class="pun">));</span><span class="pln">
  197. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  198. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">DFPlayerPlayFinished</span><span class="pun">:</span><span class="pln">
  199. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Number:"</span><span class="pun">));</span><span class="pln">
  200. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="kwd">value</span><span class="pun">);</span><span class="pln">
  201. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">" Play Finished!"</span><span class="pun">));</span><span class="pln">
  202. isPlaying </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  203. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  204. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">DFPlayerError</span><span class="pun">:</span><span class="pln">
  205. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"DFPlayerError:"</span><span class="pun">));</span><span class="pln">
  206. </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  207. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">Busy</span><span class="pun">:</span><span class="pln">
  208. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Card not found"</span><span class="pun">));</span><span class="pln">
  209. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  210. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">Sleeping</span><span class="pun">:</span><span class="pln">
  211. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Sleeping"</span><span class="pun">));</span><span class="pln">
  212. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  213. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">SerialWrongStack</span><span class="pun">:</span><span class="pln">
  214. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Get Wrong Stack"</span><span class="pun">));</span><span class="pln">
  215. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  216. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">CheckSumNotMatch</span><span class="pun">:</span><span class="pln">
  217. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Check Sum Not Match"</span><span class="pun">));</span><span class="pln">
  218. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  219. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">FileIndexOut</span><span class="pun">:</span><span class="pln">
  220. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"File Index Out of Bound"</span><span class="pun">));</span><span class="pln">
  221. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  222. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">FileMismatch</span><span class="pun">:</span><span class="pln">
  223. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Cannot Find File"</span><span class="pun">));</span><span class="pln">
  224. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  225. </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">Advertise</span><span class="pun">:</span><span class="pln">
  226. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"In Advertise"</span><span class="pun">));</span><span class="pln">
  227. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  228. </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
  229. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  230. </span><span class="pun">}</span><span class="pln">
  231. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  232. </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
  233. </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  234. </span><span class="pun">}</span><span class="pln">
  235. </span><span class="pun">}</span>
<span class="com">/*TITILE: 
 * Sleeping Music Player
 * 
 * meijieh
 * 
 * DESCRIPTION:
 * The code first check whether the current time reaches the alarm time, and
 * play songs when it is alarm time. It also calculates the BPM using the data 
 * sent from the pulse sensor,and as BPM value drops when user falls asleep.
 * 
 * PIN MAPPING
 * 
 * A0       pulse sensor
 * 11       RX for DFplayer
 * 10       TX for DFplayer mini
 * SCL      I2C LCD screen+ Real-time clock
 * SDA      I2C LCD screen+ Real-time clock
 * 
 * CREDIT:
 * 
 * DFplayer mini - https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299
 * RTC - RTClib library 
 * BPM - https://www.xtronical.com/basics/heart-beat-sensor-ecg-display/
 */</span><span class="pln">



</span><span class="com">#define</span><span class="pln"> </span><span class="typ">UpperThreshold</span><span class="pln"> </span><span class="lit">800</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> </span><span class="typ">LowerThreshold</span><span class="pln"> </span><span class="lit">600</span><span class="pln">

</span><span class="com">#include</span><span class="pln"> </span><span class="str">"Arduino.h"</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">"SoftwareSerial.h"</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">"DFRobotDFPlayerMini.h"</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><Wire.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><RTClib.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><LiquidCrystal_I2C.h></span><span class="pln">

</span><span class="com">//LCD screen</span><span class="pln">
</span><span class="typ">LiquidCrystal_I2C</span><span class="pln"> screen</span><span class="pun">(</span><span class="lit">0x27</span><span class="pun">,</span><span class="pln"> </span><span class="lit">16</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">

</span><span class="com">//DFplayer</span><span class="pln">
</span><span class="typ">SoftwareSerial</span><span class="pln"> mySoftwareSerial</span><span class="pun">(</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">11</span><span class="pun">);</span><span class="pln"> </span><span class="com">// RX, TX</span><span class="pln">
</span><span class="typ">DFRobotDFPlayerMini</span><span class="pln"> myDFPlayer</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">void</span><span class="pln"> printDetail</span><span class="pun">(</span><span class="typ">uint8_t</span><span class="pln"> type</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="kwd">value</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">bool</span><span class="pln"> isPlaying </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> volume </span><span class="pun">=</span><span class="pln"> </span><span class="lit">30</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> taskTimer </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"> interval </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">;</span><span class="pln">

</span><span class="com">//detect pulse</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PULSEPIN </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">bool</span><span class="pln"> </span><span class="typ">BPMTiming</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">bool</span><span class="pln"> </span><span class="typ">BeatComplete</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">long</span><span class="pln"> </span><span class="typ">LastTime</span><span class="pln"> </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"> BPM </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"> </span><span class="typ">BPMs</span><span class="pun">[</span><span class="lit">10</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> </span><span class="typ">BPMIndex</span><span class="pln"> </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">//running average</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> numReadings </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">      </span><span class="com">// the index of the current reading</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> readings</span><span class="pun">[</span><span class="pln">numReadings</span><span class="pun">];</span><span class="pln">      </span><span class="com">// the readings from the analog input</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> readIndex </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"> dif </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">//alarm</span><span class="pln">
RTC_DS3231 rtc</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">char</span><span class="pln"> t</span><span class="pun">[</span><span class="lit">32</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">char</span><span class="pln"> alarmT</span><span class="pun">[</span><span class="lit">32</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> alarmH </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"> alarmM </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">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  mySoftwareSerial</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">
  </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">
  </span><span class="typ">Wire</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">
  </span><span class="com">//set time</span><span class="pln">
  rtc</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">

  </span><span class="com">//rtc.adjust(DateTime(2020,3,3,3,27,0));</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">BUT1PIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">BUT2PIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">PULSEPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//LCD screen</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">backlight</span><span class="pun">();</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">home</span><span class="pun">();</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"ALARM:"</span><span class="pun">);</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"BPM:"</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//DFPlayer</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">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"DFRobot DFPlayer Mini Demo"</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">F</span><span class="pun">(</span><span class="str">"Initializing DFPlayer ... (May take 3~5 seconds)"</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">myDFPlayer</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="pln">mySoftwareSerial</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">  </span><span class="com">//Use softwareSerial to communicate with mp3.</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">F</span><span class="pun">(</span><span class="str">"Unable to begin:"</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">F</span><span class="pun">(</span><span class="str">"1.Please recheck the connection!"</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">F</span><span class="pun">(</span><span class="str">"2.Please insert the SD card!"</span><span class="pun">));</span><span class="pln">
    </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
  </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"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">BPMs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> random</span><span class="pun">(</span><span class="lit">40</span><span class="pun">,</span><span class="pln"> </span><span class="lit">90</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="typ">BPMs</span><span class="pun">[</span><span class="pln">i</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="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="com">//read time</span><span class="pln">
  </span><span class="typ">DateTime</span><span class="pln"> now </span><span class="pun">=</span><span class="pln"> rtc</span><span class="pun">.</span><span class="pln">now</span><span class="pun">();</span><span class="pln">
  sprintf</span><span class="pun">(</span><span class="pln">t</span><span class="pun">,</span><span class="pln"> </span><span class="str">"%02d:%02d"</span><span class="pun">,</span><span class="pln"> now</span><span class="pun">.</span><span class="pln">hour</span><span class="pun">(),</span><span class="pln"> now</span><span class="pun">.</span><span class="pln">minute</span><span class="pun">());</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">t</span><span class="pun">);</span><span class="pln">
  
  </span><span class="com">//set alarm</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  alarmH </span><span class="pun">=</span><span class="pln"> </span><span class="lit">17</span><span class="pun">;</span><span class="pln">
  alarmM </span><span class="pun">=</span><span class="pln"> </span><span class="lit">36</span><span class="pun">;</span><span class="pln">
  sprintf</span><span class="pun">(</span><span class="pln">alarmT</span><span class="pun">,</span><span class="pln"> </span><span class="str">"%02d:%02d"</span><span class="pun">,</span><span class="pln"> alarmH</span><span class="pun">,</span><span class="pln"> alarmM</span><span class="pun">);</span><span class="pln">
  screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">alarmT</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//play music</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">rtc</span><span class="pun">.</span><span class="pln">now</span><span class="pun">().</span><span class="pln">hour</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> alarmH </span><span class="pun">&&</span><span class="pln"> rtc</span><span class="pun">.</span><span class="pln">now</span><span class="pun">().</span><span class="pln">minute</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> alarmM </span><span class="pun">&&</span><span class="pln"> </span><span class="pun">!</span><span class="pln">isPlaying</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="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"DFPlayer Mini online."</span><span class="pun">));</span><span class="pln">
    myDFPlayer</span><span class="pun">.</span><span class="pln">volume</span><span class="pun">(</span><span class="pln">volume</span><span class="pun">);</span><span class="pln">  </span><span class="com">//Set volume value. From 0 to 30</span><span class="pln">
    myDFPlayer</span><span class="pun">.</span><span class="pln">play</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">  </span><span class="com">//Play the first mp3</span><span class="pln">
    isPlaying </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  </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">myDFPlayer</span><span class="pun">.</span><span class="pln">available</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    printDetail</span><span class="pun">(</span><span class="pln">myDFPlayer</span><span class="pun">.</span><span class="pln">readType</span><span class="pun">(),</span><span class="pln"> myDFPlayer</span><span class="pun">.</span><span class="pln">read</span><span class="pun">());</span><span class="pln"> </span><span class="com">//Print the detail message from DFPlayer to handle different errors and states.</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="com">// calc bpm</span><span class="pln">
  </span><span class="kwd">long</span><span class="pln"> </span><span class="kwd">value</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">A0</span><span class="pun">);</span><span class="pln">
  </span><span class="com">//Serial.println(value);</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">value</span><span class="pln"> </span><span class="pun">></span><span class="pln"> </span><span class="typ">UpperThreshold</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">BeatComplete</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
      BPM </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="typ">LastTime</span><span class="pun">;</span><span class="pln">
      BPM </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">(</span><span class="lit">60</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">float</span><span class="pun">(</span><span class="pln">BPM</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">));</span><span class="pln">
      </span><span class="typ">BPMTiming</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">BeatComplete</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">BPMTiming</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
      </span><span class="typ">LastTime</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">();</span><span class="pln">
      </span><span class="typ">BPMTiming</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</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="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="kwd">value</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="typ">LowerThreshold</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&</span><span class="pln"> </span><span class="pun">(</span><span class="typ">BPMTiming</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">BeatComplete</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="com">//show time</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">millis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> taskTimer </span><span class="pun">>=</span><span class="pln"> interval</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    taskTimer </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">();</span><span class="pln">

    </span><span class="com">// get running average of BPM</span><span class="pln">
    readings</span><span class="pun">[</span><span class="pln">readIndex</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> BPM</span><span class="pun">;</span><span class="pln">
    readIndex </span><span class="pun">=</span><span class="pln"> readIndex </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">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">readIndex </span><span class="pun">>=</span><span class="pln"> numReadings</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      readIndex </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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">BPM </span><span class="pun">></span><span class="pln"> </span><span class="lit">100</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> BPM </span><span class="pun"><</span><span class="pln"> </span><span class="lit">40</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">print</span><span class="pun">(</span><span class="pln">BPM</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="str">"invalid data1"</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">14</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="typ">BPMs</span><span class="pun">[</span><span class="pln">random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">10</span><span class="pun">)]);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln"> </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"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> numReadings </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        dif </span><span class="pun">=</span><span class="pln"> readings</span><span class="pun">[</span><span class="pln">i </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> readings</span><span class="pun">[</span><span class="pln">i</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">dif </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"> dif </span><span class="pun">></span><span class="pln"> </span><span class="lit">10</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="pln">println</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="pln"> dif </span><span class="pun">+</span><span class="pln"> </span><span class="str">"invalid data2"</span><span class="pun">);</span><span class="pln">
          screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">14</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
          screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="typ">BPMs</span><span class="pun">[</span><span class="pln">random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">10</span><span class="pun">)]);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">else</span><span class="pln"> </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">BPM</span><span class="pun">);</span><span class="pln">
          screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">14</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
          screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">BPM</span><span class="pun">);</span><span class="pln">
          </span><span class="typ">BPMs</span><span class="pun">[</span><span class="typ">BPMIndex</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> BPM</span><span class="pun">;</span><span class="pln">
          </span><span class="typ">BPMIndex</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BPMIndex</span><span class="pln"> </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">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">BPMIndex</span><span class="pln"> </span><span class="pun">>=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            readIndex </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="pun">}</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
      volume </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">BPM</span><span class="pun">,</span><span class="pln"> </span><span class="lit">50</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">30</span><span class="pun">);</span><span class="pln">
      myDFPlayer</span><span class="pun">.</span><span class="pln">volume</span><span class="pun">(</span><span class="pln">volume</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">




  </span><span class="kwd">void</span><span class="pln"> printDetail</span><span class="pun">(</span><span class="typ">uint8_t</span><span class="pln"> type</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="kwd">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">type</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">TimeOut</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">F</span><span class="pun">(</span><span class="str">"Time Out!"</span><span class="pun">));</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">WrongStack</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">F</span><span class="pun">(</span><span class="str">"Stack Wrong!"</span><span class="pun">));</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">DFPlayerCardInserted</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">F</span><span class="pun">(</span><span class="str">"Card Inserted!"</span><span class="pun">));</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">DFPlayerCardRemoved</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">F</span><span class="pun">(</span><span class="str">"Card Removed!"</span><span class="pun">));</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">DFPlayerCardOnline</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">F</span><span class="pun">(</span><span class="str">"Card Online!"</span><span class="pun">));</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">DFPlayerPlayFinished</span><span class="pun">:</span><span class="pln">
        </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Number:"</span><span class="pun">));</span><span class="pln">
        </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="kwd">value</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">F</span><span class="pun">(</span><span class="str">" Play Finished!"</span><span class="pun">));</span><span class="pln">
        isPlaying </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">DFPlayerError</span><span class="pun">:</span><span class="pln">
        </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"DFPlayerError:"</span><span class="pun">));</span><span class="pln">
        </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">Busy</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">F</span><span class="pun">(</span><span class="str">"Card not found"</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">Sleeping</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">F</span><span class="pun">(</span><span class="str">"Sleeping"</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">SerialWrongStack</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">F</span><span class="pun">(</span><span class="str">"Get Wrong Stack"</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">CheckSumNotMatch</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">F</span><span class="pun">(</span><span class="str">"Check Sum Not Match"</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">FileIndexOut</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">F</span><span class="pun">(</span><span class="str">"File Index Out of Bound"</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">FileMismatch</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">F</span><span class="pun">(</span><span class="str">"Cannot Find File"</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">Advertise</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">F</span><span class="pun">(</span><span class="str">"In Advertise"</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span>