Arduino - 光敏電阻 + 矩陣LED (photocell + matrix LED)


目的:

以光敏電阻去感應亮度,讓矩陣LED呈現的樹有三段變化且有落葉效果(以光合作用強不強烈作為構想)

圖的變化:


成果:


Arduino Code:

  1. #include < SPI.h >
  2. int LDR = 0; //光敏電阻輸入,接在anallog pin 0
  3. int readLDR = 0; //光敏電阻感應到的光源產生的電阻值
  4.  
  5. unsigned char i;
  6. unsigned char j;
  7. /*port definition*/
  8. int Max7219_pinCLK = 10;
  9. int Max7219_pinCS = 9;
  10. int Max7219_pinDIN = 8;
  11.  
  12. unsigned char symbol[12][8] = {
  13. {
  14. 0xFF,
  15. 0x3C,
  16. 0x3C,
  17. 0x3C,
  18. 0x54,
  19. 0x92,
  20. 0x29,
  21. 0x44
  22. }, // 接收光最少的樹
  23.  
  24. {
  25. 0xFF,
  26. 0x3C,
  27. 0x3C,
  28. 0x3C,
  29. 0x3C,
  30. 0x3C,
  31. 0x7E,
  32. 0xFF
  33. }, // 接受光尚可的樹
  34. {
  35. 0xFF,
  36. 0x3C,
  37. 0x3C,
  38. 0x3C,
  39. 0x3C,
  40. 0x7E,
  41. 0xFF,
  42. 0xFF
  43. },
  44. {
  45. 0xFF,
  46. 0x3C,
  47. 0x3C,
  48. 0x3C,
  49. 0x7E,
  50. 0xBD,
  51. 0x7E,
  52. 0xFF
  53. },
  54. {
  55. 0xFF,
  56. 0x3C,
  57. 0x3C,
  58. 0x7E,
  59. 0xBD,
  60. 0x3C,
  61. 0x7E,
  62. 0xFF
  63. },
  64. {
  65. 0xFF,
  66. 0x3C,
  67. 0x7E,
  68. 0xBD,
  69. 0x3C,
  70. 0x3C,
  71. 0x7E,
  72. 0xFF
  73. },
  74. {
  75. 0xFF,
  76. 0x7E,
  77. 0xBD,
  78. 0x3C,
  79. 0x3C,
  80. 0x3C,
  81. 0x7E,
  82. 0xFF
  83. },
  84. {
  85. 0xFF,
  86. 0xBD,
  87. 0x3C,
  88. 0x3C,
  89. 0x3C,
  90. 0x3C,
  91. 0x7E,
  92. 0xFF
  93. },
  94.  
  95. {
  96. 0xFF,
  97. 0x3C,
  98. 0x3C,
  99. 0x3C,
  100. 0xFF,
  101. 0xFF,
  102. 0xFF,
  103. 0xFF
  104. }, // 接收光最多的樹
  105. {
  106. 0xFF,
  107. 0x3C,
  108. 0x7E,
  109. 0xBD,
  110. 0xFF,
  111. 0xFF,
  112. 0xFF,
  113. 0xFF
  114. },
  115. {
  116. 0xFF,
  117. 0x7E,
  118. 0xBD,
  119. 0x3C,
  120. 0xFF,
  121. 0xFF,
  122. 0xFF,
  123. 0xFF
  124. },
  125. {
  126. 0xFF,
  127. 0xBD,
  128. 0x3C,
  129. 0x3C,
  130. 0xFF,
  131. 0xFF,
  132. 0xFF,
  133. 0xFF
  134. }
  135. };
  136.  
  137. //下面的function是因為點矩陣是吃byte,先轉成byte再寫入
  138. void Write_Max7219_byte(unsigned char DATA) {
  139. unsigned char i;
  140. digitalWrite(Max7219_pinCS, LOW);
  141. for (i = 8; i >= 1; i--) {
  142. digitalWrite(Max7219_pinCLK, LOW);
  143. //Obtain the MSB of the data
  144. digitalWrite(Max7219_pinDIN, DATA & 0x80);
  145. DATA = DATA << 1;
  146. digitalWrite(Max7219_pinCLK, HIGH);
  147. }
  148. }
  149.  
  150. //腳位確定
  151. void Write_Max7219(unsigned char address, unsigned char dat) {
  152. digitalWrite(Max7219_pinCS, LOW);
  153. Write_Max7219_byte(address); //
  154. Write_Max7219_byte(dat); //
  155. digitalWrite(Max7219_pinCS, HIGH);
  156. }
  157.  
  158. void Init_MAX7219(void) {
  159. Write_Max7219(0x09, 0x00); //decode: BCD
  160. Write_Max7219(0x0a, 0x03); //Brightness
  161. Write_Max7219(0x0b, 0x07); //
  162. Write_Max7219(0x0c, 0x01); //
  163. Write_Max7219(0x0f, 0x00); //
  164. for (byte i = 0; i < 8; i++) {
  165. Write_Max7219(i + 1, 0);
  166. }
  167. }
  168.  
  169. //下面是做初始設定
  170. void setup() {
  171. pinMode(Max7219_pinCLK, OUTPUT);
  172. pinMode(Max7219_pinCS, OUTPUT);
  173. pinMode(Max7219_pinDIN, OUTPUT);
  174. delay(50);
  175. Init_MAX7219();
  176. Serial.begin(9600);
  177. }
  178.  
  179. //下面是做持續的光源大小判斷,進而控制矩陣LED
  180. void loop() {
  181. readLDR = analogRead(LDR); //存取光敏電阻的電阻值
  182. Serial.println(readLDR);
  183. if (readLDR <= 100) //光線最亮的時候
  184. {
  185. for (byte i = 0; i < 8; i++)
  186. Write_Max7219(i + 1, symbol[8][i]); //樹和落葉動畫效果
  187. delay(500);
  188. for (byte i = 0; i < 8; i++)
  189. Write_Max7219(i + 1, symbol[9][i]); //樹和落葉動畫效果
  190. delay(500);
  191. for (byte i = 0; i < 8; i++)
  192. Write_Max7219(i + 1, symbol[10][i]); //樹和落葉動畫效果
  193. delay(500);
  194. for (byte i = 0; i < 8; i++)
  195. Write_Max7219(i + 1, symbol[11][i]); //樹和落葉動畫效果
  196. delay(500);
  197.  
  198. }
  199. else if (readLDR > 100 && readLDR <= 200) //光線尚可的時候
  200. {
  201. for (byte i = 0; i < 8; i++)
  202. Write_Max7219(i + 1, symbol[1][i]); //樹和落葉動畫效果
  203. delay(500);
  204. for (byte i = 0; i < 8; i++)
  205. Write_Max7219(i + 1, symbol[2][i]); //樹和落葉動畫效果
  206. delay(500);
  207. for (byte i = 0; i < 8; i++)
  208. Write_Max7219(i + 1, symbol[3][i]); //樹和落葉動畫效果
  209. delay(500);
  210. for (byte i = 0; i < 8; i++)
  211. Write_Max7219(i + 1, symbol[4][i]); //樹和落葉動畫效果
  212. delay(500);
  213. for (byte i = 0; i < 8; i++)
  214. Write_Max7219(i + 1, symbol[5][i]); //樹和落葉動畫效果
  215. delay(500);
  216. for (byte i = 0; i < 8; i++)
  217. Write_Max7219(i + 1, symbol[6][i]); //樹和落葉動畫效果
  218. delay(500);
  219. for (byte i = 0; i < 8; i++)
  220. Write_Max7219(i + 1, symbol[7][i]); //樹和落葉動畫效果
  221. delay(500);
  222. }
  223. else //光線不足的時候
  224. {
  225. for (byte i = 0; i < 8; i++) {
  226. Write_Max7219(i + 1, symbol[0][i]); //顯示只有樹枝的樹
  227. }
  228. delay(500);
  229. }
  230. }

留言