3xmaker,人機協作共融萬物互聯,柔性可穿戴人機交互感知與測量!

  1. 設計指南
  2. |
  3. 新品速遞
  4. |
  5. 聯系我們
機器人+
傳感器+
柔性/印刷電子+
增強現實+
人機交互感知+
網站首頁
/
智造案例
/
智造

春天來了,用Arduino NANO+LED燈來體驗一次“放生螢火蟲”吧

來源:3XMaker   發布時間:2019年03月26日

Arduino NANOLED燈來體驗一次放生螢火蟲

http://www.knexny.com/UploadFiles/2019-03/20193261130026647.jpg
1 引言

筆者的出生和成長都在農村,依稀記得小的時候捉螢火蟲的事兒。每當夏季,小伙伴們都可以在草叢里捉到很多的螢火蟲,把它們放在玻璃罐里,黃綠色的光很是好看,如圖所示。為了讀大學來到城市,畢業之后便在城市定居,卻發現很少有機會能夠看到螢火蟲,很難再有小時候的樂趣了。想必很多的讀者也都懷念小時候捉螢火蟲的樂趣,下面教大家如何使用Arduino來制作一個電子螢火蟲,重新找回兒時的快樂。

本文采用Arduino NANO控制器、LED燈來實現仿生螢火蟲,Arduino控制器控制4個翠綠色的LED燈以亮滅隨機、亮度隨機、順序隨機、時間隨機的模式來模仿自然界中螢火蟲的習性。

2 原理及材料

仿生螢火蟲的系統原理圖如圖所示,4個翠綠色的LED燈的正極依次連接至Arduino NANO控制器的數字端口D3D5D6D9上,因為Arduino NANO控制器的只有數字端口35 691011具有PWM輸出功能,可以實現LED燈亮度的調節;4LED燈的負極通過排針連接至Arduino NANO控制器的GND引腳上;另外,通過4AA電池或者2CR2032紐扣電池為Arduino NANO控制器及4LED燈提供工作電壓。 需要注意的是,在實際制作中使用的是翠綠色的LED燈,而不是圖2所示的紅色LED燈,因為螢火蟲的翠綠色的燈光更加逼真。

http://www.knexny.com/UploadFiles/2019-03/20193269169708490.png
仿生螢火蟲Arduino原理圖

3列出了制作仿生螢火蟲所需要的材料及數量,按需備齊即可開始下面的制作。
http://www.knexny.com/UploadFiles/2019-03/20193267761516695.png

仿生螢火蟲材料清單

3 手工制作

第一步:將杜邦線從中間剪斷并剝線,把LED燈的負極(短引腳)引腳剪去一部分,將熱縮管剪成7mm10mm的小段,如圖4所示。

第二步:將小段的熱縮管套進剝好的杜邦線,每一根杜邦線上套一個熱縮管段,如圖所示。

http://www.knexny.com/UploadFiles/2019-03/20193264966025753.png
前期準備

http://www.knexny.com/UploadFiles/2019-03/20193261026164324.png
將熱縮管套進杜邦線上

第三步:使用電烙鐵或焊臺將黑色杜邦線與LED燈的負極焊接在一起,【注意:在焊接時不要使用過多的焊錫】;將排針上面用焊錫連接起來并焊接至藍色的杜邦線,如圖6所示。

第四步:使用尖嘴鉗將LED燈的正極引腳剪去,并使用電烙鐵或焊臺焊接至紅色的杜邦線,如圖所示。

http://www.knexny.com/UploadFiles/2019-03/20193264864208148.png
焊接好LED燈負極與黑色杜邦線及負極排線

http://www.knexny.com/UploadFiles/2019-03/20193262967790326.png
焊接好LED燈正極與紅色杜邦線

第五步:將熱風槍的溫度調至150℃左右,風量調節至較小風量。將熱縮管移至LED引腳與杜邦線的焊接處,并使用熱風槍加熱熱縮管,使熱縮管收縮,包住焊接處,如圖8所示。經過熱風槍加工之后的LED燈,如圖所示。
http://www.knexny.com/UploadFiles/2019-03/20193268596396697.png
使用熱風槍加熱熱縮管

http://www.knexny.com/UploadFiles/2019-03/20193264785289343.png
制作完畢的LED

http://www.knexny.com/UploadFiles/2019-03/20193264543057224.png
制作好的LED燈與其他材料

第六步:使用電烙鐵或焊臺將紐扣電池盒的正極(紅線)與負極(黑線)焊接至Arduino NANO控制器的5VGND引腳,如圖所示。

第七步:將制作好的LED燈的負極(黑線)連接至含有藍色杜邦線的排針上,藍色杜邦線接至Arduino NANO控制器的GND引腳,將LED燈的正極(紅線)依次接至Arduino NANO控制器的數字端口D3D5D6D9引腳上,如圖所示。

http://www.knexny.com/UploadFiles/2019-03/20193269203962065.png
將電池盒焊接至Arduino NANO控制器

http://www.knexny.com/UploadFiles/2019-03/20193265186754520.png
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控制器,可以將控制器及電池盒放置于瓶蓋下面,這會更加美觀。還可以在瓶子內放置一些綠色的絲帶,以模仿野外草叢的情況。最后,還可以選用可充電鋰電池,并使用太陽能電池來為鋰電池充電,這樣一來,白天曬曬太陽,晚上就可以享受螢火蟲的夜晚,環保健康。

 


上一篇:又忘記關煤氣爐?"e+自動關",幸福安全廚房的智能開關
下一篇:創客父愛作品:模擬NASA“太空艙”

南京合越智能,增強智造,增強感知,增強交互!

業務合作

(我們會第一時間與您聯系)

聯系方式

  1. 微信:13815863530(手機同號)
  2. QQ:38260484
  3. 3XMaker@163.com
Copyright@ 2016-2025 南京合越智能科技有限公司 蘇ICP備18068961號
主站蜘蛛池模板: 武胜县| 乐亭县| 兴安县| 蒙自县| 武夷山市| 呼图壁县| 黑山县| 和平区| 谷城县| 安岳县| 宿迁市| 鞍山市| 大厂| 梓潼县| 大兴区| 凤庆县| 陕西省| 星子县| 绥滨县| 南安市| 盐池县| 福鼎市| 盐城市| 普宁市| 和硕县| 温州市| 连江县| 万山特区| 青田县| 星子县| 永定县| 郑州市| 宜宾县| 柏乡县| 洞头县| 溧水县| 江陵县| 天柱县| 通海县| 三江| 安平县|