Overall Photos:

Aerial photo of the entire transducer setup. (Mimi)

Top View of the Project -Daniel

Description:

This double transducer converts a temperature input into a color output. The transducer measures the ambient temperature. That measurement is then converted to movement on a servo motor. The servo motor moves in the range of 0 to 180 degrees. The higher the temperature reading is the closer the motor movement will be to 180 degrees and vise versa for lower temperatures. A magnet is attached to the arm of the servo motor, so the magnet rotates as the servo arm rotates. As the magnet rotates it changes its distance from the magnetic sensor that is located nearby. The magnet is the closest to the sensor at when the servo motor is at 0 degrees and the farthest when the servo motor is at 180 degrees. The reading from the magnetic sensor is then converted to a color that is outputted on the neoPixel ring.

Final Working Videos:

(Mimi)

(Daniel)-Not worked properly

I changed the temp value in the code to show that the light changes its color depending on the temperature.

TinkerCad Simulation:

 

Detail Photos:

Wires and Arduino we used for this project.-Daniel

The magnet is taped to the servo motor arm. When the servo arm rotates the magnet rotates as well. (Mimi)

GY 271 sensor(magnetic sensor) we used for this project.-Daniel

The NeoPixel Ring is the final output of our transducer. It outputs a color based on the magnetic field detected. (Mimi)

Process Images:

Thermistor, Magnetic sensor, and Servo Motor are wired to Arduino and working. (Mimi)

The LCD and NeoPixel ring have been added and are working. The neoPixel ring only changes shades of blue and the magnetic sensor is not reading correct values yet. (Mimi)

Starting to connect each component together on the breadboard. (Started with plugging in the LCD)-Daniel

Fully assembling the components from top to operate the system. Except, the LCD and the LED did not turn at this point because the 5V and GND circuit in the breadboard was not connected correctly.-Daniel

 

 

Discussion: 

Since this project was processed remotely, the easiest part of the project was to work in Tinkercad to demonstrate the project theoretically works. When we started the Tinkercad, we faced some problems with connecting LCD and finding the neo pixel code library. However, we passed this problem smoothly by referring back to various examples provided by the web and professor. Therefore, there was no actual hardship for working this project remotely.

However, the actual hardship came up from physical construction. Mimi had a problem with not having a consistent returning value from the magnetic sensor. Daniel had a problem with connecting his LCD and magnetic sensor to his project. We both solved this problem by asking a professor or referring back to the web explanations, but it took several tries to fix our mistakes. Also, we had a problem with choosing our materials. Mimi used a thermistor to measure the temperature, while Daniel used a temperature and humidity sensor to measure the temperature. This created little difference in coding since the temperature and humidity sensor requires its specific library to work properly.

If we had worked this project by meeting physically instead of remotely, it would have been much easier to fix our mistakes since we both had a problem with different parts. We could have fixed our mistakes by talking to each other and could have prepared the complete set of the project during our presentation. If we have the next team project time, we should find a better communication method between the working team members during the physical assembly work step to reduce differences between each project.

 

Schematic:

Schematic of the actual project

 

Code Submission:

  1. <span class="com">/*
  2. * Double Transducer: Temperature to Color
  3. * Mimi Marino (mmarino) Daniel Moon (seonghym)
  4. *
  5. *
  6. * Description: The temperature sensor reads the temperature.
  7. That value is then converted to a value that will
  8. correspond to the angle that the servo motor is moved.
  9. A magnet is attached to the servo motor. As the servo
  10. moves the azimuth angle of the magnet with respect to
  11. the magnetic sensor changes. The magnetic senesor reads
  12. that azimuth angle and that value is converted to an RGB
  13. value. The neoPixel ring outputs this RGB color.
  14. *
  15. *Credit:
  16. * -HSV to RGB convertor functions
  17. * https://gist.github.com/postspectacular/2a4a8db092011c6743a7
  18. *
  19. * -Figuring out how to wire up the thermistor
  20. * https://www.circuitbasics.com/arduino-thermistor-temperature-sensor-tutorial/
  21. *
  22. * Pin mapping:
  23. *
  24. * pin | mode | description
  25. * ------|--------|------------
  26. 6 output Servo
  27. 5 output neoPixel
  28. A0 input Temp Sensor
  29. A4 I2C Magnet Sensor
  30. A5 I2C Magnet Sensor
  31. 3 ouput LCD rs
  32. 4 output LCD enable
  33. 10 output LCD d4
  34. 11 output LCD d5
  35. 12 output LCD d6
  36. 10 output LCD d7
  37. */</span><span class="pln">
  38. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><LiquidCrystal.h></span><span class="pln">
  39. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Adafruit_NeoPixel.h></span><span class="pln">
  40. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Servo.h></span><span class="pln">
  41. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><QMC5883LCompass.h></span><span class="pln">
  42. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SERVO_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">
  43. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> PIXEL_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
  44. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> TEMP_PIN </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</span><span class="pln">
  45. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> NUMPIXELS </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12</span><span class="pun">;</span><span class="pln">
  46. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MAG_PIN </span><span class="pun">=</span><span class="pln"> A4</span><span class="pun">;</span><span class="pln">
  47. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MAG_PIN1 </span><span class="pun">=</span><span class="pln"> A5</span><span class="pun">;</span><span class="pln">
  48. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> TEMP_LOW </span><span class="pun">=</span><span class="pln"> </span><span class="lit">650</span><span class="pun">;</span><span class="pln">
  49. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> TEMP_HIGH </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1023</span><span class="pun">;</span><span class="pln">
  50. </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">
  51. </span><span class="kwd">int</span><span class="pln"> temp</span><span class="pun">;</span><span class="pln">
  52. </span><span class="kwd">int</span><span class="pln"> magnetMap</span><span class="pun">;</span><span class="pln">
  53. </span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
  54. QMC5883LCompass compass</span><span class="pun">;</span><span class="pln">
  55. </span><span class="typ">Servo</span><span class="pln"> doorMotor</span><span class="pun">;</span><span class="pln">
  56. </span><span class="typ">Adafruit_NeoPixel</span><span class="pln"> pixels </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Adafruit_NeoPixel</span><span class="pun">(</span><span class="pln">NUMPIXELS</span><span class="pun">,</span><span class="pln"> PIXEL_PIN</span><span class="pun">,</span><span class="pln"> NEO_GRB </span><span class="pun">+</span><span class="pln"> NEO_KHZ800</span><span class="pun">);</span><span class="pln">
  57. </span><span class="com">//LiquidCrystal(rs, enable, d4, d5, d6, d7) </span><span class="pln">
  58. </span><span class="typ">LiquidCrystal</span><span class="pln"> lcd</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">12</span><span class="pun">,</span><span class="pln"> </span><span class="lit">13</span><span class="pun">);</span><span class="pln">
  59. </span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln">
  60. </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. </span><span class="com">//Sets OUPUT and INPUT pins</span><span class="pln">
  63. pinMode</span><span class="pun">(</span><span class="pln">SERVO_PIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  64. pinMode</span><span class="pun">(</span><span class="pln">PIXEL_PIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  65. pinMode</span><span class="pun">(</span><span class="pln">TEMP_PIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  66. doorMotor</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">SERVO_PIN</span><span class="pun">);</span><span class="pln">
  67. </span><span class="com">//Sets LCD</span><span class="pln">
  68. lcd</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</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">
  69. </span><span class="com">//Sets Neo pixel Strip</span><span class="pln">
  70. pixels</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">
  71. </span><span class="com">//initilizes the magnetic sensor</span><span class="pln">
  72. compass</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  73. </span><span class="pun">}</span><span class="pln">
  74. </span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln">
  75. </span><span class="pun">{</span><span class="pln">
  76. </span><span class="com">// only executes every 200ms</span><span class="pln">
  77. </span><span class="com">//updates the LCD, checks the temp sensor, </span><span class="pln">
  78. </span><span class="com">//updates and reads the motor position,</span><span class="pln">
  79. </span><span class="com">//reads the magnetic sensor and outputs a color</span><span class="pln">
  80. </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="lit">200</span><span class="pun">)){</span><span class="pln">
  81. </span><span class="com">//Read the temperature sensor </span><span class="pln">
  82. temp </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">TEMP_PIN</span><span class="pun">);</span><span class="pln">
  83. </span><span class="com">//Change temp sensor input into values 0-180</span><span class="pln">
  84. </span><span class="com">//650 -1023 corresponds to the varabilty of the </span><span class="pln">
  85. </span><span class="com">//sensor in my room w/o applied heat</span><span class="pln">
  86. </span><span class="kwd">int</span><span class="pln"> tempMap </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">,</span><span class="pln">TEMP_LOW</span><span class="pun">,</span><span class="pln"> TEMP_HIGH</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">180</span><span class="pun">);</span><span class="pln">
  87. doorMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">tempMap</span><span class="pun">);</span><span class="pln">
  88. </span><span class="com">//magnetic senor outputs the azimuth angle</span><span class="pln">
  89. compass</span><span class="pun">.</span><span class="pln">read</span><span class="pun">();</span><span class="pln">
  90. a </span><span class="pun">=</span><span class="pln"> compass</span><span class="pun">.</span><span class="pln">getAzimuth</span><span class="pun">();</span><span class="pln">
  91. </span><span class="com">//48 corresponds to the servo at 0 degrees</span><span class="pln">
  92. </span><span class="com">//338 corresponds to the servo at 180 degrees</span><span class="pln">
  93. magnetMap </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> </span><span class="lit">48</span><span class="pun">,</span><span class="pln"> </span><span class="lit">338</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">
  94. </span><span class="com">//makes magnetMap into value from 0.0-0.99 for </span><span class="pln">
  95. </span><span class="com">//hsv input</span><span class="pln">
  96. </span><span class="kwd">float</span><span class="pln"> h </span><span class="pun">=</span><span class="pln"> magnetMap </span><span class="pun">/</span><span class="pln"> </span><span class="lit">100.0</span><span class="pun">;</span><span class="pln">
  97. </span><span class="kwd">float</span><span class="pln"> rgb</span><span class="pun">[</span><span class="lit">3</span><span class="pun">];</span><span class="pln">
  98. </span><span class="com">// converts magnetic value 0.0-0.99 to RGB value</span><span class="pln">
  99. hsv2rgb </span><span class="pun">(</span><span class="pln">h</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="pun">.</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> rgb</span><span class="pun">);</span><span class="pln">
  100. </span><span class="com">//Changes the color of NeoPixel Strip</span><span class="pln">
  101. </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> NUMPIXELS</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  102. pixels</span><span class="pun">.</span><span class="pln">setPixelColor</span><span class="pun">(</span><span class="pln">i</span><span class="pun">,</span><span class="pln">rgb</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]*</span><span class="lit">255</span><span class="pun">,</span><span class="pln">rgb</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]*</span><span class="lit">255</span><span class="pun">,</span><span class="pln">rgb</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]*</span><span class="lit">255</span><span class="pun">);</span><span class="pln">
  103. pixels</span><span class="pun">.</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
  104. </span><span class="pun">}</span><span class="pln">
  105. </span><span class="com">// maps current values to 0 to 99 for display</span><span class="pln">
  106. </span><span class="kwd">int</span><span class="pln"> disTemp</span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">,</span><span class="pln"> TEMP_LOW</span><span class="pun">,</span><span class="pln"> TEMP_HIGH</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">
  107. </span><span class="kwd">int</span><span class="pln"> disMotor </span><span class="pun">=</span><span class="pln"> map </span><span class="pun">(</span><span class="pln">doorMotor</span><span class="pun">.</span><span class="pln">read</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">180</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">
  108. </span><span class="com">// updates the LCD with corresponding values </span><span class="pln">
  109. </span><span class="com">// in correct places</span><span class="pln">
  110. lcd</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  111. lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  112. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"i:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> disTemp</span><span class="pun">);</span><span class="pln">
  113. lcd</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="lit">0</span><span class="pun">);</span><span class="pln">
  114. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"m:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> disMotor</span><span class="pun">);</span><span class="pln">
  115. lcd</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="lit">1</span><span class="pun">);</span><span class="pln">
  116. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">magnetMap</span><span class="pun">);</span><span class="pln">
  117. lcd</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="lit">1</span><span class="pun">);</span><span class="pln">
  118. </span><span class="com">//technically the color output but we map the magent</span><span class="pln">
  119. </span><span class="com">//sensor 0-99 and use that directly to compute the RGB value</span><span class="pln">
  120. </span><span class="com">//so the math would be the inverse so it make sense to just </span><span class="pln">
  121. </span><span class="com">//display the magnet map value becayse the inverse math functions </span><span class="pln">
  122. </span><span class="com">//would produce the same value</span><span class="pln">
  123. lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"o:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> magnetMap</span><span class="pun">);</span><span class="pln">
  124. </span><span class="com">// updates the timer</span><span class="pln">
  125. timer </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">();</span><span class="pln">
  126. </span><span class="pun">}</span><span class="pln">
  127. </span><span class="pun">}</span><span class="pln">
  128. </span><span class="com">// from https://gist.github.com/postspectacular/2a4a8db092011c6743a7</span><span class="pln">
  129. </span><span class="com">// expects hsv channels defined in 0.0-1.0 interval</span><span class="pln">
  130. </span><span class="com">//helps to convert HSV values to RBG values for the neopixel strip</span><span class="pln">
  131. </span><span class="kwd">float</span><span class="pln"> fract</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">-</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">(</span><span class="pln">x</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
  132. </span><span class="kwd">float</span><span class="pln"> mix</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> t</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">b </span><span class="pun">-</span><span class="pln"> a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> t</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
  133. </span><span class="kwd">float</span><span class="pun">*</span><span class="pln"> hsv2rgb</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> h</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> s</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pun">*</span><span class="pln"> RBG</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  134. RBG</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> b </span><span class="pun">*</span><span class="pln"> mix</span><span class="pun">(</span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">abs</span><span class="pun">(</span><span class="pln">fract</span><span class="pun">(</span><span class="pln">h </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">6.0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">3.0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">),</span><span class="pln"> s</span><span class="pun">);</span><span class="pln">
  135. RBG</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> b </span><span class="pun">*</span><span class="pln"> mix</span><span class="pun">(</span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">abs</span><span class="pun">(</span><span class="pln">fract</span><span class="pun">(</span><span class="pln">h </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.6666666</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">6.0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">3.0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">),</span><span class="pln"> s</span><span class="pun">);</span><span class="pln">
  136. RBG</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> b </span><span class="pun">*</span><span class="pln"> mix</span><span class="pun">(</span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">abs</span><span class="pun">(</span><span class="pln">fract</span><span class="pun">(</span><span class="pln">h </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.3333333</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">6.0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">3.0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">),</span><span class="pln"> s</span><span class="pun">);</span><span class="pln">
  137. </span><span class="kwd">return</span><span class="pln"> RBG</span><span class="pun">;</span><span class="pln">
  138. </span><span class="pun">}</span>
<span class="com">/*
* Double Transducer: Temperature to Color
* Mimi Marino (mmarino) Daniel Moon (seonghym)
*
*
* Description: The temperature sensor reads the temperature.
    That value is then converted to a value that will
    correspond to the angle that the servo motor is moved. 
    A magnet is attached to the servo motor. As the servo
    moves the azimuth angle of the magnet with respect to 
    the magnetic sensor changes. The magnetic senesor reads
    that azimuth angle and that value is converted to an RGB 
    value. The neoPixel ring outputs this RGB color. 
*
*Credit: 
*   -HSV to RGB convertor functions 
*   https://gist.github.com/postspectacular/2a4a8db092011c6743a7 
*   
*   -Figuring out how to wire up the thermistor 
*   https://www.circuitbasics.com/arduino-thermistor-temperature-sensor-tutorial/
    
*
* Pin mapping:
*
* pin   | mode   | description
* ------|--------|------------
  6      output   Servo
  5      output   neoPixel
  A0     input    Temp Sensor
  A4     I2C      Magnet Sensor
  A5     I2C      Magnet Sensor
  3      ouput    LCD rs
  4      output   LCD enable
  10     output   LCD d4
  11     output   LCD d5
  12     output   LCD d6
  10     output   LCD d7
*/</span><span class="pln">

</span><span class="com">#include</span><span class="pln"> </span><span class="str"><LiquidCrystal.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><Adafruit_NeoPixel.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><Servo.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><QMC5883LCompass.h></span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> SERVO_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">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"> PIXEL_PIN </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"> TEMP_PIN </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"> NUMPIXELS </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MAG_PIN </span><span class="pun">=</span><span class="pln"> A4</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"> MAG_PIN1 </span><span class="pun">=</span><span class="pln"> A5</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"> TEMP_LOW </span><span class="pun">=</span><span class="pln"> </span><span class="lit">650</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"> TEMP_HIGH </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1023</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="kwd">int</span><span class="pln"> temp</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> magnetMap</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">

QMC5883LCompass compass</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Servo</span><span class="pln"> doorMotor</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Adafruit_NeoPixel</span><span class="pln"> pixels </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Adafruit_NeoPixel</span><span class="pun">(</span><span class="pln">NUMPIXELS</span><span class="pun">,</span><span class="pln"> PIXEL_PIN</span><span class="pun">,</span><span class="pln"> NEO_GRB </span><span class="pun">+</span><span class="pln"> NEO_KHZ800</span><span class="pun">);</span><span class="pln">
</span><span class="com">//LiquidCrystal(rs, enable, d4, d5, d6, d7) </span><span class="pln">
</span><span class="typ">LiquidCrystal</span><span class="pln"> lcd</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">12</span><span class="pun">,</span><span class="pln"> </span><span class="lit">13</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">
   </span><span class="com">//Sets OUPUT and INPUT pins</span><span class="pln">
   pinMode</span><span class="pun">(</span><span class="pln">SERVO_PIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
   pinMode</span><span class="pun">(</span><span class="pln">PIXEL_PIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
   pinMode</span><span class="pun">(</span><span class="pln">TEMP_PIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
   doorMotor</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">SERVO_PIN</span><span class="pun">);</span><span class="pln">
   
   </span><span class="com">//Sets LCD</span><span class="pln">
   lcd</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">16</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
   
   </span><span class="com">//Sets Neo pixel Strip</span><span class="pln">
   pixels</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">
  
   </span><span class="com">//initilizes the magnetic sensor</span><span class="pln">
   compass</span><span class="pun">.</span><span class="pln">init</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">// only executes every 200ms</span><span class="pln">
  </span><span class="com">//updates the LCD, checks the temp sensor, </span><span class="pln">
  </span><span class="com">//updates and reads the motor position,</span><span class="pln">
  </span><span class="com">//reads the magnetic sensor and outputs a color</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="lit">200</span><span class="pun">)){</span><span class="pln">
    
  </span><span class="com">//Read the temperature sensor </span><span class="pln">
  temp </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">TEMP_PIN</span><span class="pun">);</span><span class="pln">
  
  </span><span class="com">//Change temp sensor input into values 0-180</span><span class="pln">
  </span><span class="com">//650 -1023 corresponds to the varabilty of the </span><span class="pln">
  </span><span class="com">//sensor in my room w/o applied heat</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> tempMap </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">,</span><span class="pln">TEMP_LOW</span><span class="pun">,</span><span class="pln"> TEMP_HIGH</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">180</span><span class="pun">);</span><span class="pln">
  doorMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">tempMap</span><span class="pun">);</span><span class="pln">  

  </span><span class="com">//magnetic senor outputs the azimuth angle</span><span class="pln">
  compass</span><span class="pun">.</span><span class="pln">read</span><span class="pun">();</span><span class="pln">
  a </span><span class="pun">=</span><span class="pln"> compass</span><span class="pun">.</span><span class="pln">getAzimuth</span><span class="pun">();</span><span class="pln">

  </span><span class="com">//48 corresponds to the servo at 0 degrees</span><span class="pln">
  </span><span class="com">//338 corresponds to the servo at 180 degrees</span><span class="pln">
  magnetMap </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> </span><span class="lit">48</span><span class="pun">,</span><span class="pln"> </span><span class="lit">338</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">
  
  </span><span class="com">//makes magnetMap into value from 0.0-0.99 for </span><span class="pln">
  </span><span class="com">//hsv input</span><span class="pln">
  </span><span class="kwd">float</span><span class="pln"> h </span><span class="pun">=</span><span class="pln"> magnetMap </span><span class="pun">/</span><span class="pln"> </span><span class="lit">100.0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">float</span><span class="pln"> rgb</span><span class="pun">[</span><span class="lit">3</span><span class="pun">];</span><span class="pln">
  </span><span class="com">// converts magnetic value 0.0-0.99 to RGB value</span><span class="pln">
  hsv2rgb </span><span class="pun">(</span><span class="pln">h</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="pun">.</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> rgb</span><span class="pun">);</span><span class="pln">
  
  </span><span class="com">//Changes the color of NeoPixel Strip</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> NUMPIXELS</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      pixels</span><span class="pun">.</span><span class="pln">setPixelColor</span><span class="pun">(</span><span class="pln">i</span><span class="pun">,</span><span class="pln">rgb</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]*</span><span class="lit">255</span><span class="pun">,</span><span class="pln">rgb</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]*</span><span class="lit">255</span><span class="pun">,</span><span class="pln">rgb</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]*</span><span class="lit">255</span><span class="pun">);</span><span class="pln">
      pixels</span><span class="pun">.</span><span class="pln">show</span><span class="pun">();</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">    
  
  </span><span class="com">// maps current values to 0 to 99 for display</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> disTemp</span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">,</span><span class="pln"> TEMP_LOW</span><span class="pun">,</span><span class="pln"> TEMP_HIGH</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">
  </span><span class="kwd">int</span><span class="pln"> disMotor </span><span class="pun">=</span><span class="pln"> map </span><span class="pun">(</span><span class="pln">doorMotor</span><span class="pun">.</span><span class="pln">read</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">180</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">
  
  </span><span class="com">// updates the LCD with corresponding values </span><span class="pln">
  </span><span class="com">// in correct places</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pun">);</span><span class="pln"> 
  lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"i:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> disTemp</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">6</span><span class="pun">,</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"m:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> disMotor</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">magnetMap</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">12</span><span class="pun">,</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  </span><span class="com">//technically the color output but we map the magent</span><span class="pln">
  </span><span class="com">//sensor 0-99 and use that directly to compute the RGB value</span><span class="pln">
  </span><span class="com">//so the math would be the inverse so it make sense to just </span><span class="pln">
  </span><span class="com">//display the magnet map value becayse the inverse math functions </span><span class="pln">
  </span><span class="com">//would produce the same value</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"o:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> magnetMap</span><span class="pun">);</span><span class="pln">
  
  </span><span class="com">// updates the timer</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><span class="pln"> 

</span><span class="com">// from https://gist.github.com/postspectacular/2a4a8db092011c6743a7</span><span class="pln">
</span><span class="com">// expects hsv channels defined in 0.0-1.0 interval</span><span class="pln">
</span><span class="com">//helps to convert HSV values to RBG values for the neopixel strip</span><span class="pln">
</span><span class="kwd">float</span><span class="pln"> fract</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">-</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">(</span><span class="pln">x</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="kwd">float</span><span class="pln"> mix</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> t</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">b </span><span class="pun">-</span><span class="pln"> a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> t</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="kwd">float</span><span class="pun">*</span><span class="pln"> hsv2rgb</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> h</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> s</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pun">*</span><span class="pln"> RBG</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RBG</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> b </span><span class="pun">*</span><span class="pln"> mix</span><span class="pun">(</span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">abs</span><span class="pun">(</span><span class="pln">fract</span><span class="pun">(</span><span class="pln">h </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">6.0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">3.0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">),</span><span class="pln"> s</span><span class="pun">);</span><span class="pln">
  RBG</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> b </span><span class="pun">*</span><span class="pln"> mix</span><span class="pun">(</span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">abs</span><span class="pun">(</span><span class="pln">fract</span><span class="pun">(</span><span class="pln">h </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.6666666</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">6.0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">3.0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">),</span><span class="pln"> s</span><span class="pun">);</span><span class="pln">
  RBG</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> b </span><span class="pun">*</span><span class="pln"> mix</span><span class="pun">(</span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">abs</span><span class="pun">(</span><span class="pln">fract</span><span class="pun">(</span><span class="pln">h </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.3333333</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">6.0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">3.0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">),</span><span class="pln"> s</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> RBG</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span>