Magnetic Field to Vibration Strength

Full image of the Double Transducer: Magnetic Field to Vibration Strength

Full image of the Double Transducer: Magnetic Field to Vibration Strength. (At an angle)

Close up of Magnetometer (input) to Light Bulb (output). The magnetometer detects the magnetic strength from the magnet’s distance. This causes the light bulb to light up in different ranges of brightness.

Close up of Light Bulb (Output) and Temperature Sensor (Input). The temperature sensor detects the different ranges of temperature the light bulb is emitting from the light bulb’s different brightness.

Close up of Temperature Sensor (Input) and Vibration Motor (Output). The range of temperature the temperature sensor detects determines the different ranges of strength the motor vibrates.

Description

We created a double transducer which is a device that converts magnetic field (such as the force of a magnet) through two more activities/functions to produce vibration strength (how fast something vibrates).

In our project, the farthest to the left is the magnetometer (the blue rectangular chip), which detects the magnetic field from having a magnet come closer or farther in distance to the chip. We coded this magnetometer so that it only detects forces from its x-axis (one side of this chip). Continuing on is the light bulb to the right. The lightbulb will turn on in different brightness when the magnet is at different distances to the magnetometer. The closer the magnet or when the magnetic field strength is high, the light bulb gets brighter. The lightbulb will produce heat and this will trigger the next mechanism, the temperature sensor (the black half cylinder with three legs/prongs). The temperature sensor will detect the temperature surrounding itself and once it gets to a certain degree, it will trigger a vibration motor (the small metal disk to the very right). The higher the temperature, the more the vibration motor will shake.

Process Images

This was the beginning of us building the hardware of this project.

In the beginning, we were using a hall sensor, but it was not as effective, so we changed to the magnetometer.

We were stuck on our I^2C LCD Screen numbers for a long time. It portrayed the wrong data (it had negative and triple-digit numbers).

Discussion

The easy part of the project was figuring out our idea and what our middle transducers would be. The planning for this was quite interesting as there were many input and output parts we could play with. We learned a lot from drawing each of the possible project schematics and finding different Arduino parts we could use. The most difficult part was the actual assembly of these parts and making them communicate with each other, especially since the temperature sensor was very sensitive and caused a lot of noise in the data and unstabilized the values. The unstable temperature values also led to difficulty in coding for the vibration motor.

Hands-on experience is the fastest way to learn something. After completing this project, we not only learned about Arduino parts that we never knew before but also essential concepts for wiring, such as using external batteries and power sources for parts that needed more than 5 volts. Getting stuck on writing the code and then solving the problems, helped us to remember how to problem-solve with Arduino and better prepare us for similar future problems.

If we were able to do this project again, we would have changed the temperature sensor to another mechanism because it was causing us many problems and was overall not an effective transducer. We could have used a LDR (light dependent resistor) to measure the intensity of the light to trigger our vibration motor.

SCHEMATIC

Our schematic for our double transducer

CODE
  1. <span class="com">/*
  2. Title: Double Transducer: Magnetic Field to Vibration Strength
  3. Author: Hojung Kim and Patricia Yu
  4. Description: The magnetometer (input) measures the magentic strength
  5. from the distance of the magnet. This causes the light bulb (output)
  6. to light up in different ranges of brightness. Next, the temperature
  7. sensor (TMP36 - input) detects the ranges of the temperature the light
  8. bulb emits from light bulb's different brightness. The different
  9. temperature the temperature sensor detects determines the different
  10. strength of the vibration in the vibration motor.
  11. _____________________________________________________
  12. Pin mapping:
  13. pin | mode | description
  14. ------|--------|------------
  15. A1 input TMP36 - temperature sensor
  16. 09 output light bulb
  17. 05 output vibration motor
  18. _____________________________________________________
  19. Credits:
  20. Temperature Measuring and Conversion Code (Specifically for TMP36):
  21. https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor by lady ada
  22. https://www.bc-robotics.com/tutorials/using-a-tmp36-temperature-sensor-with-arduino/ by Chris at BCRobotics
  23. Magnotometer/Compass code library:
  24. QMC5883LCompass by MRPrograms
  25. I^2C LCD Screen code library:
  26. LiquidCrystal_I2C by Frank De Brabander\
  27. Classmate Meijie and Chloe for helping us decode the LCD
  28. */</span><span class="pln">
  29. </span><span class="com">//code added from library:</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"><LiquidCrystal_I2C.h></span><span class="pln">
  32. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><QMC5883LCompass.h></span><span class="pln">
  33. </span><span class="com">//LCD screen setting initialized</span><span class="pln">
  34. </span><span class="typ">LiquidCrystal_I2C</span><span class="pln"> screen</span><span class="pun">(</span><span class="lit">0x27</span><span class="pun">,</span><span class="pln"> </span><span class="lit">16</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
  35. </span><span class="kwd">int</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">123</span><span class="pun">;</span><span class="pln">
  36. QMC5883LCompass compass</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"> LIGHTBULB </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</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"> TMP36 </span><span class="pun">=</span><span class="pln"> A1</span><span class="pun">;</span><span class="pln"> </span><span class="com">//TMP36 initial temperature range 0° to 175° (0V to 1.75V)</span><span class="pln">
  39. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> VIBRATE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
  40. </span><span class="kwd">double</span><span class="pln"> voltage</span><span class="pun">;</span><span class="pln"> </span><span class="com">//The variable we will use to store temperature in degrees.</span><span class="pln">
  41. </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">// variable for timing</span><span class="pln">
  42. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> INTERVAL </span><span class="pun">=</span><span class="pln"> </span><span class="lit">200</span><span class="pun">;</span><span class="pln"> </span><span class="com">// milliseconds between updates</span><span class="pln">
  43. </span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  44. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
  45. compass</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  46. pinMode</span><span class="pun">(</span><span class="pln">LIGHTBULB</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  47. pinMode</span><span class="pun">(</span><span class="pln">TMP36</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  48. pinMode</span><span class="pun">(</span><span class="pln">VIBRATE</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  49. </span><span class="com">//Sets up the LCD Screen startup:</span><span class="pln">
  50. screen</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  51. screen</span><span class="pun">.</span><span class="pln">backlight</span><span class="pun">();</span><span class="pln">
  52. delay</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
  53. screen</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  54. screen</span><span class="pun">.</span><span class="pln">home</span><span class="pun">();</span><span class="pln">
  55. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"i:"</span><span class="pun">);</span><span class="pln">
  56. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  57. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"m:"</span><span class="pun">);</span><span class="pln">
  58. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  59. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">12</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  60. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"o:"</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"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  63. </span><span class="com">//input - compass (magnetic strength):</span><span class="pln">
  64. </span><span class="kwd">int</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  65. compass</span><span class="pun">.</span><span class="pln">read</span><span class="pun">();</span><span class="pln"> </span><span class="com">// Read compass values</span><span class="pln">
  66. x </span><span class="pun">=</span><span class="pln"> compass</span><span class="pun">.</span><span class="pln">getX</span><span class="pun">();</span><span class="pln"> </span><span class="com">// Return XYZ readings</span><span class="pln">
  67. </span><span class="com">//middle output - light (brightness):</span><span class="pln">
  68. </span><span class="kwd">int</span><span class="pln"> lightVal </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">2000</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="lit">6000</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">255</span><span class="pun">);</span><span class="pln"> </span><span class="com">//limit the range of the light to 0-255</span><span class="pln">
  69. lightVal </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">lightVal</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">255</span><span class="pun">);</span><span class="pln">
  70. analogWrite</span><span class="pun">(</span><span class="pln">LIGHTBULB</span><span class="pun">,</span><span class="pln"> lightVal</span><span class="pun">);</span><span class="pln">
  71. </span><span class="com">// middle input - temperature sensor:</span><span class="pln">
  72. </span><span class="kwd">int</span><span class="pln"> sensorInput </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">TMP36</span><span class="pun">);</span><span class="pln"> </span><span class="com">//read the analog sensor and store it</span><span class="pln">
  73. voltage </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">double</span><span class="pun">)</span><span class="pln">sensorInput </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">;</span><span class="pln"> </span><span class="com">//find percentage of input reading</span><span class="pln">
  74. voltage </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">5.0</span><span class="pun">;</span><span class="pln"> </span><span class="com">//multiply by 5V to get voltage</span><span class="pln">
  75. </span><span class="kwd">int</span><span class="pln"> temperatureC </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">voltage </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.5</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln"> </span><span class="com">//Subtract the offset and convert to degrees Celsius</span><span class="pln">
  76. </span><span class="com">//output - vibration motor:</span><span class="pln">
  77. </span><span class="kwd">int</span><span class="pln"> vibVal </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">temperatureC</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </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">255</span><span class="pun">);</span><span class="pln"> </span><span class="com">//limit the range of the light to 0-255</span><span class="pln">
  78. temperatureC </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">temperatureC</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">255</span><span class="pun">);</span><span class="pln">
  79. vibVal </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">vibVal</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">255</span><span class="pun">);</span><span class="pln">
  80. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">temperatureC </span><span class="pun">>=</span><span class="pln"> </span><span class="lit">30</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">//when the tempereature is greater than or equal to 30°C the vibration vibrates at different range</span><span class="pln">
  81. analogWrite</span><span class="pun">(</span><span class="pln">VIBRATE</span><span class="pun">,</span><span class="pln"> vibVal</span><span class="pun">);</span><span class="pln">
  82. </span><span class="pun">}</span><span class="pln">
  83. </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// when the tmeperature is anything less than 30°C it will turn off</span><span class="pln">
  84. analogWrite</span><span class="pun">(</span><span class="pln">VIBRATE</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  85. </span><span class="pun">}</span><span class="pln">
  86. </span><span class="com">// run LCD screen update procedure</span><span class="pln">
  87. </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">
  88. 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"> INTERVAL</span><span class="pun">;</span><span class="pln"> </span><span class="com">// and update timer</span><span class="pln">
  89. </span><span class="com">//limit the range of the light to 0-99</span><span class="pln">
  90. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  91. </span><span class="kwd">int</span><span class="pln"> magno </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">lightVal</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">255</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">99</span><span class="pun">);</span><span class="pln">
  92. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">magno</span><span class="pun">);</span><span class="pln">
  93. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  94. </span><span class="kwd">int</span><span class="pln"> light </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">lightVal</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">255</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">99</span><span class="pun">);</span><span class="pln">
  95. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">light</span><span class="pun">);</span><span class="pln">
  96. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  97. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">temperatureC</span><span class="pun">);</span><span class="pln">
  98. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">14</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  99. </span><span class="kwd">int</span><span class="pln"> vibration </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">vibVal</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">255</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">99</span><span class="pun">);</span><span class="pln">
  100. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">vibration</span><span class="pun">);</span><span class="pln">
  101. </span><span class="pun">}</span><span class="pln">
  102. </span><span class="pun">}</span>
<span class="com">/*
   Title: Double Transducer: Magnetic Field to Vibration Strength
   Author: Hojung Kim and Patricia Yu

   Description: The magnetometer (input) measures the magentic strength
   from the distance of the magnet. This causes the light bulb (output)
   to light up in different ranges of brightness. Next, the temperature
   sensor (TMP36 - input) detects the ranges of the temperature the light
   bulb emits from light bulb's different brightness. The different
   temperature the temperature sensor detects determines the different
   strength of the vibration in the vibration motor.
  _____________________________________________________

   Pin mapping:
   pin   | mode   | description
   ------|--------|------------
   A1     input     TMP36 - temperature sensor
   09     output    light bulb
   05     output    vibration motor
  _____________________________________________________

  Credits:
  Temperature Measuring and Conversion Code (Specifically for TMP36):
  https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor by lady ada
  https://www.bc-robotics.com/tutorials/using-a-tmp36-temperature-sensor-with-arduino/ by Chris at BCRobotics

  Magnotometer/Compass code library:
  QMC5883LCompass by MRPrograms

  I^2C LCD Screen code library:
  LiquidCrystal_I2C by Frank De Brabander\

  Classmate Meijie and Chloe for helping us decode the LCD

*/</span><span class="pln">

</span><span class="com">//code added from library:</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"><LiquidCrystal_I2C.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><QMC5883LCompass.h></span><span class="pln">

</span><span class="com">//LCD screen setting initialized</span><span class="pln">
</span><span class="typ">LiquidCrystal_I2C</span><span class="pln"> screen</span><span class="pun">(</span><span class="lit">0x27</span><span class="pun">,</span><span class="pln"> </span><span class="lit">16</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">123</span><span class="pun">;</span><span class="pln">

QMC5883LCompass compass</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"> LIGHTBULB </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"> TMP36 </span><span class="pun">=</span><span class="pln"> A1</span><span class="pun">;</span><span class="pln"> </span><span class="com">//TMP36 initial temperature range 0° to 175° (0V to 1.75V)</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> VIBRATE </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">double</span><span class="pln"> voltage</span><span class="pun">;</span><span class="pln"> </span><span class="com">//The variable we will use to store temperature in degrees.</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">// variable for timing</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> INTERVAL </span><span class="pun">=</span><span class="pln"> </span><span class="lit">200</span><span class="pun">;</span><span class="pln"> </span><span class="com">// milliseconds between updates</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">
  compass</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">LIGHTBULB</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">TMP36</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">VIBRATE</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//Sets up the LCD Screen startup:</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">backlight</span><span class="pun">();</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">);</span><span class="pln">

  screen</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">home</span><span class="pun">();</span><span class="pln">
  screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"i:"</span><span class="pun">);</span><span class="pln">

  screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"m:"</span><span class="pun">);</span><span class="pln">

  screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">

  screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">12</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"o:"</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">//input - compass (magnetic strength):</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  compass</span><span class="pun">.</span><span class="pln">read</span><span class="pun">();</span><span class="pln"> </span><span class="com">// Read compass values</span><span class="pln">
  x </span><span class="pun">=</span><span class="pln"> compass</span><span class="pun">.</span><span class="pln">getX</span><span class="pun">();</span><span class="pln"> </span><span class="com">// Return XYZ readings</span><span class="pln">

  </span><span class="com">//middle output - light (brightness):</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> lightVal </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">2000</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="lit">6000</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">255</span><span class="pun">);</span><span class="pln"> </span><span class="com">//limit the range of the light to 0-255</span><span class="pln">
  lightVal </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">lightVal</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">255</span><span class="pun">);</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="pln">LIGHTBULB</span><span class="pun">,</span><span class="pln"> lightVal</span><span class="pun">);</span><span class="pln">

  </span><span class="com">// middle input - temperature sensor:</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> sensorInput </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">TMP36</span><span class="pun">);</span><span class="pln"> </span><span class="com">//read the analog sensor and store it</span><span class="pln">
  voltage </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">double</span><span class="pun">)</span><span class="pln">sensorInput </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">;</span><span class="pln"> </span><span class="com">//find percentage of input reading</span><span class="pln">
  voltage </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">5.0</span><span class="pun">;</span><span class="pln"> </span><span class="com">//multiply by 5V to get voltage</span><span class="pln">

  </span><span class="kwd">int</span><span class="pln"> temperatureC </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">voltage </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.5</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln"> </span><span class="com">//Subtract the offset and convert to degrees Celsius</span><span class="pln">

  </span><span class="com">//output - vibration motor:</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> vibVal </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">temperatureC</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </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">255</span><span class="pun">);</span><span class="pln"> </span><span class="com">//limit the range of the light to 0-255</span><span class="pln">
  temperatureC </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">temperatureC</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">255</span><span class="pun">);</span><span class="pln">
  vibVal </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">vibVal</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">255</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">temperatureC </span><span class="pun">>=</span><span class="pln"> </span><span class="lit">30</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">//when the tempereature is greater than or equal to 30°C the vibration vibrates at different range</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="pln">VIBRATE</span><span class="pun">,</span><span class="pln"> vibVal</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// when the tmeperature is anything less than 30°C  it will turn off</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="pln">VIBRATE</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">// run LCD screen update procedure</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">
    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"> INTERVAL</span><span class="pun">;</span><span class="pln"> </span><span class="com">// and update timer</span><span class="pln">

    </span><span class="com">//limit the range of the light to 0-99</span><span class="pln">
    screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">int</span><span class="pln"> magno </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">lightVal</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">255</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">99</span><span class="pun">);</span><span class="pln">
    screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">magno</span><span class="pun">);</span><span class="pln">

    screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">int</span><span class="pln"> light </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">lightVal</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">255</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">99</span><span class="pun">);</span><span class="pln">
    screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">light</span><span class="pun">);</span><span class="pln">

    screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">temperatureC</span><span class="pun">);</span><span class="pln">

    screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">14</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">int</span><span class="pln"> vibration </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">vibVal</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">255</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">99</span><span class="pun">);</span><span class="pln">
    screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">vibration</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span>