Overview

A fidget box with multiple switches, button, and knobs with a display showing how much the user fidgets, and vibrates and notifies the user to take a break when the user fidgets too much.

Note: final images and videos unavailable due to the pandemic — I do not have access to my project and thus cannot take pictures and videos

Process Images and Review

Decision Point 1 (see below)

Decision point 1: I made a cardboard model to start with, which was 50mm * 50mm * 50mm. As I fitted some electronics in, I realized there was not enough space. As a result, I opted for a larger (70mm) design and chose to only solder the wires instead of using a breadboard.

Following the cardboard model, I made a 3D model on Fusion 360 for laser cutting

The laser-cut pieces to assemble the fidget box

Before wiring and assembling, I tested the electronic parts including the OLED screen

Decision Point 2 (see below)

Decision point 2: When I tried to use the heat gun to heat shrink the wires, I turned it up too hot and it melted the plastic and some solder. It was very frustrating. I took out all parts and wires, and rewired each individual part and fitted them on the box later.

Glueing the last piece together with the box

Discussion

My goal for the fidget box during the ideation process is to make something fidgety to help me deal with stress, and keep track of how much I fidget to prevent from stressing out too much. I am happy with the final product, which more or less reached my initial goal, however the process wasn’t easy.

I spent a lot of time on this project, nearly three or four times more than I did with the last project, but I learned a lot. The initial design of the box was mostly done on paper, and I adjusted each face of the box as I made the cardboard model. Making the cardboard model was surprisingly useful, as I could visualize the product and test how it feels on hand.

I did not have much experience using Fusion 360, so I watched a lot of YouTube tutorials on how to make finger joints and decided to follow one particular video that uses parameters and allows the dimensions to be adjustable. I still had to play around with things as I go, but in the end I succeeded and I believe this process helped me a lot and made me more comfortable with using Fusion.

The hardest and the most time-consuming part was wiring and soldering. Unlike previous homework and the last project, I decided to not use a breadboard to fit the compact size of the box. One of the feedback I got for the final presentation was I like how compact it is, but if it were to be a fidget cube, it should be smaller? Like small enough to hold it with one hand. I know it is hard to put all the wiring in to a box though.” I certainly wished I could make the box smaller, so carrying it would be much easier, but because of the size of the electronics this was the best I could do. The box had to fit all switches/pushbuttons/potentiometers, the OLED screen, the Arduino (the Pro Mini was the only one that fits), battery (coin cells are the smallest), and all the wires. I have had a fair amount of experience with soldering, but the constraint of the space made this process unexpectedly difficult. I ended up tangling all the wires, and since I didn’t utilize the different colors, I was confused as which was connected to which. Eventually I had to pull apart all of them after I overheated with the heat gun and melted the plastic of the wiring and the solder.  But since I already glued together the box the rewiring was also very difficult. This taught me a lesson. So for the next time, I would utilize the colors of the wires efficiently (red for power, black for ground, different colors for each input/output), and then solder and wire individual parts, fit them onto the faces, wire them together, and glue each face together at last.

The idea of quantifying the number of “flips” is interesting because data can be gathered and may reveal interesting things about personal behavior. Maybe making the outer shell of the box a soft surface can make it more stress relieving. It is more comfortable and can be tossed around.This written feedback I received pretty much reflects what I want to do with the project in the future. The texture I used for the box was wood, as it was the most accessible for laser printing, but it doesn’t feel that great on hand. I also didn’t have time to sand down the sides and corners. If I can, I hope I can make it with a softer, and more squeezable material so it adds another way to fidget. I can also attach a flex sensor inside, so it could identify each time the user squeezes. Furthermore, I also wish to use the data of the fidgets to do more, such as uploading it on the Internet, and sending the user a notification of a daily report on fidget habits such as time and frequency.

Technical Information

Schematic:

Code submission:

  1. <span class="com">/*
  2. * Project 2: Fidget Box
  3. * Alan Zhu
  4. *
  5. * Description: the code checks each input options (potentiometer,
  6. * switches, buttons) from five faces of the fidegt box, and keep
  7. * count of each fidget, which will be displayed on the OLED as it
  8. * updates in a set interval. Once the number of fidgets reaches a
  9. * certain amount, the vibration motor turns on and vibrates the
  10. * fidget box for 5 seconds, and the OLED displays a message to
  11. * encourage the user to rest for a while, and then resets count.
  12. *
  13. * Collaboration: none
  14. *
  15. * Pin mapping:
  16. * pin | mode | description
  17. * ------|--------|------------
  18. * A0 input potentiometer
  19. * A1 input slide potentiometer
  20. * 4 input latching pushbutton 1
  21. * 5 input latching pushbutton 2
  22. * 6 input SPST switch 1
  23. * 7 input SPST switch 2
  24. * 8 input rocker switch 1
  25. * 9 input rocker switch 2
  26. * 10 output vibration motor
  27. *
  28. */</span><span class="pln">
  29. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><SPI.h></span><span class="pln">
  30. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Wire.h></span><span class="pln">
  31. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Adafruit_GFX.h></span><span class="pln">
  32. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Adafruit_SSD1306.h></span><span class="pln">
  33. </span><span class="typ">Adafruit_SSD1306</span><span class="pln"> display</span><span class="pun">(</span><span class="lit">128</span><span class="pun">,</span><span class="pln"> </span><span class="lit">32</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="typ">Wire</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 128*32 OLED display</span><span class="pln">
  34. </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">
  35. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SLIDPIN </span><span class="pun">=</span><span class="pln"> A1</span><span class="pun">;</span><span class="pln">
  36. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> ROCPIN1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln">
  37. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> ROCPIN2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">
  38. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SWIPIN1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
  39. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SWIPIN2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8</span><span class="pun">;</span><span class="pln">
  40. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PUSHPIN1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
  41. </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">4</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"> VIBPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
  43. </span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> timer </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">// internal timer used to update OLEd in set intervals</span><span class="pln">
  44. </span><span class="kwd">int</span><span class="pln"> roc1</span><span class="pun">,</span><span class="pln"> roc2</span><span class="pun">,</span><span class="pln"> swi1</span><span class="pun">,</span><span class="pln"> swi2</span><span class="pun">,</span><span class="pln"> push1</span><span class="pun">,</span><span class="pln"> push2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// values of 0 or 1 for the two states of pushbuttons and switches</span><span class="pln">
  45. </span><span class="kwd">int</span><span class="pln"> potval</span><span class="pun">,</span><span class="pln"> slidval</span><span class="pun">;</span><span class="pln"> </span><span class="com">// values between 0 and 1023 for analog readings of potentiometers</span><span class="pln">
  46. </span><span class="kwd">int</span><span class="pln"> count </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">// fidget count</span><span class="pln">
  47. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> ANALOG_GAP </span><span class="pun">=</span><span class="pln"> </span><span class="lit">600</span><span class="pun">;</span><span class="pln"> </span><span class="com">// the change in analog reading (0-1023) to be registered as a "fidget"</span><span class="pln">
  48. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> LIMIT </span><span class="pun">=</span><span class="pln"> </span><span class="lit">20</span><span class="pun">;</span><span class="pln"> </span><span class="com">// number of fidget until the box vibrates and sends message</span><span class="pln">
  49. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> WAIT </span><span class="pun">=</span><span class="pln"> </span><span class="lit">500</span><span class="pun">;</span><span class="pln"> </span><span class="com">// milliseconds between each OLED update</span><span class="pln">
  50. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> WARNTIME </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5000</span><span class="pun">;</span><span class="pln"> </span><span class="com">// milliseconds of vibration and message time</span><span class="pln">
  51. </span><span class="com">// messages to be shown in OLED after reaches fidget limit</span><span class="pln">
  52. </span><span class="typ">String</span><span class="pln"> warn_messages</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  53. </span><span class="str">"You're spending too much time on this! Find something else to do."</span><span class="pun">,</span><span class="pln">
  54. </span><span class="str">"Are you anxious? Consider taking a break."</span><span class="pun">,</span><span class="pln">
  55. </span><span class="str">"Put me down, stand up, and go get a drink."</span><span class="pun">,</span><span class="pln">
  56. </span><span class="str">"Feeling like your brain isn't working? Maybe you need to rest."</span><span class="pun">,</span><span class="pln">
  57. </span><span class="str">"Spending too much time on one thing is not going to be productive."</span><span class="pun">,</span><span class="pln">
  58. </span><span class="str">"I think your brain needs to rest. Go talk to someone."</span><span class="pln">
  59. </span><span class="pun">};</span><span class="pln">
  60. </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">
  61. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
  62. display</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="pln">SSD1306_SWITCHCAPVCC</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0x3C</span><span class="pun">);</span><span class="pln">
  63. display</span><span class="pun">.</span><span class="pln">clearDisplay</span><span class="pun">();</span><span class="pln">
  64. 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">
  65. pinMode</span><span class="pun">(</span><span class="pln">SLIDPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  66. pinMode</span><span class="pun">(</span><span class="pln">ROCPIN1</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  67. pinMode</span><span class="pun">(</span><span class="pln">ROCPIN2</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  68. pinMode</span><span class="pun">(</span><span class="pln">SWIPIN1</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  69. pinMode</span><span class="pun">(</span><span class="pln">SWIPIN2</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  70. pinMode</span><span class="pun">(</span><span class="pln">PUSHPIN1</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  71. pinMode</span><span class="pun">(</span><span class="pln">PUSHPIN2</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  72. pinMode</span><span class="pun">(</span><span class="pln">VIBPIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  73. </span><span class="com">// record initial values of each input</span><span class="pln">
  74. roc1 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">ROCPIN1</span><span class="pun">);</span><span class="pln">
  75. roc2 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">ROCPIN2</span><span class="pun">);</span><span class="pln">
  76. swi1 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">SWIPIN1</span><span class="pun">);</span><span class="pln">
  77. swi2 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">SWIPIN2</span><span class="pun">);</span><span class="pln">
  78. push1 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">PUSHPIN1</span><span class="pun">);</span><span class="pln">
  79. push2 </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">
  80. 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">
  81. slidval </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">SLIDPIN</span><span class="pun">);</span><span class="pln">
  82. </span><span class="pun">}</span><span class="pln">
  83. </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">
  84. </span><span class="com">// check all fidgets (digital and analog) and update count</span><span class="pln">
  85. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">ROCPIN1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> roc1</span><span class="pun">){</span><span class="pln">
  86. roc1 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">roc1 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// if status changes, update local value to match change</span><span class="pln">
  87. count</span><span class="pun">++;</span><span class="pln"> </span><span class="com">// increase fidget count</span><span class="pln">
  88. </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">digitalRead</span><span class="pun">(</span><span class="pln">ROCPIN2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> roc2</span><span class="pun">){</span><span class="pln">
  89. roc2 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">roc2 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  90. count</span><span class="pun">++;</span><span class="pln">
  91. </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">digitalRead</span><span class="pun">(</span><span class="pln">SWIPIN1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> swi1</span><span class="pun">){</span><span class="pln">
  92. swi1 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">swi1 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  93. count</span><span class="pun">++;</span><span class="pln">
  94. </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">digitalRead</span><span class="pun">(</span><span class="pln">SWIPIN2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> swi2</span><span class="pun">){</span><span class="pln">
  95. swi2 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">swi2 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  96. count</span><span class="pun">++;</span><span class="pln">
  97. </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">digitalRead</span><span class="pun">(</span><span class="pln">PUSHPIN1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> push1</span><span class="pun">){</span><span class="pln">
  98. push1 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">push1 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  99. count</span><span class="pun">++;</span><span class="pln">
  100. </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">digitalRead</span><span class="pun">(</span><span class="pln">PUSHPIN2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> push2</span><span class="pun">){</span><span class="pln">
  101. push2 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">push2 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  102. count</span><span class="pun">++;</span><span class="pln">
  103. </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">abs</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="pun">-</span><span class="pln"> potval</span><span class="pun">)</span><span class="pln"> </span><span class="pun">>=</span><span class="pln"> ANALOG_GAP</span><span class="pun">){</span><span class="pln">
  104. 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">// if change in analog value is greater than ANALOG_GAP, update local value to match change</span><span class="pln">
  105. count</span><span class="pun">++;</span><span class="pln">
  106. </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">abs</span><span class="pun">(</span><span class="pln">analogRead</span><span class="pun">(</span><span class="pln">SLIDPIN</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> slidval</span><span class="pun">)</span><span class="pln"> </span><span class="pun">>=</span><span class="pln"> ANALOG_GAP</span><span class="pun">){</span><span class="pln">
  107. slidval </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">SLIDPIN</span><span class="pun">);</span><span class="pln">
  108. count</span><span class="pun">++;</span><span class="pln">
  109. </span><span class="pun">}</span><span class="pln">
  110. </span><span class="com">// fidget count reach limit, send warning</span><span class="pln">
  111. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">count </span><span class="pun">>=</span><span class="pln"> LIMIT</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  112. </span><span class="com">// vibrate</span><span class="pln">
  113. digitalWrite</span><span class="pun">(</span><span class="pln">VIBPIN</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  114. </span><span class="com">// OLED send message (randomly selected from the group of messages)</span><span class="pln">
  115. display</span><span class="pun">.</span><span class="pln">setTextSize</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  116. display</span><span class="pun">.</span><span class="pln">setTextColor</span><span class="pun">(</span><span class="pln">SSD1306_WHITE</span><span class="pun">);</span><span class="pln">
  117. display</span><span class="pun">.</span><span class="pln">clearDisplay</span><span class="pun">();</span><span class="pln">
  118. display</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">
  119. display</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">warn_messages</span><span class="pun">[</span><span class="pln">random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">)]);</span><span class="pln">
  120. display</span><span class="pun">.</span><span class="pln">display</span><span class="pun">();</span><span class="pln">
  121. </span><span class="com">// turns of vibration and message after a while</span><span class="pln">
  122. delay</span><span class="pun">(</span><span class="pln">WARNTIME</span><span class="pun">);</span><span class="pln">
  123. digitalWrite</span><span class="pun">(</span><span class="pln">VIBPIN</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  124. display</span><span class="pun">.</span><span class="pln">clearDisplay</span><span class="pun">();</span><span class="pln">
  125. </span><span class="com">// reset fidget count</span><span class="pln">
  126. count </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  127. </span><span class="pun">}</span><span class="pln">
  128. </span><span class="com">// update OLED every interval of WAIT milliseconds</span><span class="pln">
  129. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">millis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> timer</span><span class="pun">)</span><span class="pln"> </span><span class="pun">>=</span><span class="pln"> WAIT</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  130. display</span><span class="pun">.</span><span class="pln">clearDisplay</span><span class="pun">();</span><span class="pln">
  131. display</span><span class="pun">.</span><span class="pln">setTextSize</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  132. display</span><span class="pun">.</span><span class="pln">setTextColor</span><span class="pun">(</span><span class="pln">SSD1306_WHITE</span><span class="pun">);</span><span class="pln">
  133. display</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">
  134. </span><span class="com">// display number of fidgets after last reset</span><span class="pln">
  135. display</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Total fidget count:"</span><span class="pun">));</span><span class="pln">
  136. display</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">count</span><span class="pun">,</span><span class="pln"> DEC</span><span class="pun">);</span><span class="pln">
  137. display</span><span class="pun">.</span><span class="pln">display</span><span class="pun">();</span><span class="pln">
  138. timer </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">();</span><span class="pln">
  139. </span><span class="pun">}</span><span class="pln">
  140. </span><span class="pun">}</span>
<span class="com">/*
 * Project 2: Fidget Box
 * Alan Zhu
 * 
 * Description: the code checks each input options (potentiometer, 
 * switches, buttons) from five faces of the fidegt box, and keep
 * count of each fidget, which will be displayed on the OLED as it
 * updates in a set interval. Once the number of fidgets reaches a
 * certain amount, the vibration motor turns on and vibrates the
 * fidget box for 5 seconds, and the OLED displays a message to
 * encourage the user to rest for a while, and then resets count.
 * 
 * Collaboration: none
 * 
 * Pin mapping:
 * pin   | mode   | description
 * ------|--------|------------
 * A0     input     potentiometer
 * A1     input     slide potentiometer
 * 4      input     latching pushbutton 1
 * 5      input     latching pushbutton 2
 * 6      input     SPST switch 1
 * 7      input     SPST switch 2
 * 8      input     rocker switch 1
 * 9      input     rocker switch 2
 * 10     output    vibration motor
 * 
 */</span><span class="pln">

</span><span class="com">#include</span><span class="pln"> </span><span class="str"><SPI.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><Wire.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><Adafruit_GFX.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><Adafruit_SSD1306.h></span><span class="pln">

</span><span class="typ">Adafruit_SSD1306</span><span class="pln"> display</span><span class="pun">(</span><span class="lit">128</span><span class="pun">,</span><span class="pln"> </span><span class="lit">32</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="typ">Wire</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 128*32 OLED display</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="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SLIDPIN </span><span class="pun">=</span><span class="pln"> A1</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"> ROCPIN1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</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"> ROCPIN2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</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"> SWIPIN1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SWIPIN2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PUSHPIN1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</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"> PUSHPIN2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</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"> VIBPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> timer </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">// internal timer used to update OLEd in set intervals</span><span class="pln">

</span><span class="kwd">int</span><span class="pln"> roc1</span><span class="pun">,</span><span class="pln"> roc2</span><span class="pun">,</span><span class="pln"> swi1</span><span class="pun">,</span><span class="pln"> swi2</span><span class="pun">,</span><span class="pln"> push1</span><span class="pun">,</span><span class="pln"> push2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// values of 0 or 1 for the two states of pushbuttons and switches</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> potval</span><span class="pun">,</span><span class="pln"> slidval</span><span class="pun">;</span><span class="pln"> </span><span class="com">// values between 0 and 1023 for analog readings of potentiometers</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> count </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">// fidget count</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> ANALOG_GAP </span><span class="pun">=</span><span class="pln"> </span><span class="lit">600</span><span class="pun">;</span><span class="pln"> </span><span class="com">// the change in analog reading (0-1023) to be registered as a "fidget"</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> LIMIT </span><span class="pun">=</span><span class="pln"> </span><span class="lit">20</span><span class="pun">;</span><span class="pln"> </span><span class="com">// number of fidget until the box vibrates and sends message</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> WAIT </span><span class="pun">=</span><span class="pln"> </span><span class="lit">500</span><span class="pun">;</span><span class="pln"> </span><span class="com">// milliseconds between each OLED update</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> WARNTIME </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5000</span><span class="pun">;</span><span class="pln"> </span><span class="com">// milliseconds of vibration and message time</span><span class="pln">

</span><span class="com">// messages to be shown in OLED after reaches fidget limit</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> warn_messages</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="str">"You're spending too much time on this! Find something else to do."</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"Are you anxious? Consider taking a break."</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"Put me down, stand up, and go get a drink."</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"Feeling like your brain isn't working? Maybe you need to rest."</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"Spending too much time on one thing is not going to be productive."</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"I think your brain needs to rest. Go talk to someone."</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">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
  
  display</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="pln">SSD1306_SWITCHCAPVCC</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0x3C</span><span class="pun">);</span><span class="pln">
  display</span><span class="pun">.</span><span class="pln">clearDisplay</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">
  pinMode</span><span class="pun">(</span><span class="pln">SLIDPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">ROCPIN1</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">ROCPIN2</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">SWIPIN1</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">SWIPIN2</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">PUSHPIN1</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">PUSHPIN2</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">VIBPIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">

  </span><span class="com">// record initial values of each input</span><span class="pln">
  roc1 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">ROCPIN1</span><span class="pun">);</span><span class="pln">
  roc2 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">ROCPIN2</span><span class="pun">);</span><span class="pln">
  swi1 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">SWIPIN1</span><span class="pun">);</span><span class="pln">
  swi2 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">SWIPIN2</span><span class="pun">);</span><span class="pln">
  push1 </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">PUSHPIN1</span><span class="pun">);</span><span class="pln">
  push2 </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">
  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">
  slidval </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">SLIDPIN</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  
  </span><span class="com">// check all fidgets (digital and analog) and update count</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">ROCPIN1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> roc1</span><span class="pun">){</span><span class="pln">
    roc1 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">roc1 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// if status changes, update local value to match change</span><span class="pln">
    count</span><span class="pun">++;</span><span class="pln"> </span><span class="com">// increase fidget count</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">digitalRead</span><span class="pun">(</span><span class="pln">ROCPIN2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> roc2</span><span class="pun">){</span><span class="pln">
    roc2 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">roc2 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    count</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">digitalRead</span><span class="pun">(</span><span class="pln">SWIPIN1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> swi1</span><span class="pun">){</span><span class="pln">
    swi1 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">swi1 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    count</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">digitalRead</span><span class="pun">(</span><span class="pln">SWIPIN2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> swi2</span><span class="pun">){</span><span class="pln">
    swi2 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">swi2 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    count</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">digitalRead</span><span class="pun">(</span><span class="pln">PUSHPIN1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> push1</span><span class="pun">){</span><span class="pln">
    push1 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">push1 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    count</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">digitalRead</span><span class="pun">(</span><span class="pln">PUSHPIN2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> push2</span><span class="pun">){</span><span class="pln">
    push2 </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">push2 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    count</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">abs</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="pun">-</span><span class="pln"> potval</span><span class="pun">)</span><span class="pln"> </span><span class="pun">>=</span><span class="pln"> ANALOG_GAP</span><span class="pun">){</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">// if change in analog value is greater than ANALOG_GAP, update local value to match change</span><span class="pln">
    count</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">abs</span><span class="pun">(</span><span class="pln">analogRead</span><span class="pun">(</span><span class="pln">SLIDPIN</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> slidval</span><span class="pun">)</span><span class="pln"> </span><span class="pun">>=</span><span class="pln"> ANALOG_GAP</span><span class="pun">){</span><span class="pln">
    slidval </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">SLIDPIN</span><span class="pun">);</span><span class="pln">
    count</span><span class="pun">++;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="com">// fidget count reach limit, send warning</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">count </span><span class="pun">>=</span><span class="pln"> LIMIT</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// vibrate</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">VIBPIN</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    
    </span><span class="com">// OLED send message (randomly selected from the group of messages)</span><span class="pln">
    display</span><span class="pun">.</span><span class="pln">setTextSize</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    display</span><span class="pun">.</span><span class="pln">setTextColor</span><span class="pun">(</span><span class="pln">SSD1306_WHITE</span><span class="pun">);</span><span class="pln">
    display</span><span class="pun">.</span><span class="pln">clearDisplay</span><span class="pun">();</span><span class="pln">
    display</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">
    display</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">warn_messages</span><span class="pun">[</span><span class="pln">random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">)]);</span><span class="pln">
    display</span><span class="pun">.</span><span class="pln">display</span><span class="pun">();</span><span class="pln">

    </span><span class="com">// turns of vibration and message after a while</span><span class="pln">
    delay</span><span class="pun">(</span><span class="pln">WARNTIME</span><span class="pun">);</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">VIBPIN</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
    display</span><span class="pun">.</span><span class="pln">clearDisplay</span><span class="pun">();</span><span class="pln">
    
    </span><span class="com">// reset fidget count</span><span class="pln">
    count </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">// update OLED every interval of WAIT milliseconds</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">millis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> timer</span><span class="pun">)</span><span class="pln"> </span><span class="pun">>=</span><span class="pln"> WAIT</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    display</span><span class="pun">.</span><span class="pln">clearDisplay</span><span class="pun">();</span><span class="pln">
    display</span><span class="pun">.</span><span class="pln">setTextSize</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    display</span><span class="pun">.</span><span class="pln">setTextColor</span><span class="pun">(</span><span class="pln">SSD1306_WHITE</span><span class="pun">);</span><span class="pln">
    display</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">// display number of fidgets after last reset</span><span class="pln">
    display</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">F</span><span class="pun">(</span><span class="str">"Total fidget count:"</span><span class="pun">));</span><span class="pln">
    display</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">count</span><span class="pun">,</span><span class="pln"> DEC</span><span class="pun">);</span><span class="pln">
    display</span><span class="pun">.</span><span class="pln">display</span><span class="pun">();</span><span class="pln">
    
    timer </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span>