熱門資訊
春天來了,用Arduino NANO+LED燈來體驗一次“放生螢火蟲”吧
來源:3XMaker 發布時間:2019年03月26日用Arduino NANO+LED燈來體驗一次“放生螢火蟲”吧
1 引言
筆者的出生和成長都在農村,依稀記得小的時候捉螢火蟲的事兒。每當夏季,小伙伴們都可以在草叢里捉到很多的螢火蟲,把它們放在玻璃罐里,黃綠色的光很是好看,如圖所示。為了讀大學來到城市,畢業之后便在城市定居,卻發現很少有機會能夠看到螢火蟲,很難再有小時候的樂趣了。想必很多的讀者也都懷念小時候捉螢火蟲的樂趣,下面教大家如何使用Arduino來制作一個電子螢火蟲,重新找回兒時的快樂。
本文采用Arduino NANO控制器、LED燈來實現仿生螢火蟲,Arduino控制器控制4個翠綠色的LED燈以亮滅隨機、亮度隨機、順序隨機、時間隨機的模式來模仿自然界中螢火蟲的習性。
2 原理及材料
仿生螢火蟲的系統原理圖如圖所示,4個翠綠色的LED燈的正極依次連接至Arduino NANO控制器的數字端口D3、D5、D6、D9上,因為Arduino NANO控制器的只有數字端口3、5、 6、9、10和11具有PWM輸出功能,可以實現LED燈亮度的調節;4個LED燈的負極通過排針連接至Arduino NANO控制器的GND引腳上;另外,通過4個AA電池或者2個CR2032紐扣電池為Arduino NANO控制器及4個LED燈提供工作電壓。 需要注意的是,在實際制作中使用的是翠綠色的LED燈,而不是圖2所示的紅色LED燈,因為螢火蟲的翠綠色的燈光更加逼真。
仿生螢火蟲Arduino原理圖
圖3列出了制作仿生螢火蟲所需要的材料及數量,按需備齊即可開始下面的制作。
仿生螢火蟲材料清單
3 手工制作
第一步:將杜邦線從中間剪斷并剝線,把LED燈的負極(短引腳)引腳剪去一部分,將熱縮管剪成7mm~10mm的小段,如圖4所示。
第二步:將小段的熱縮管套進剝好的杜邦線,每一根杜邦線上套一個熱縮管段,如圖所示。
前期準備
將熱縮管套進杜邦線上
第三步:使用電烙鐵或焊臺將黑色杜邦線與LED燈的負極焊接在一起,【注意:在焊接時不要使用過多的焊錫】;將排針上面用焊錫連接起來并焊接至藍色的杜邦線,如圖6所示。
第四步:使用尖嘴鉗將LED燈的正極引腳剪去,并使用電烙鐵或焊臺焊接至紅色的杜邦線,如圖所示。
焊接好LED燈負極與黑色杜邦線及負極排線
焊接好LED燈正極與紅色杜邦線
第五步:將熱風槍的溫度調至150℃左右,風量調節至較小風量。將熱縮管移至LED引腳與杜邦線的焊接處,并使用熱風槍加熱熱縮管,使熱縮管收縮,包住焊接處,如圖8所示。經過熱風槍加工之后的LED燈,如圖所示。
使用熱風槍加熱熱縮管
制作完畢的LED燈
制作好的LED燈與其他材料
第六步:使用電烙鐵或焊臺將紐扣電池盒的正極(紅線)與負極(黑線)焊接至Arduino NANO控制器的5V和GND引腳,如圖所示。
第七步:將制作好的LED燈的負極(黑線)連接至含有藍色杜邦線的排針上,藍色杜邦線接至Arduino NANO控制器的GND引腳,將LED燈的正極(紅線)依次接至Arduino NANO控制器的數字端口D3、D5、D6、D9引腳上,如圖所示。
將電池盒焊接至Arduino NANO控制器
將LED燈連接至Arduino NANO控制器
4 Arduino程序設計
4 .1 數目隨機和隨機順序
首先,通過隨機數以獲得點亮LED燈的數目,然后再通過隨機數以獲取LED燈點亮的順序,并且通過隨機數來獲得點亮的時間。程序代碼如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | int randNumber; int delaytime;
void setup() { pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(9, OUTPUT); Serial.begin(9600); randomSeed(analogRead(0)); } void delay_time(void){ delaytime = random(1,5); switch(delaytime){ case 1:delay(800); break; case 2:delay(900); break; case 3:delay(1000); break; case 4:delay(1100); break; } }
void RandLED_2(void) { randNumber = random(1,5); Serial.println(randNumber); switch(randNumber) { case 1: analogWrite(3, 255); analogWrite(5, 255); delay_time(); digitalWrite(3, LOW); delay_time(); digitalWrite(5, LOW); break; case 2: analogWrite(6, 255); analogWrite(9, 255); delay_time(); digitalWrite(6, LOW); delay_time(); digitalWrite(9, LOW); break; case 3: analogWrite(3, 255); analogWrite(9, 255); delay_time(); digitalWrite(3, LOW); delay_time(); digitalWrite(9, LOW); break; case 4: analogWrite(5, 255); analogWrite(9, 255); delay_time(); digitalWrite(5, LOW); delay_time(); digitalWrite(9, LOW); break; case 5: analogWrite(3, 255); analogWrite(6, 255); delay_time(); digitalWrite(6, LOW); delay_time(); digitalWrite(3, LOW); break; case 6: analogWrite(5, 255); analogWrite(6, 255); delay_time(); digitalWrite(6, LOW); delay_time(); digitalWrite(5, LOW); break; } } void RandLED_3(void) { randNumber = random(1,5); Serial.println(randNumber); switch(randNumber) { case 1: analogWrite(5,255); analogWrite(6,255); analogWrite(9,255); delay_time(); digitalWrite(5, LOW); delay_time(); digitalWrite(9, LOW); delay_time(); digitalWrite(6, LOW); break; case 2: analogWrite(6,255); analogWrite(3,255); analogWrite(9,255); delay_time(); digitalWrite(9, LOW); delay_time(); digitalWrite(3, LOW); delay_time(); digitalWrite(6, LOW); break; case 3: analogWrite(5,255); analogWrite(3,255); analogWrite(9,255); delay_time(); digitalWrite(9, LOW); delay_time(); digitalWrite(5, LOW); delay_time(); digitalWrite(3, LOW); break; case 4: analogWrite(5,255); analogWrite(6,255); analogWrite(3,255); delay_time(); digitalWrite(3, LOW); delay_time(); digitalWrite(5, LOW); delay_time(); digitalWrite(6, LOW); break; } } void RandLED_4(void) { randNumber = random(1,5); Serial.println(randNumber); switch(randNumber) { case 1: analogWrite(3,255); analogWrite(5,255); analogWrite(6,255); analogWrite(9,255); delay_time(); digitalWrite(3, LOW); delay_time(); digitalWrite(5, LOW); delay_time(); digitalWrite(6, LOW); delay_time(); digitalWrite(9, LOW); break; case 2: analogWrite(3,255); analogWrite(5,255); analogWrite(6,255); analogWrite(9,255); delay_time(); digitalWrite(3, LOW); delay_time(); digitalWrite(6, LOW); delay_time(); digitalWrite(9, LOW); delay_time(); digitalWrite(5, LOW); break; case 3: analogWrite(3,255); analogWrite(5,255); analogWrite(6,255); analogWrite(9,255); delay_time(); digitalWrite(9, LOW); delay_time(); digitalWrite(3, LOW); delay_time(); digitalWrite(5, LOW); delay_time(); digitalWrite(6, LOW); break; case 4: analogWrite(3,255); analogWrite(5,255); analogWrite(6,255); analogWrite(9,255); delay_time(); digitalWrite(6, LOW); delay_time(); digitalWrite(9, LOW); delay_time(); digitalWrite(3, LOW); delay_time(); digitalWrite(5, LOW); break; } }
void loop() { randNumber = random(1,4); switch(randNumber){ case 1:RandLED_2(); break; case 2:RandLED_3(); break; case 3:RandLED_4(); break; } } |
4 .2 添加隨機亮度和優化點亮時間
首先,通過隨機數以獲得點亮LED燈的數目,然后再通過隨機數以獲取LED燈的亮度值,將LED燈全部點亮,然后通過隨機數來獲得點亮的時間按照順序來依次熄滅LED燈。程序代碼如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 | int randNumber; int pwm,delaytime;
void setup() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); Serial.begin(9600); randomSeed(analogRead(0)); } void delay_time_2(void){ delaytime = random(1,5); switch(delaytime){ case 1:delay(1000); break; case 2:delay(1250); break; case 3:delay(1500); break; case 4:delay(1250); break; } }
void delay_time_3(void){ delaytime = random(1,5); switch(delaytime){ case 1:delay(1000); break; case 2:delay(1250); break; case 3:delay(1500); break; case 4:delay(1000); break; } }
void delay_time_4(void){ delaytime = random(1,5); switch(delaytime){ case 1:delay(800); break; case 2:delay(1000); break; case 3:delay(900); break; case 4:delay(700); break; } }
int pwm_value(void){ int pwmvalue; pwmvalue = random(1,5); switch(pwmvalue){ case 1: return 255 ; break; case 2: return 180; break; case 3: return 110; break; case 4: return 40; break; } } void RandLED_2(void) { randNumber = random(1,5); Serial.println(randNumber); switch(randNumber) { case 1: pwm=pwm_value(); analogWrite(5, pwm); analogWrite(6, pwm); delay_time_2(); digitalWrite(5, LOW); delay_time_2(); digitalWrite(6, LOW); break; case 2: pwm=pwm_value(); analogWrite(5, pwm); analogWrite(10, pwm); delay_time_2(); digitalWrite(5, LOW); delay_time_2(); digitalWrite(10, LOW); break; case 3: pwm=pwm_value(); analogWrite(5, pwm); analogWrite(11, pwm); delay_time_2(); digitalWrite(5, LOW); delay_time_2(); digitalWrite(11, LOW); break; case 4: pwm=pwm_value(); analogWrite(6, pwm); analogWrite(10, pwm); delay_time_2(); digitalWrite(6, LOW); delay_time_2(); digitalWrite(10, LOW); break; case 5: pwm=pwm_value(); analogWrite(6, pwm); analogWrite(11, pwm); delay_time_2(); digitalWrite(6, LOW); delay_time_2(); digitalWrite(11, LOW); break; case 6: pwm=pwm_value(); analogWrite(10, pwm); analogWrite(11, pwm); delay_time_2(); digitalWrite(6, LOW); delay_time_2(); digitalWrite(11, LOW); break; } } void RandLED_3(void) { randNumber = random(1,5); Serial.println(randNumber); switch(randNumber) { case 1: pwm=pwm_value(); analogWrite(5, pwm); analogWrite(6, pwm); analogWrite(10, pwm); delay_time_3(); digitalWrite(5, LOW); delay_time_3(); digitalWrite(10, LOW); delay_time_3(); digitalWrite(6, LOW); break; case 2: pwm=pwm_value(); analogWrite(6, pwm); analogWrite(10, pwm); analogWrite(11, pwm); delay_time_3(); digitalWrite(6, LOW); delay_time_3(); digitalWrite(10, LOW); delay_time_3(); digitalWrite(11, LOW); break; case 3: pwm=pwm_value(); analogWrite(5, pwm); analogWrite(10, pwm); analogWrite(11, pwm); delay_time_3(); digitalWrite(10, LOW); delay_time_3(); digitalWrite(5, LOW); delay_time_3(); digitalWrite(11, LOW); break; case 4: pwm=pwm_value(); analogWrite(5, pwm); analogWrite(6, pwm); analogWrite(11, pwm); delay_time_3(); digitalWrite(6, LOW); delay_time_3(); digitalWrite(5, LOW); delay_time_3(); digitalWrite(11, LOW); break; } } void RandLED_4(void) { randNumber = random(1,5); Serial.println(randNumber); switch(randNumber) { case 1: pwm=pwm_value(); analogWrite(5, pwm); analogWrite(6, pwm); analogWrite(10, pwm); analogWrite(11, pwm); delay_time_4(); digitalWrite(6, LOW); delay_time_4(); digitalWrite(10, LOW); delay_time_4(); digitalWrite(5, LOW); delay_time_4(); digitalWrite(11, LOW); break; case 2: pwm=pwm_value(); analogWrite(5, pwm); analogWrite(6, pwm); analogWrite(10, pwm); analogWrite(11, pwm); delay_time_4(); digitalWrite(10, LOW); delay_time_4(); digitalWrite(6, LOW); delay_time_4(); digitalWrite(11, LOW); delay_time_4(); digitalWrite(5, LOW); break; case 3: pwm=pwm_value(); analogWrite(5, pwm); analogWrite(6, pwm); analogWrite(10, pwm); analogWrite(11, pwm); delay_time_4(); digitalWrite(6, LOW); delay_time_4(); digitalWrite(11, LOW); delay_time_4(); digitalWrite(5, LOW); delay_time_4(); digitalWrite(10, LOW); break; case 4: pwm=pwm_value(); analogWrite(5, pwm); analogWrite(6, pwm); analogWrite(10, pwm); analogWrite(11, pwm); delay_time_4(); digitalWrite(11, LOW); delay_time_4(); digitalWrite(10, LOW); delay_time_4(); digitalWrite(6, LOW); delay_time_4(); digitalWrite(5, LOW); break; } }
void loop() { randNumber = random(1,4); Serial.println(randNumber); switch(randNumber){ case 1:RandLED_2(); break; case 2:RandLED_3(); break; case 3:RandLED_4(); break;
}
} |
5 總結
為了更好的仿真螢火蟲的發光習性,可以將所有可能發光的情況都列舉出來,并通過隨機數來篩選本次執行的情況。另外,通過選擇Microduino替代Arduino NANO控制器,可以將控制器及電池盒放置于瓶蓋下面,這會更加美觀。還可以在瓶子內放置一些綠色的絲帶,以模仿野外草叢的情況。最后,還可以選用可充電鋰電池,并使用太陽能電池來為鋰電池充電,這樣一來,白天曬曬太陽,晚上就可以享受螢火蟲的夜晚,環保健康。

南京合越智能,增強智造,增強感知,增強交互!
業務合作
(我們會第一時間與您聯系)聯系方式
- 微信:13815863530(手機同號)
- QQ:38260484
- 3XMaker@163.com