Simple narrative description

When the dial turns fast, the LED gets brighter. When the LED gets brighter, the light sensor pushes more electricity into the system. When there is more electricity in the system, the motor blade turns closer to the edge of the board. Since the magnet is attached to the motor blade, it also moves closer to the edge of the board, creating a stronger magnetic field.

Overall project mounted onto a 10’’ by 10’’ chipboard.

ROTARY ENCODER: This device is manually attached to the ervo and takes in the position whenever it turns. The Arduino then calculates the velocity of the rotation inside the code.

LED + PHOTORESITOR The Arduino transmits the velocity values into the LED. The LED then produces the relative amount of light. The photoresitor’s resistance then changes based on the amount of light detected from the LED.

SERVO MOTOR: The Arduino transmits values from the photoresistor. This device then changes its degree position according to the resistor values.

Three progress images

Work in progress of magnetic field output

Initially, we tried to pass current through a coil that contained a nail. It was difficult to read the magnetic output from this setup, so we eventually scrapped it.

Work in progress

We tested a magnet wrapped with a coil and struggled to detect magnetic field changes when we powered the coil.

Work in progress of the device

At this stage, we could read the motor speed, but the LED was not properly responding to PWM commands.

Discussion

Designing the overall system was relatively easy, as there was little ambiguity in understanding the high level overview of how data is translated from one transducer to the other. However, debugging unexpected errors that came up in every step of the “building” process required us to think of the problem from multiple angles. For instance, when we first worked with the rotary encoder, the position values inputted into the Arduino were not timely enough to calculate the rotation speed. Only after editing the velocity formula, scouring through the web for other methods to read rotation speed, and rechecking the circuit for any errors, we found out our solution through careful reading of the library documentation: input pins should be plugged into pins with interrupt capability for optimal performance. Such finding was only possible by giving ourselves enough time and flexibility to understand the mishap from multiple angles, rather than falling into a state of panic with no clear solution in mind. 

The biggest learning from this project was that the root of certain problems often come from places that we weren’t even aware of. For instance, our photoresistor and LCD display gave erroneous values that simply did not comply with the system that we had built up. We gave bandaid solutions to these problems by fixing the range of each input on the software, which helped little in tackling the issue. However, we realized after talking to Zach that the issue was caused by the photoresistor pin being plugged into the same circuit as the LCD Display (A4, which is connected to SVA/SCL). At that point, we were both frustrated that such a seemingly small issue had caused us such a big struggle. However, I am glad that we encountered the issue through this project, as the connection of SVA/SCL to A4/A5 will forever be embedded in our memories for future projects to come. 

Overall, creative problem solving was critical to the success of the project. Iterating upon each step in a bite sized manner, rather than building up the whole circuit first and trying to understand where the problem points were, allowed us to develop thoughtful problem solving skills. While this project took a much longer time than we had initially anticipated, I hope this sets a good foundation for next projects to be more smooth sailing.

Schematic

Schematic of the circuit wiring

Code

  1. <span class="com">/*
  2. * Project 1: Rotation speed --> LED brightness --> magnetic field strength
  3. * Abel Tesfaye (atesfaye) and Elizabeth Han (yoonjuh)
  4. *
  5. * Collaboration: We used some code from the sample encoder library
  6. * to figure out how to read the rotary encoder position.
  7. *
  8. * Challenge: We accidentally used A4/A5 while we had the display
  9. * plugged into SVA/SCL. This caused weird interactions because A4 is wired to SVA
  10. * and A5 is wired to SCL.
  11. *
  12. * Next time: We will be more careful about which pins we are using on the
  13. * arduino
  14. *
  15. * Description: This code reads the rotary encoder input position and calculates the speed
  16. * of the turning encoder head. It also converts the speed into the brightness value
  17. * for the led. It then reads the led brightness value
  18. * with a photoresistor. The code also filters the detected brightness to make it
  19. * more smooth. Finally, the filitered brightness is mapped to the hobby motor such
  20. * that higher brightness means more motor turning. The main loop runs 10 times a second.
  21. * The LCD screen is updated twice a second.
  22. *
  23. * Pin mapping:
  24. *
  25. * pin | mode | description
  26. * ------|--------|------------
  27. * 2 input rotary encoder input 1
  28. * 3 input rotary encoder input 2
  29. * 6 output led output
  30. * A0 input photoreistor input pin
  31. * A1 output servo output pin
  32. * SDA output LCD display pin
  33. * SCL output LCD display pin
  34. *
  35. */</span><span class="pln">
  36. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Encoder.h></span><span class="pln">
  37. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Wire.h></span><span class="pln">
  38. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Servo.h></span><span class="pln">
  39. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><LiquidCrystal_I2C.h></span><span class="pln">
  40. </span><span class="typ">Encoder</span><span class="pln"> myEnc</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln">
  41. </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">
  42. </span><span class="typ">Servo</span><span class="pln"> myLittleMotor</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"> LEDPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</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"> PHOTORESITORPIN </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"> SERVOTPIN </span><span class="pun">=</span><span class="pln"> A1</span><span class="pun">;</span><span class="pln">
  46. </span><span class="kwd">long</span><span class="pln"> oldPosition </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">999</span><span class="pun">;</span><span class="pln">
  47. </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">
  48. </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">500</span><span class="pun">;</span><span class="pln"> </span><span class="com">// milliseconds between updates</span><span class="pln">
  49. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> PREV_WEIGHT </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.8</span><span class="pun">;</span><span class="pln">
  50. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> CUR_WEIGHT </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> PREV_WEIGHT</span><span class="pun">;</span><span class="pln">
  51. </span><span class="kwd">float</span><span class="pln"> filtered_brightness </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  52. </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">
  53. </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">
  54. </span><span class="typ">Wire</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">
  55. screen</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  56. screen</span><span class="pun">.</span><span class="pln">backlight</span><span class="pun">();</span><span class="pln">
  57. pinMode</span><span class="pun">(</span><span class="pln">PHOTORESITORPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  58. myLittleMotor</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">SERVOTPIN</span><span class="pun">);</span><span class="pln">
  59. </span><span class="pun">}</span><span class="pln">
  60. </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">
  61. </span><span class="kwd">long</span><span class="pln"> newPosition </span><span class="pun">=</span><span class="pln"> myEnc</span><span class="pun">.</span><span class="pln">read</span><span class="pun">();</span><span class="pln">
  62. </span><span class="kwd">float</span><span class="pln"> speed </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">newPosition </span><span class="pun">-</span><span class="pln"> oldPosition</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">.</span><span class="lit">01</span><span class="pun">;</span><span class="pln">
  63. </span><span class="com">//cap speed at 9000</span><span class="pln">
  64. </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">speed </span><span class="pun">></span><span class="pln"> </span><span class="lit">9000</span><span class="pun">)</span><span class="pln"> speed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9000</span><span class="pun">;</span><span class="pln">
  65. </span><span class="kwd">int</span><span class="pln"> mappedSpeed </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">speed</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">9000</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">
  66. oldPosition </span><span class="pun">=</span><span class="pln"> newPosition</span><span class="pun">;</span><span class="pln">
  67. </span><span class="kwd">int</span><span class="pln"> led </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">mappedSpeed</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="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
  68. </span><span class="kwd">int</span><span class="pln"> mappedLed </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">led</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">
  69. analogWrite</span><span class="pun">(</span><span class="pln">LEDPIN</span><span class="pun">,</span><span class="pln"> led</span><span class="pun">);</span><span class="pln">
  70. </span><span class="kwd">int</span><span class="pln"> brightness </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">PHOTORESITORPIN</span><span class="pun">);</span><span class="pln">
  71. </span><span class="com">//filter/smooth the detected brightness value</span><span class="pln">
  72. filtered_brightness </span><span class="pun">=</span><span class="pln"> filtered_brightness </span><span class="pun">*</span><span class="pln"> PREV_WEIGHT </span><span class="pun">+</span><span class="pln"> brightness </span><span class="pun">*</span><span class="pln"> CUR_WEIGHT</span><span class="pun">;</span><span class="pln">
  73. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">filtered_brightness</span><span class="pun">);</span><span class="pln">
  74. </span><span class="kwd">int</span><span class="pln"> mappedBrightness </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">filtered_brightness</span><span class="pun">,</span><span class="pln"> </span><span class="lit">70</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">
  75. </span><span class="kwd">int</span><span class="pln"> motor </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">mappedBrightness</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">60</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">
  76. </span><span class="kwd">int</span><span class="pln"> mappedMotor </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">motor</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">
  77. myLittleMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">motor</span><span class="pun">);</span><span class="pln">
  78. </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">
  79. </span><span class="com">// set cursor to home position, i.e. the upper left corner</span><span class="pln">
  80. screen</span><span class="pun">.</span><span class="pln">home</span><span class="pun">();</span><span class="pln">
  81. screen</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  82. 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">
  83. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">mappedSpeed</span><span class="pun">);</span><span class="pln">
  84. 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">
  85. 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">
  86. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">mappedLed</span><span class="pun">);</span><span class="pln">
  87. 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">
  88. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">mappedBrightness</span><span class="pun">);</span><span class="pln">
  89. 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">
  90. 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">
  91. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">mappedMotor</span><span class="pun">);</span><span class="pln">
  92. 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">
  93. </span><span class="pun">}</span><span class="pln">
  94. delay</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">
  95. </span><span class="pun">}</span>
<span class="com">/*
 * Project 1: Rotation speed --> LED brightness --> magnetic field strength
 * Abel Tesfaye (atesfaye) and Elizabeth Han (yoonjuh)
 *
 * Collaboration: We used some code from the sample encoder library
 * to figure out how to read the rotary encoder position.
 * 
 * Challenge: We accidentally used A4/A5 while we had the display
 * plugged into SVA/SCL. This caused weird interactions because A4 is wired to SVA
 * and A5 is wired to SCL.
 * 
 * Next time: We will be more careful about which pins we are using on the
 * arduino
 * 
 * Description: This code reads the rotary encoder input position and calculates the speed
 * of the turning encoder head. It also converts the speed into the brightness value 
 * for the led. It then reads the led brightness value
 * with a photoresistor. The code also filters the detected brightness to make it
 * more smooth. Finally, the filitered brightness is mapped to the hobby motor such 
 * that higher brightness means more motor turning. The main loop runs 10 times a second.
 * The LCD screen is updated twice a second.
 * 
 * Pin mapping:
 * 
 * pin   | mode   | description
 * ------|--------|------------
 * 2      input     rotary encoder input 1   
 * 3      input     rotary encoder input 2  
 * 6      output    led output
 * A0     input     photoreistor input pin
 * A1     output    servo output pin
 * SDA    output    LCD display pin
 * SCL    output    LCD display pin
 * 
 */</span><span class="pln">

</span><span class="com">#include</span><span class="pln"> </span><span class="str"><Encoder.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"><Servo.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="typ">Encoder</span><span class="pln"> myEnc</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</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="typ">Servo</span><span class="pln"> myLittleMotor</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"> LEDPIN </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"> PHOTORESITORPIN </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"> SERVOTPIN </span><span class="pun">=</span><span class="pln"> A1</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">long</span><span class="pln"> oldPosition  </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">999</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">// 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">500</span><span class="pun">;</span><span class="pln"> </span><span class="com">// milliseconds between updates</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> PREV_WEIGHT </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.8</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> CUR_WEIGHT </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> PREV_WEIGHT</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">float</span><span class="pln"> filtered_brightness </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">Wire</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">
  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">

  pinMode</span><span class="pun">(</span><span class="pln">PHOTORESITORPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">

  myLittleMotor</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">SERVOTPIN</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="kwd">long</span><span class="pln"> newPosition </span><span class="pun">=</span><span class="pln"> myEnc</span><span class="pun">.</span><span class="pln">read</span><span class="pun">();</span><span class="pln">

  </span><span class="kwd">float</span><span class="pln"> speed </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">newPosition </span><span class="pun">-</span><span class="pln"> oldPosition</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">.</span><span class="lit">01</span><span class="pun">;</span><span class="pln">
  </span><span class="com">//cap speed at 9000</span><span class="pln">
  </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">speed </span><span class="pun">></span><span class="pln"> </span><span class="lit">9000</span><span class="pun">)</span><span class="pln"> speed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9000</span><span class="pun">;</span><span class="pln">
  
  </span><span class="kwd">int</span><span class="pln"> mappedSpeed </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">speed</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">9000</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">
  
  
  oldPosition </span><span class="pun">=</span><span class="pln"> newPosition</span><span class="pun">;</span><span class="pln">

  </span><span class="kwd">int</span><span class="pln"> led </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">mappedSpeed</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="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">int</span><span class="pln"> mappedLed </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">led</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">

  analogWrite</span><span class="pun">(</span><span class="pln">LEDPIN</span><span class="pun">,</span><span class="pln"> led</span><span class="pun">);</span><span class="pln">
  

  </span><span class="kwd">int</span><span class="pln"> brightness </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">PHOTORESITORPIN</span><span class="pun">);</span><span class="pln">
  </span><span class="com">//filter/smooth the detected brightness value</span><span class="pln">
  filtered_brightness </span><span class="pun">=</span><span class="pln"> filtered_brightness </span><span class="pun">*</span><span class="pln"> PREV_WEIGHT </span><span class="pun">+</span><span class="pln"> brightness </span><span class="pun">*</span><span class="pln"> CUR_WEIGHT</span><span class="pun">;</span><span class="pln">
  
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">filtered_brightness</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> mappedBrightness </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">filtered_brightness</span><span class="pun">,</span><span class="pln"> </span><span class="lit">70</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">
  </span><span class="kwd">int</span><span class="pln"> motor </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">mappedBrightness</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">60</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="kwd">int</span><span class="pln"> mappedMotor </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">motor</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">

  myLittleMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">motor</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">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">
    </span><span class="com">// set cursor to home position, i.e. the upper left corner</span><span class="pln">
    screen</span><span class="pun">.</span><span class="pln">home</span><span class="pun">();</span><span class="pln">
    screen</span><span class="pun">.</span><span class="pln">clear</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="kwd">print</span><span class="pun">(</span><span class="pln">mappedSpeed</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="kwd">print</span><span class="pun">(</span><span class="pln">mappedLed</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">mappedBrightness</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">
    screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">mappedMotor</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="pun">}</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span>