Overview

Description

An interactive alarm clock that reminds you to go to sleep if you are still awake past a certain bedtime by detecting light levels in the room.

A photoresistor senses light levels in the room.

There is a menu system to view alarm settings.

You can edit the alarm as well as the time.

Labeled physical components of the alarm clock.

[Note: detailed photos of the device could not be provided]

Process Images and Review

Planning

I started with brainstorming ideas and sketching how I wanted the alarm clock to function and look like. I envisioned the device to resemble a regular alarm clock in form, but I also wanted to integrate the added functionality of light detection. It was definitely helpful to begin with a solid concept in mind for what I was building.

Initial concept sketches and notes.

Prototyping

The first two pieces I focused on were the LCD Display and the real time clock as these were the two fundamental components to a basic working clock. I was able to get the LCD to display the time data, although the time had to be hard coded in.

Building a basic functional clock.

Real time clock used to measure time data.

I started early on the menu system to eliminate the hard coding issue and to help make alarm/general software testing easier. For user input, I used a potentiometer for entering values along a range and a push button to select options. The code for the menu system ended being one of most complex aspects of this project due to all the different settings with various inputs and screen displays.

Speaker (left) and Potentiometer (right).

In place of the potentiometer and push button, I attempted to use a rotary encoder to make user input easier with continuous rotation and added button functionality. However, I spent way too much time trying to figure out the wiring and code to read inputs from the rotary encoder without much progress. I eventually switched back to my original choice of a separate potentiometer and push button since they were more familiar to me and already integrated into the menu code.

Rotary encoder component.

For the physical prototype, I just made a simple white box to hold the screen and drawn-on components.

Prototype built from cardboard and paper.

Final Development

I measured each of the components to ensure that they would fit appropriately. I sketched the location of each part and how large I wanted the physical box to be, keeping in mind that it had to hold both the Arduino and the breadboard.

Box sketches and measurements.

The clock was modeled in Fusion 360 before being laser cut. This step was also very time consuming especially since I had little experience working with Fusion. I wanted to add finger joints to each side to make the box more structurally sound, but the process of making rectangular cuts on each edge proved to be pretty tedious.

3D box model in Fusion 360

I decided to go with acrylic as my material of choice because I wanted the clock to have a clean, sleek appearance. I chose blue acrylic because since this was a sleep device, I felt that blue was a calming color and also associated with night time. Once the pieces were cut, I realized the box might actually be too small to fit everything inside. It turned out to be a tight fit, so I had to strategically position and cram together all the internal components. In then end, I was able to successfully fit everything inside.

Realizing this is a lot of stuff to fit inside a tiny box.

Tape helped hold together loose pieces, especially while waiting for glue to dry.

Fitting all the internal components inside.

Discussion

Overall, I am pretty happy with how my project turned out. It functions as intended, and the design is similar to how I envisioned, although there is definitely still room for improvement. Reflecting on the challenges I faced, I’m glad I pushed myself to work with new components and software. It was certainly frustrating at times, but these setbacks proved to be good learning opportunities.

While trying to figure out the rotary encoder, I kept getting stuck on the complicated technical aspects. It would have been difficult to integrate since the menu system code was already written in terms of the potentiometer and button inputs. I wish I could have realized sooner it would have been better to stick with my original components given the time constraints I had.

Moving forward, I know to more carefully consider which components I will need and to not make major changes prior to writing a lot of code. The menu code itself was more complicated than anticipated, and it would have been helpful to organize and plan out my code on a conceptual level before writing it out. I realized sometimes it’s okay to quit while you’re ahead. The menu system was already working, so I could have saved a lot of time had I just moved onto the next feature instead of focusing on perfecting this one small detail. For future projects, I’ll keep in mind the importance of prioritizing the big picture rather than getting stuck on one small aspect.

Working with Fusion 360 was another step which challenged me because I did not have much experience with using the software. I did not think I would be able to get the model to look the way I wanted it to, but it actually turned out okay. Making the finger joints was challenging, but it was worth the extra effort to learn how to use Fusion as it’s a useful skill for later projects as well.

In retrospect, I realized the importance of planning ahead, especially when it came to piecing together the final box. A lot of last minute problems arose which I definitely did not anticipate, for instance the internal pieces being too tightly fitted inside. If I had measured more thoughtfully ahead of time, I might have made the box bigger. In addition, the buttons at the top did not have ample support below. I applied some creative problem solving and taped wood pieces below them for base support. Next time, I know to work on my project earlier to give myself ample time to make these mistakes, or better yet, have time to plan ahead and anticipate these problems before they arise in the first place.

During the class crit, some of the feedback I received included:

Interesting idea, and I think it’s quite practical where it could force you to sleep. One thing you could consider is how could you make this more accessible for other people to use? How will people decipher what controls to use?

This is a good point because I left the buttons unlabeled, so it might be confusing for users what the buttons are supposed to do. To make the user interaction more clear, I would probably add labels/symbols or some clear indicator next to the buttons to convey their function.

A choice for sound could be helpful, as I know people who need white noise sensors or soothing sounds to go to sleep.

I agree that having a variety of alarm sounds would improve the clock’s customization. Given more time, I would add a selection of sounds for the user to choose. However for now, I chose a somewhat annoyingly high pitched tone alarm with the intention of both alerting and punishing the user for staying up past their set sleep time.

For future iterations, I would also try to add a distance sensor near the photoresistor to prevent cheating the system by draping something over the clock to make it dark. This added feature would ensure light levels are representative of the surrounding area. 

In the end, I think I did satisfy a lot of my own goals in terms of learning to work with Fusion 360 and getting to build a finished, working alarm clock. I’m pretty satisfied with the appearance, and while it was challenging to work with a smaller box to hold everything, it also allowed for a more compact and sleek outer appearance. I’m also glad I made detailed sketches for my vision of the design prior to building it because it helped to give me a strong visual design to work towards.

Technical Information

Schematic

Code SUbmission
  1. <span class="com">/*
  2. Project Title: Snooze Alarm
  3. Description: This code sets off a sound alarm to remind the user the
  4. user to go to sleep if they are awake past their set bed time.
  5. A photoresistor reads in brightness levels of the room to
  6. detect whether the user is asleep or not. A potentiometer and
  7. momentary push button provide input to change the time displayed
  8. and alarm settings on an LCD screen. If the user is still not not
  9. in bed within 5 minutes of the alarm, a second snooze alarm
  10. will be set off. The first alarm can be stopped by pressing
  11. a snooze button but not the second snooze alarm.
  12. Pin mapping:
  13. pin | mode | description
  14. ------|--------|------------
  15. A0 input potentiometer
  16. A3 input photocell
  17. 7 input momentary push button (settings)
  18. 5 input momentary push button (snooze)
  19. 9 output sound speaker (alarm)
  20. 12 output LED (alarm)
  21. */</span><span class="pln">
  22. </span><span class="com">// include necessary libraries</span><span class="pln">
  23. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><DS3231.h></span><span class="pln">
  24. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><LiquidCrystal_I2C.h></span><span class="pln">
  25. </span><span class="com">#include</span><span class="pln"> </span><span class="str">"Volume3.h"</span><span class="pln">
  26. </span><span class="typ">String</span><span class="pln"> state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"display time"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// clock menu state</span><span class="pln">
  27. </span><span class="kwd">int</span><span class="pln"> hours</span><span class="pun">;</span><span class="pln"> </span><span class="com">// hours set for display or alarm time</span><span class="pln">
  28. </span><span class="kwd">int</span><span class="pln"> minutes</span><span class="pun">;</span><span class="pln"> </span><span class="com">// minutes set for diplay or alarm time</span><span class="pln">
  29. </span><span class="kwd">int</span><span class="pln"> speakerVol</span><span class="pun">;</span><span class="pln"> </span><span class="com">// volume of alarm </span><span class="pln">
  30. </span><span class="kwd">int</span><span class="pln"> maxVol </span><span class="pun">=</span><span class="pln"> </span><span class="lit">800</span><span class="pun">;</span><span class="pln"> </span><span class="com">// speaker max volume</span><span class="pln">
  31. </span><span class="kwd">int</span><span class="pln"> threshold </span><span class="pun">=</span><span class="pln"> </span><span class="lit">930</span><span class="pun">;</span><span class="pln"> </span><span class="com">// brightness threshold</span><span class="pln">
  32. </span><span class="kwd">bool</span><span class="pln"> soundAlarm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="com">// play alarm sound</span><span class="pln">
  33. </span><span class="kwd">bool</span><span class="pln"> alarmOn </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  34. </span><span class="kwd">bool</span><span class="pln"> alarmTime </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="com">// indicate setting alarm or display time</span><span class="pln">
  35. </span><span class="kwd">int</span><span class="pln"> alarmHr</span><span class="pun">;</span><span class="pln">
  36. </span><span class="kwd">int</span><span class="pln"> alarmMin</span><span class="pun">;</span><span class="pln">
  37. </span><span class="kwd">bool</span><span class="pln"> snooze </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="com">// whether user has pressed snooze button</span><span class="pln">
  38. </span><span class="kwd">int</span><span class="pln"> snoozeHr</span><span class="pun">;</span><span class="pln">
  39. </span><span class="kwd">int</span><span class="pln"> snoozeMin</span><span class="pun">;</span><span class="pln">
  40. </span><span class="kwd">int</span><span class="pln"> snoozeDelay </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// how many minutes to snooze</span><span class="pln">
  41. </span><span class="kwd">bool</span><span class="pln"> snoozeAlarm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  42. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> POTPIN </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</span><span class="pln"> </span><span class="com">// potentiometer</span><span class="pln">
  43. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PHOTOPIN </span><span class="pun">=</span><span class="pln"> A3</span><span class="pun">;</span><span class="pln"> </span><span class="com">// photocell</span><span class="pln">
  44. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PUSHPIN </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">// momentary push button for settings</span><span class="pln">
  45. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PUSHPIN2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// momentary push button for snooze</span><span class="pln">
  46. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SPEAKERPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln"> </span><span class="com">// sound speaker</span><span class="pln">
  47. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> LEDPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12</span><span class="pun">;</span><span class="pln"> </span><span class="com">// LED</span><span class="pln">
  48. DS3231 rtc</span><span class="pun">(</span><span class="pln">SDA</span><span class="pun">,</span><span class="pln"> SCL</span><span class="pun">);</span><span class="pln"> </span><span class="com">// initialize real time clock</span><span class="pln">
  49. </span><span class="typ">LiquidCrystal_I2C</span><span class="pln"> lcd</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">// initialize LCD display</span><span class="pln">
  50. </span><span class="com">// control alarm sound and light behavior</span><span class="pln">
  51. </span><span class="kwd">void</span><span class="pln"> callAlarm</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> brightnessVal</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  52. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">brightnessVal </span><span class="pun"><</span><span class="pln"> threshold</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  53. speakerVol </span><span class="pun">=</span><span class="pln"> maxVol</span><span class="pun">;</span><span class="pln">
  54. digitalWrite</span><span class="pun">(</span><span class="pln">LEDPIN</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  55. </span><span class="pun">}</span><span class="pln">
  56. </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  57. speakerVol </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  58. digitalWrite</span><span class="pun">(</span><span class="pln">LEDPIN</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  59. </span><span class="pun">}</span><span class="pln">
  60. vol</span><span class="pun">.</span><span class="pln">tone</span><span class="pun">(</span><span class="pln">SPEAKERPIN</span><span class="pun">,</span><span class="pln"> </span><span class="lit">800</span><span class="pun">,</span><span class="pln"> speakerVol</span><span class="pun">);</span><span class="pln">
  61. </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. pinMode</span><span class="pun">(</span><span class="pln">POTPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// potentiometer</span><span class="pln">
  64. pinMode</span><span class="pun">(</span><span class="pln">PHOTOPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// photoresistor</span><span class="pln">
  65. pinMode</span><span class="pun">(</span><span class="pln">PUSHPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// momentary push button</span><span class="pln">
  66. pinMode</span><span class="pun">(</span><span class="pln">PUSHPIN2</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// snooze push button</span><span class="pln">
  67. pinMode</span><span class="pun">(</span><span class="pln">LEDPIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// LED</span><span class="pln">
  68. pinMode</span><span class="pun">(</span><span class="pln">SPEAKERPIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// sound speaker</span><span class="pln">
  69. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">115200</span><span class="pun">);</span><span class="pln">
  70. </span><span class="com">// set up LCD screen</span><span class="pln">
  71. lcd</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  72. lcd</span><span class="pun">.</span><span class="pln">backlight</span><span class="pun">();</span><span class="pln">
  73. lcd</span><span class="pun">.</span><span class="pln">home</span><span class="pun">();</span><span class="pln">
  74. </span><span class="com">// set up real time clock</span><span class="pln">
  75. rtc</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">
  76. rtc</span><span class="pun">.</span><span class="pln">setTime</span><span class="pun">(</span><span class="lit">12</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">0</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Set time to 12:00:00 (24hr format)</span><span class="pln">
  77. </span><span class="pun">}</span><span class="pln">
  78. </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">
  79. </span><span class="kwd">int</span><span class="pln"> potVal </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">POTPIN</span><span class="pun">);</span><span class="pln"> </span><span class="com">//(range 0-1023)</span><span class="pln">
  80. </span><span class="kwd">int</span><span class="pln"> brightnessVal </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">PHOTOPIN</span><span class="pun">);</span><span class="pln"> </span><span class="com">//(range 800-1022)</span><span class="pln">
  81. </span><span class="kwd">int</span><span class="pln"> pushVal </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">PUSHPIN</span><span class="pun">);</span><span class="pln"> </span><span class="com">// settings button</span><span class="pln">
  82. </span><span class="kwd">int</span><span class="pln"> pushVal2 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">PUSHPIN2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// snooze button</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">brightnessVal</span><span class="pun">);</span><span class="pln">
  84. </span><span class="com">// check whether alarm should be set off</span><span class="pln">
  85. </span><span class="typ">Time</span><span class="pln"> t </span><span class="pun">=</span><span class="pln"> rtc</span><span class="pun">.</span><span class="pln">getTime</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">snoozeHr </span><span class="pun">==</span><span class="pln"> t</span><span class="pun">.</span><span class="pln">hour </span><span class="kwd">and</span><span class="pln"> snoozeMin </span><span class="pun">==</span><span class="pln"> t</span><span class="pun">.</span><span class="pln">min</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  87. snoozeAlarm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  88. snooze </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  89. </span><span class="pun">}</span><span class="pln">
  90. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">not</span><span class="pln"> snooze </span><span class="kwd">and</span><span class="pln"> alarmOn </span><span class="kwd">and</span><span class="pln"> alarmHr </span><span class="pun">==</span><span class="pln"> t</span><span class="pun">.</span><span class="pln">hour </span><span class="kwd">and</span><span class="pln"> alarmMin </span><span class="pun">==</span><span class="pln"> t</span><span class="pun">.</span><span class="pln">min</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  91. soundAlarm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  92. </span><span class="pun">}</span><span class="pln">
  93. </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  94. soundAlarm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  95. snoozeAlarm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  96. digitalWrite</span><span class="pun">(</span><span class="pln">LEDPIN</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  97. vol</span><span class="pun">.</span><span class="pln">tone</span><span class="pun">(</span><span class="pln">SPEAKERPIN</span><span class="pun">,</span><span class="pln"> </span><span class="lit">800</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  98. </span><span class="pun">}</span><span class="pln">
  99. </span><span class="com">// check if snooze button pressed</span><span class="pln">
  100. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">pushVal2 </span><span class="pun">==</span><span class="pln"> HIGH </span><span class="kwd">and</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> snooze </span><span class="kwd">and</span><span class="pln"> soundAlarm</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  101. snooze </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  102. </span><span class="pun">}</span><span class="pln">
  103. </span><span class="com">// check if selection button pressed, update to next menu state</span><span class="pln">
  104. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">pushVal </span><span class="pun">==</span><span class="pln"> HIGH</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  105. lcd</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  106. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set minutes"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  107. </span><span class="com">// setting alarm</span><span class="pln">
  108. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">alarmTime</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  109. </span><span class="com">// set alarm time to selected hour and min</span><span class="pln">
  110. alarmHr </span><span class="pun">=</span><span class="pln"> hours</span><span class="pun">;</span><span class="pln">
  111. alarmMin </span><span class="pun">=</span><span class="pln"> minutes</span><span class="pun">;</span><span class="pln">
  112. alarmTime </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  113. </span><span class="com">// set corresponding snooze time (5 min later)</span><span class="pln">
  114. snoozeHr </span><span class="pun">=</span><span class="pln"> alarmHr</span><span class="pun">;</span><span class="pln">
  115. snoozeMin </span><span class="pun">=</span><span class="pln"> alarmMin </span><span class="pun">+</span><span class="pln"> snoozeDelay</span><span class="pun">;</span><span class="pln">
  116. </span><span class="com">// manage minute overflow</span><span class="pln">
  117. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">snoozeMin </span><span class="pun">></span><span class="pln"> </span><span class="lit">59</span><span class="pun">)</span><span class="pln"> </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">snoozeHr </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">24</span><span class="pun">)</span><span class="pln">
  119. snoozeHr </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  120. </span><span class="kwd">else</span><span class="pln">
  121. snoozeHr </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  122. snoozeMin </span><span class="pun">=</span><span class="pln"> snoozeMin </span><span class="pun">-</span><span class="pln"> </span><span class="lit">60</span><span class="pun">;</span><span class="pln">
  123. </span><span class="pun">}</span><span class="pln">
  124. </span><span class="pun">}</span><span class="pln">
  125. </span><span class="com">// setting display time</span><span class="pln">
  126. </span><span class="kwd">else</span><span class="pln">
  127. rtc</span><span class="pun">.</span><span class="pln">setTime</span><span class="pun">(</span><span class="pln">hours</span><span class="pun">,</span><span class="pln"> minutes</span><span class="pun">,</span><span class="pln"> </span><span class="lit">50</span><span class="pun">);</span><span class="pln"> </span><span class="com">// edit for testing</span><span class="pln">
  128. </span><span class="com">// reset snooze settings</span><span class="pln">
  129. snooze </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  130. state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"display time"</span><span class="pun">;</span><span class="pln">
  131. </span><span class="pun">}</span><span class="pln">
  132. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set hours"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  133. state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"set minutes"</span><span class="pun">;</span><span class="pln">
  134. </span><span class="pun">}</span><span class="pln">
  135. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"display time"</span><span class="pun">))</span><span class="pln">
  136. state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"settings"</span><span class="pun">;</span><span class="pln">
  137. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"settings"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  138. </span><span class="com">// check which option selected</span><span class="pln">
  139. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln">
  140. state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"set hours"</span><span class="pun">;</span><span class="pln">
  141. </span><span class="kwd">else</span><span class="pln">
  142. state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"edit alarm"</span><span class="pun">;</span><span class="pln">
  143. </span><span class="pun">}</span><span class="pln">
  144. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"edit alarm"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  145. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln">
  146. state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"display time"</span><span class="pun">;</span><span class="pln">
  147. </span><span class="kwd">else</span><span class="pln">
  148. state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"set alarm"</span><span class="pun">;</span><span class="pln">
  149. </span><span class="pun">}</span><span class="pln">
  150. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set alarm"</span><span class="pun">))</span><span class="pln"> </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">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  152. alarmOn </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  153. alarmTime </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  154. state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"set hours"</span><span class="pun">;</span><span class="pln">
  155. </span><span class="pun">}</span><span class="pln">
  156. </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  157. alarmOn </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  158. </span><span class="com">// reset snooze settings</span><span class="pln">
  159. snooze </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  160. state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"display time"</span><span class="pun">;</span><span class="pln">
  161. </span><span class="pun">}</span><span class="pln">
  162. </span><span class="pun">}</span><span class="pln">
  163. </span><span class="com">// time gap for button unpress</span><span class="pln">
  164. delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  165. </span><span class="pun">}</span><span class="pln">
  166. </span><span class="com">// update alarm screen display</span><span class="pln">
  167. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"display time"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  168. lcd</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">
  169. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">soundAlarm </span><span class="kwd">and</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> snooze</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  170. </span><span class="com">// set off alarm</span><span class="pln">
  171. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Time to go sleep!"</span><span class="pun">);</span><span class="pln">
  172. callAlarm</span><span class="pun">(</span><span class="pln">brightnessVal</span><span class="pun">);</span><span class="pln">
  173. </span><span class="pun">}</span><span class="pln">
  174. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">snoozeAlarm</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  175. </span><span class="com">// set off snooze alarm</span><span class="pln">
  176. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"PLEASE GET SLEEP"</span><span class="pun">);</span><span class="pln">
  177. callAlarm</span><span class="pun">(</span><span class="pln">brightnessVal</span><span class="pun">);</span><span class="pln">
  178. </span><span class="pun">}</span><span class="pln">
  179. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">snooze</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  180. </span><span class="com">// display time for next alarm</span><span class="pln">
  181. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="pln"> </span><span class="str">"[snooze "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> snoozeHr </span><span class="pun">+</span><span class="pln"> </span><span class="str">":"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> snoozeMin </span><span class="pun">+</span><span class="pln"> </span><span class="str">"] "</span><span class="pun">);</span><span class="pln">
  182. </span><span class="pun">}</span><span class="pln">
  183. </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  184. lcd</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">
  185. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
  186. </span><span class="pun">}</span><span class="pln">
  187. </span><span class="com">// display current time</span><span class="pln">
  188. lcd</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">
  189. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Time: "</span><span class="pun">);</span><span class="pln">
  190. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">rtc</span><span class="pun">.</span><span class="pln">getTimeStr</span><span class="pun">());</span><span class="pln">
  191. </span><span class="pun">}</span><span class="pln">
  192. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"settings"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  193. </span><span class="com">// display options and cursor</span><span class="pln">
  194. lcd</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">
  195. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Edit Time"</span><span class="pun">);</span><span class="pln">
  196. lcd</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">
  197. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Set Alarm"</span><span class="pun">);</span><span class="pln">
  198. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  199. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  200. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
  201. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  202. </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">
  203. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  204. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
  205. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  206. </span><span class="pun">}</span><span class="pln">
  207. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"<"</span><span class="pun">);</span><span class="pln">
  208. </span><span class="pun">}</span><span class="pln">
  209. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"edit alarm"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  210. </span><span class="com">// select whether to change or keep alarm time</span><span class="pln">
  211. lcd</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">
  212. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">alarmOn</span><span class="pun">)</span><span class="pln">
  213. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"Alarm: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> alarmHr </span><span class="pun">+</span><span class="pln"> </span><span class="str">":"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> alarmMin</span><span class="pun">);</span><span class="pln">
  214. </span><span class="kwd">else</span><span class="pln">
  215. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Alarm: None"</span><span class="pun">);</span><span class="pln">
  216. lcd</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">
  217. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Edit"</span><span class="pun">);</span><span class="pln">
  218. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  219. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  220. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
  221. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  222. </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">
  223. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  224. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
  225. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  226. </span><span class="pun">}</span><span class="pln">
  227. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"<"</span><span class="pun">);</span><span class="pln">
  228. </span><span class="pun">}</span><span class="pln">
  229. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set alarm"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  230. </span><span class="com">// select if alarm is turned on or off</span><span class="pln">
  231. lcd</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">
  232. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Alarm On"</span><span class="pun">);</span><span class="pln">
  233. lcd</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">
  234. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Alarm Off"</span><span class="pun">);</span><span class="pln">
  235. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  236. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  237. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
  238. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  239. </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">
  240. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  241. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
  242. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  243. </span><span class="pun">}</span><span class="pln">
  244. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"<"</span><span class="pun">);</span><span class="pln">
  245. </span><span class="pun">}</span><span class="pln">
  246. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set hours"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  247. </span><span class="com">// update hour being entered</span><span class="pln">
  248. lcd</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">
  249. </span><span class="com">// map potVal to be within 0-23 hr range</span><span class="pln">
  250. hours </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">map</span><span class="pun">(</span><span class="pln">potVal</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">1023</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"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">23</span><span class="pun">);</span><span class="pln">
  251. </span><span class="com">// adjust spacing for 1 vs 2 digit display</span><span class="pln">
  252. </span><span class="typ">String</span><span class="pln"> space </span><span class="pun">=</span><span class="pln"> </span><span class="str">" "</span><span class="pun">;</span><span class="pln">
  253. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">hours </span><span class="pun"><</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> space </span><span class="pun">=</span><span class="pln"> </span><span class="str">" "</span><span class="pun">;</span><span class="pln">
  254. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"Set Hour:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> space </span><span class="pun">+</span><span class="pln"> hours</span><span class="pun">);</span><span class="pln">
  255. </span><span class="pun">}</span><span class="pln">
  256. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set minutes"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  257. </span><span class="com">// update minutes being entered</span><span class="pln">
  258. lcd</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">
  259. </span><span class="com">// map potVal to be within 0-59 min range</span><span class="pln">
  260. minutes </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">map</span><span class="pun">(</span><span class="pln">potVal</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">1023</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">65</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">59</span><span class="pun">);</span><span class="pln">
  261. </span><span class="com">// adjust layout spacing for 1 vs 2 digit display</span><span class="pln">
  262. </span><span class="typ">String</span><span class="pln"> space </span><span class="pun">=</span><span class="pln"> </span><span class="str">" "</span><span class="pun">;</span><span class="pln">
  263. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">minutes </span><span class="pun"><</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> space </span><span class="pun">=</span><span class="pln"> </span><span class="str">" "</span><span class="pun">;</span><span class="pln">
  264. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"Set Minutes:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> space </span><span class="pun">+</span><span class="pln"> minutes</span><span class="pun">);</span><span class="pln">
  265. </span><span class="pun">}</span><span class="pln">
  266. </span><span class="pun">}</span>
<span class="com">/*
   Project Title: Snooze Alarm

   Description: This code sets off a sound alarm to remind the user the
   user to go to sleep if they are awake past their set bed time.
   A photoresistor reads in brightness levels of the room to
   detect whether the user is asleep or not. A potentiometer and
   momentary push button provide input to change the time displayed 
   and alarm settings on an LCD screen. If the user is still not not
   in bed within 5 minutes of the alarm, a second snooze alarm 
   will be set off. The first alarm can be stopped by pressing 
   a snooze button but not the second snooze alarm.

   Pin mapping:

   pin   | mode   | description
   ------|--------|------------
   A0      input     potentiometer
   A3      input     photocell
    7      input     momentary push button (settings)
    5      input     momentary push button (snooze)
    9      output    sound speaker (alarm)
    12     output    LED (alarm)
    
*/</span><span class="pln">

</span><span class="com">// include necessary libraries</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><DS3231.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">#include</span><span class="pln"> </span><span class="str">"Volume3.h"</span><span class="pln">

</span><span class="typ">String</span><span class="pln"> state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"display time"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// clock menu state</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> hours</span><span class="pun">;</span><span class="pln"> </span><span class="com">// hours set for display or alarm time</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> minutes</span><span class="pun">;</span><span class="pln"> </span><span class="com">// minutes set for diplay or alarm time</span><span class="pln">

</span><span class="kwd">int</span><span class="pln"> speakerVol</span><span class="pun">;</span><span class="pln"> </span><span class="com">// volume of alarm </span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> maxVol </span><span class="pun">=</span><span class="pln"> </span><span class="lit">800</span><span class="pun">;</span><span class="pln"> </span><span class="com">// speaker max volume</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> threshold </span><span class="pun">=</span><span class="pln"> </span><span class="lit">930</span><span class="pun">;</span><span class="pln"> </span><span class="com">// brightness threshold</span><span class="pln">
</span><span class="kwd">bool</span><span class="pln"> soundAlarm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="com">// play alarm sound</span><span class="pln">

</span><span class="kwd">bool</span><span class="pln"> alarmOn </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"> alarmTime </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="com">// indicate setting alarm or display time</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> alarmHr</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> alarmMin</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">bool</span><span class="pln"> snooze </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="com">// whether user has pressed snooze button</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> snoozeHr</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> snoozeMin</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> snoozeDelay </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// how many minutes to snooze</span><span class="pln">
</span><span class="kwd">bool</span><span class="pln"> snoozeAlarm </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">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> POTPIN </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</span><span class="pln"> </span><span class="com">// potentiometer</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PHOTOPIN </span><span class="pun">=</span><span class="pln"> A3</span><span class="pun">;</span><span class="pln"> </span><span class="com">// photocell</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PUSHPIN </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">// momentary push button for settings</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PUSHPIN2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// momentary push button for snooze</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SPEAKERPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln"> </span><span class="com">// sound speaker</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> LEDPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12</span><span class="pun">;</span><span class="pln"> </span><span class="com">// LED</span><span class="pln">

DS3231 rtc</span><span class="pun">(</span><span class="pln">SDA</span><span class="pun">,</span><span class="pln"> SCL</span><span class="pun">);</span><span class="pln"> </span><span class="com">// initialize real time clock</span><span class="pln">
</span><span class="typ">LiquidCrystal_I2C</span><span class="pln"> lcd</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">// initialize LCD display</span><span class="pln">

</span><span class="com">// control alarm sound and light behavior</span><span class="pln">
</span><span class="kwd">void</span><span class="pln"> callAlarm</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> brightnessVal</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">brightnessVal </span><span class="pun"><</span><span class="pln"> threshold</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    speakerVol </span><span class="pun">=</span><span class="pln"> maxVol</span><span class="pun">;</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">LEDPIN</span><span class="pun">,</span><span class="pln"> HIGH</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">
    speakerVol </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">LEDPIN</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">
  vol</span><span class="pun">.</span><span class="pln">tone</span><span class="pun">(</span><span class="pln">SPEAKERPIN</span><span class="pun">,</span><span class="pln"> </span><span class="lit">800</span><span class="pun">,</span><span class="pln"> speakerVol</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"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">POTPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// potentiometer</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">PHOTOPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// photoresistor</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">PUSHPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// momentary push button</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">PUSHPIN2</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// snooze push button</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">LEDPIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// LED</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">SPEAKERPIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln"> </span><span class="com">// sound speaker</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">115200</span><span class="pun">);</span><span class="pln">

  </span><span class="com">// set up LCD screen</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">backlight</span><span class="pun">();</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">home</span><span class="pun">();</span><span class="pln">

  </span><span class="com">// set up real time clock</span><span class="pln">
  rtc</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">
  rtc</span><span class="pun">.</span><span class="pln">setTime</span><span class="pun">(</span><span class="lit">12</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">0</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Set time to 12:00:00 (24hr format)</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="kwd">int</span><span class="pln"> potVal </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">POTPIN</span><span class="pun">);</span><span class="pln"> </span><span class="com">//(range 0-1023)</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> brightnessVal </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">PHOTOPIN</span><span class="pun">);</span><span class="pln"> </span><span class="com">//(range 800-1022)</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> pushVal </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">PUSHPIN</span><span class="pun">);</span><span class="pln"> </span><span class="com">// settings button</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> pushVal2 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">PUSHPIN2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// snooze button</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">brightnessVal</span><span class="pun">);</span><span class="pln">

  </span><span class="com">// check whether alarm should be set off</span><span class="pln">
  </span><span class="typ">Time</span><span class="pln"> t </span><span class="pun">=</span><span class="pln"> rtc</span><span class="pun">.</span><span class="pln">getTime</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">snoozeHr </span><span class="pun">==</span><span class="pln"> t</span><span class="pun">.</span><span class="pln">hour </span><span class="kwd">and</span><span class="pln"> snoozeMin </span><span class="pun">==</span><span class="pln"> t</span><span class="pun">.</span><span class="pln">min</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    snoozeAlarm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
    snooze </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">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">not</span><span class="pln"> snooze </span><span class="kwd">and</span><span class="pln"> alarmOn </span><span class="kwd">and</span><span class="pln"> alarmHr </span><span class="pun">==</span><span class="pln"> t</span><span class="pun">.</span><span class="pln">hour </span><span class="kwd">and</span><span class="pln"> alarmMin </span><span class="pun">==</span><span class="pln"> t</span><span class="pun">.</span><span class="pln">min</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    soundAlarm </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">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    soundAlarm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
    snoozeAlarm </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">LEDPIN</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
    vol</span><span class="pun">.</span><span class="pln">tone</span><span class="pun">(</span><span class="pln">SPEAKERPIN</span><span class="pun">,</span><span class="pln"> </span><span class="lit">800</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">// check if snooze button pressed</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">pushVal2 </span><span class="pun">==</span><span class="pln"> HIGH </span><span class="kwd">and</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> snooze </span><span class="kwd">and</span><span class="pln"> soundAlarm</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    snooze </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">// check if selection button pressed, update to next menu state</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">pushVal </span><span class="pun">==</span><span class="pln"> HIGH</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    lcd</span><span class="pun">.</span><span class="pln">clear</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">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set minutes"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// setting alarm</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">alarmTime</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// set alarm time to selected hour and min</span><span class="pln">
        alarmHr </span><span class="pun">=</span><span class="pln"> hours</span><span class="pun">;</span><span class="pln">
        alarmMin </span><span class="pun">=</span><span class="pln"> minutes</span><span class="pun">;</span><span class="pln">
        alarmTime </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
        
        </span><span class="com">// set corresponding snooze time (5 min later)</span><span class="pln">
        snoozeHr </span><span class="pun">=</span><span class="pln"> alarmHr</span><span class="pun">;</span><span class="pln">
        snoozeMin </span><span class="pun">=</span><span class="pln"> alarmMin </span><span class="pun">+</span><span class="pln"> snoozeDelay</span><span class="pun">;</span><span class="pln">
        </span><span class="com">// manage minute overflow</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">snoozeMin </span><span class="pun">></span><span class="pln"> </span><span class="lit">59</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">snoozeHr </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">24</span><span class="pun">)</span><span class="pln">
            snoozeHr </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">else</span><span class="pln">
            snoozeHr </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
          snoozeMin </span><span class="pun">=</span><span class="pln"> snoozeMin </span><span class="pun">-</span><span class="pln"> </span><span class="lit">60</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="com">// setting display time</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln">
        rtc</span><span class="pun">.</span><span class="pln">setTime</span><span class="pun">(</span><span class="pln">hours</span><span class="pun">,</span><span class="pln"> minutes</span><span class="pun">,</span><span class="pln"> </span><span class="lit">50</span><span class="pun">);</span><span class="pln"> </span><span class="com">// edit for testing</span><span class="pln">
      </span><span class="com">// reset snooze settings</span><span class="pln">
      snooze </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
      state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"display time"</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set hours"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"set minutes"</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"display time"</span><span class="pun">))</span><span class="pln">
      state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"settings"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"settings"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// check which option selected</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln">
        state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"set hours"</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln">
        state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"edit alarm"</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"edit alarm"</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">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln">
        state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"display time"</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln">
        state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"set alarm"</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set alarm"</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">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        alarmOn </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
        alarmTime </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
        state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"set hours"</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">
        alarmOn </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
        </span><span class="com">// reset snooze settings</span><span class="pln">
        snooze </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
        state </span><span class="pun">=</span><span class="pln"> </span><span class="str">"display time"</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="com">// time gap for button unpress</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="com">// update alarm screen display</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"display time"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    lcd</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">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">soundAlarm </span><span class="kwd">and</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> snooze</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// set off alarm</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Time to go sleep!"</span><span class="pun">);</span><span class="pln">
      callAlarm</span><span class="pun">(</span><span class="pln">brightnessVal</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">snoozeAlarm</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// set off snooze alarm</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"PLEASE GET SLEEP"</span><span class="pun">);</span><span class="pln">
      callAlarm</span><span class="pun">(</span><span class="pln">brightnessVal</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">snooze</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// display time for next alarm</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="pln"> </span><span class="str">"[snooze "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> snoozeHr </span><span class="pun">+</span><span class="pln"> </span><span class="str">":"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> snoozeMin </span><span class="pun">+</span><span class="pln"> </span><span class="str">"]   "</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">
      lcd</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">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"                 "</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="com">// display current time</span><span class="pln">
    lcd</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">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Time:  "</span><span class="pun">);</span><span class="pln">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">rtc</span><span class="pun">.</span><span class="pln">getTimeStr</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"settings"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// display options and cursor</span><span class="pln">
    lcd</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">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Edit Time"</span><span class="pun">);</span><span class="pln">
    lcd</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">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Set Alarm"</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">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</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">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</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">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"<"</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"edit alarm"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// select whether to change or keep alarm time</span><span class="pln">
    lcd</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">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">alarmOn</span><span class="pun">)</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"Alarm: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> alarmHr </span><span class="pun">+</span><span class="pln"> </span><span class="str">":"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> alarmMin</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Alarm: None"</span><span class="pun">);</span><span class="pln">
    lcd</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">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Edit"</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">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</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">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</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">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"<"</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set alarm"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// select if alarm is turned on or off</span><span class="pln">
    lcd</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">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Alarm On"</span><span class="pun">);</span><span class="pln">
    lcd</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">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Alarm Off"</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">potVal </span><span class="pun"><</span><span class="pln"> </span><span class="lit">511</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</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">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
      lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">15</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">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"<"</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set hours"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// update hour being entered</span><span class="pln">
    lcd</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">

    </span><span class="com">// map potVal to be within 0-23 hr range</span><span class="pln">
    hours </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">map</span><span class="pun">(</span><span class="pln">potVal</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">1023</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"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">23</span><span class="pun">);</span><span class="pln">

    </span><span class="com">// adjust spacing for 1 vs 2 digit display</span><span class="pln">
    </span><span class="typ">String</span><span class="pln"> space </span><span class="pun">=</span><span class="pln"> </span><span class="str">" "</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">hours </span><span class="pun"><</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> space </span><span class="pun">=</span><span class="pln"> </span><span class="str">"  "</span><span class="pun">;</span><span class="pln">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"Set Hour:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> space </span><span class="pun">+</span><span class="pln"> hours</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">.</span><span class="pln">equals</span><span class="pun">(</span><span class="str">"set minutes"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// update minutes being entered</span><span class="pln">
    lcd</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">

    </span><span class="com">// map potVal to be within 0-59 min range</span><span class="pln">
    minutes </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">map</span><span class="pun">(</span><span class="pln">potVal</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">1023</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">65</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">59</span><span class="pun">);</span><span class="pln">

    </span><span class="com">// adjust layout spacing for 1 vs 2 digit display</span><span class="pln">
    </span><span class="typ">String</span><span class="pln"> space </span><span class="pun">=</span><span class="pln"> </span><span class="str">" "</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">minutes </span><span class="pun"><</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> space </span><span class="pun">=</span><span class="pln"> </span><span class="str">"  "</span><span class="pun">;</span><span class="pln">
    lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"Set Minutes:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> space </span><span class="pun">+</span><span class="pln"> minutes</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span>