-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
620 lines (297 loc) · 155 KB
/
search.xml
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
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>毕设Week8</title>
<link href="/2024/04/10/%E6%AF%95%E8%AE%BEWeek8/"/>
<url>/2024/04/10/%E6%AF%95%E8%AE%BEWeek8/</url>
<content type="html"><![CDATA[<h1 id="毕设作品及论文进度报告"><a href="#毕设作品及论文进度报告" class="headerlink" title="毕设作品及论文进度报告"></a>毕设作品及论文进度报告</h1><p>目前毕设作品从整个体系来讲主要是还缺少云数据上传和处理分析。</p><p>论文整体框架已经完成 欠缺云数据部分内容 硬件原理图 更多参考文献</p><h2 id="问题日志:"><a href="#问题日志:" class="headerlink" title="问题日志:"></a>问题日志:</h2><p>1.根据实验发现当3.3V接到USB转TTL时,ESP01S在串口助手端无法正常工作,只有接5V才能成功。</p><p>2.当我使用ESP01S打算连接WIFI时发现屡次报错 显示代码为:4 根据手册反应是连接失败 当我多次浏览网络发现 还需要RST一次才能成功</p><p>3.对于单独使用ESP01S+串口助手利用MQTT协议将数据发送给云平台的情况时可能会出现AT指令部分失败的情况。解决方法大多为重新上电,重新开启热点,重新RST.</p><h2 id="云数据部分原理:"><a href="#云数据部分原理:" class="headerlink" title="云数据部分原理:"></a>云数据部分原理:</h2><p><strong>单片机</strong>(Arduino)<通过串口><strong>ESP8266-01S</strong><MQTT协议><strong>云平台</strong><><strong>其他应用</strong></p><p>以阿里云物联网示例来说:</p><p>对于云数据的原理其为:</p><p>1.对ESP8266-01S(在后文中将其用ESP01S代替)烧录MQTT穿透固件</p><p>2.通过ESP01S+USB转TTL接口,在烧录了固件后,其ESP01S可以通过MQTT协议利用WIFI向Web端发送数据,而其中需要用到AT指令来实现这一目的。</p><p>3.对于这一部分连接WIFI的方式,主要有由AT指令完成,将ESP01S设置成station模式后,便可以连接热点,再通过AT指令连接到指定的热点。</p><p>4.设置MQTT:这部分主要是需要利用阿里云的三个参数设置,同样也是发送AT指令</p><p>5.订阅主题的AT指令和发布主题的AT指令</p><p>6.最后能够在Web端看到通过AT指令发送的数据。</p><h2 id="Arduino与ESP8266-01S之间的串口通信"><a href="#Arduino与ESP8266-01S之间的串口通信" class="headerlink" title="Arduino与ESP8266-01S之间的串口通信"></a>Arduino与ESP8266-01S之间的串口通信</h2><h3 id="接线:在ESP01S中只需要利用八个引脚中的五个:GND-VCC-TX-RX-EN"><a href="#接线:在ESP01S中只需要利用八个引脚中的五个:GND-VCC-TX-RX-EN" class="headerlink" title="接线:在ESP01S中只需要利用八个引脚中的五个:GND.VCC.TX.RX.EN."></a>接线:在ESP01S中只需要利用八个引脚中的五个:GND.VCC.TX.RX.EN.</h3><p><strong>在这里有一点与之前ESP01S和USB转TTL模块不一样的是只能给电源接3.3V,否则会烧坏Wi-Fi模块</strong></p><p>在这里因为我们的Arduino Uno只有一个硬件串行端口,这个端口通常被用来与Arduino IDE的串口监视器进行通信,用于调试和上传代码。同时由于在项目中还有其他的一些模块为了避免调试信息与设备通信间的干扰,所以我们利用Arduino自带的<strong>SoftwareSerial库</strong>,去定义<strong>两个软串口</strong>,创建一个虚拟的串行端口。</p><table><thead><tr><th>Arduino Uno</th><th><strong>ESP8266 WiFi</strong></th></tr></thead><tbody><tr><td>GND</td><td>GND</td></tr><tr><td>3.3V</td><td>3.3V</td></tr><tr><td>RX(3)</td><td>TX</td></tr><tr><td>TX(2)</td><td>RX</td></tr><tr><td>3.3V</td><td>EN</td></tr></tbody></table><p>如果线路正常,则ESP01S会是先蓝灯闪烁,然后红灯闪亮,表示进入WIFI搜索模式</p><p>如果通电后,灯不亮、蓝灯、红灯一直亮的情况,同时AT指令不生效,则需要再次排查电路。</p><p>当硬件接线无误后,对于在IDE部分的代码为:</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><SoftwareSerial.h></span></span></span><br><span class="line"><span class="function">SoftwareSerial <span class="title">mySerial</span><span class="params">(<span class="number">3</span>, <span class="number">2</span>)</span></span>; <span class="comment">// RX, TX 配置 3、2 为软串口</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line"> Serial.<span class="built_in">println</span>(<span class="string">"ESP8266 WIFI Test"</span>);</span><br><span class="line"> <span class="keyword">while</span> (!Serial) {</span><br><span class="line"> ;</span><br><span class="line"> }</span><br><span class="line"> Serial.<span class="built_in">println</span>(<span class="string">"hardware serial!"</span>);</span><br><span class="line"> mySerial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line"> mySerial.<span class="built_in">println</span>(<span class="string">"software seria"</span>);</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span> (mySerial.<span class="built_in">available</span>())</span><br><span class="line"> {</span><br><span class="line"> Serial.<span class="built_in">write</span>(mySerial.<span class="built_in">read</span>());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (Serial.<span class="built_in">available</span>()) {</span><br><span class="line"> mySerial.<span class="built_in">write</span>(Serial.<span class="built_in">read</span>());</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>在这一份代码中设置了两个串口通信路径,通过软件串口和硬件串口可以实现数据的双向传输,使得Arduino能够与其他设备如ESP8266 WIFI模块等进行通信。</strong></p><p>例如<code>mySerial.println("software serial")</code> 这行代码将文本 “software serial” 发送到连接到软串口的设备,这里是 ESP8266。通过定义的软串口(使用引脚3作为TX),这行代码实际上是通过Arduino的指定引脚发送数据到ESP8266或其他连接的设备。这可以用于初始化通信、发送命令或者发送数据等操作。</p><p>在这里WIFI模块发送给 Arduino UNO 板的打印信息出现了乱码,是因为软串口(i/o 模拟出来)所能支持的波特率有限,最大支持 9600。</p><p>当这一切完成后则可以在串口监视行通过发送AT指令进行检查。当成功收到AT指令的时候都会返回OK</p><h3 id="AT指令方面"><a href="#AT指令方面" class="headerlink" title="AT指令方面"></a>AT指令方面</h3><p>1.测试</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AT</span><br></pre></td></tr></table></figure><p>2.进入Station模式</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AT+CWMODE=1</span><br></pre></td></tr></table></figure><p>3.连接AP</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AT+CWJAP="thisisvain","Kawhiway2020*"</span><br></pre></td></tr></table></figure><p>4.重置</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AT+RST</span><br></pre></td></tr></table></figure><p>5.设置MQTT用户属性</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AT+MQTTUSERCFG=0,1,"a18y2D7vxpD.test|securemode=2\,signmethod=hmacsha256\,timestamp=1713271027174|","test&a18y2D7vxpD","230f92aabefeab302d44649e582f69fcea8541f2220664ce1664a31092799cbe",0,0,""</span><br></pre></td></tr></table></figure><p>6.连接 MQTT Broker</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AT+MQTTCONN=0,"a18y2D7vxpD.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1</span><br></pre></td></tr></table></figure><p>(注意:<strong>在这一个AT指令中常常会返回+MQTTDISCONNECTED:0 ERROR</strong>,其原因是使用AT+MQTTCONN命令时,断开连接或者主动连接失败都会返回+MQTTDISCONNECTED:<LinkID> 错误内容。)</p><p>主要的原因是物联平台配置工具生成的PASSWORD不正确!</p><p>其正确的做法是:</p><p>①在建立好阿里云物联网平台的物理模型后,将设备的三元组复制到物联平台配置工具中</p><p>②Cilentld 随便填,5位;TimeStamp不要填!!!,不然生成密码有误!!!</p><p>③再将生成的密码等参数重新进行MQTT AT测试。然后你就会发现,此时WIFI模块可以正常连接云服务器了;</p><p>但是在这里我利用的方法是多次断开热点、重新上电、重新RST。</p><p>7.订阅 MQTT Topic</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AT+MQTTSUB=0,"/sys/a18y2D7vxpD/test/thing/event/property/post_reply",1</span><br></pre></td></tr></table></figure><p>8.发布 MQTT 消息(字符串)</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AT+MQTTPUB=0,"/sys/a18y2D7vxpD/test/thing/event/property/post","{\"method\":\"thing.event.property.post\"\,\"params\":{\"Smoke\":200\,\"face\":1\,\"Buzzer\":1}}",0,0</span><br></pre></td></tr></table></figure><h3 id="Web网页:"><a href="#Web网页:" class="headerlink" title="Web网页:"></a>Web网页:</h3><p>最后通过AT指令的方式,则可以在网页端显示出上传的数据。</p><p>由于目前我测试的时候使用的阿里云物联网平台,现在已经取消了自带的APP功能,目前可以实现其功能的是阿里云另一个飞燕平台,其原理是类似的。</p>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>毕设Week7</title>
<link href="/2024/03/11/%E6%AF%95%E8%AE%BEWeek7/"/>
<url>/2024/03/11/%E6%AF%95%E8%AE%BEWeek7/</url>
<content type="html"><![CDATA[<h1 id="问题日志"><a href="#问题日志" class="headerlink" title="问题日志"></a>问题日志</h1><p>很抱歉 自从上一次更新毕设进度后现在拖了整整一个月之多 一方面是在解决如何更好地处理好人脸识别这部分的问题和将数据上传到云平台端的方案 另一方面更多的是自从过了年后经历了<strong>吃席和放纵后整个人意志简直大大地被摧毁了</strong> 目前我只希望在17号之前把初稿写完并且把整个硬件雏形给解决</p><p>当然在整个二月期间 我并不是什么都没有做 但是整个过程都在靠自己不断地调试代码 但是老是不能解决问题 我很绝望 具体问题表现在 <strong>无法将摄像头识别成果的结果实时反馈给显示屏端</strong> </p><p>我的代码能力不算强 每次调试的过程中 还不能长时间开启摄像头模组 它会出现时间长过载的情况 又要重新等 这就是最头疼的</p><p><strong>问题一</strong>:在之前的时候 我会将Arduino自带的串行端口与电脑通信,同时还会继续使用K210摄像头模块通信,两者的波特率都是115200. 这一点从理论上可以运行 <strong>但是我忽略了UNO这个版本的Arduino只有一个硬件串行端口</strong> 只能利用软件串行来模拟额外的串行通信端口 但是软件串行可能无法可靠地在高波特率上工作</p><p><strong>问题二:</strong>在为了K210的判断结果进行给一个反馈值给Arduino后然后令其输出对应的OLED打印结果时,这其中是否正确使用BOOL值还是个问题</p><p><strong>问题三:</strong>循环问题,对于整个OLED的打印结果是否应该直接给在k210的判断中</p><p><strong>问题四:</strong>当环境光亮不足时,人脸识别会出现无法检测的情况,这个时候需要手动补光</p><p><strong>问题五</strong>:如果将VCC直接接5V在Arduino上时可能会出现电压不稳的情况,选择VIN更好</p><p><strong>问题六:</strong>03/27更新,经过反思和总结,我认为这项任务的突破点在于理解k210的AI模型中,每一行代码所起的作用,才能根据其获取的信息,将信息通过串口的方法反馈给Arduino端</p><p><strong>补充:K210人脸识别AI模型存放在(F:\毕设\毕设参考资料\K210视觉模块\6.拓展例程(另购)\6.2 多种主控通讯教程\k210程序\K210-AI(stm32_pico_arduino))</strong></p><p><strong>问题七:03/27</strong> 通过直接检测是否能够将串口助手的信息直接发送给arduino</p><p><strong>问题八:</strong>当单独测试人脸识别例程的时候需注意如果同时开启Arduino IDE和串口助手时会在串口助手选择Arduino为串口时出现串口占用的错误,同时需要同时将K210中的RXD线同时接线。</p><p><strong>问题九:</strong>根据再次实验发现,如果只打开Arduino IDE而不使用串口助手的时候,同样在IDE的串口监视端设置好波特率后同样可以显示识别结果,那么接下来的问题是将输出结果储存进一个变量当中,最后通过OLED打印出来。</p><p><strong>问题十:</strong>如果K210和OLED都同时接Arduino的同一个VCC端口时会导致OLED电压不稳,从而字体模糊.</p><p><strong>问题十一:03/30</strong> 再次将问题放大到如何正确将人脸识别信息通过串口的方式传送给Arduino上,对于前几天测试反馈的情况是当OLED接线但是跑人脸识别基础代码的时候,IDE端可以正常打印出人脸识别结果,当结合OLED代码时则失败。目前将AI模型出的串口通信部分代码给修改,在该产品中主要是自定义了一个模块来封装串口通信,这样会更加简洁,但是我不知道这是否会导致在Arduino端与OLED相结合时出现问题,所以我将其更改会Uart通信,通过跑人脸识别基础代码发现可以在IDE端正常打印出信息。</p><p>除此之外我重新写了一部分OLED显示代码,通过串口中断执行显示,具体情况还需要在实践中才知道是否可行。</p><p>但是我还有个问题是 <strong>是否是由于官方提供的人脸识别模型代码太冗杂。</strong></p><p>根据代码判断,无论识别成功与否,都会将数据(一堆东西)发送给Arduino,再通过Arduino自己判断。或许这样也有好处。</p><p><strong>问题十二:</strong>03/31 通过在K210的main.py中更改传输的串口信息,直接在识别成功后将一个标识符传送给Arduino,不在将整个信息传输。失败 不知道具体原因当Arduino烧录进去的是新的我写的关于OLED的代码时,机器总是死机.</p><p><strong>问题十三</strong>:03/31 22:26</p><p> <strong>实验分析</strong> 由于Arduino始终在原来已经显示<strong>烟雾浓度指数</strong>的情况下显示其<strong>人脸识别情况</strong>,同时在串口监视器端无法打印出识别结果 考虑其是否由于<strong>数据占用过多</strong>的缘故 </p><p>于是<strong>注释</strong>调显示烟雾浓度指数代码后仅保留其显示人脸识别情况代码 通过再次实验发现 此时<strong>OLED会出现TRUE</strong>(即人脸识别成功的情况) 但是此时屏幕不再刷新并一直停滞(考虑可能是代码问题) 当串口端口从Arduino在USB转TTL端口间切换 即<strong>COM4和COM5</strong>之间切换的时候 同时将人像切换成其他识别不成功的情况时 此时<strong>OLED打印False</strong> </p><p>在这种情况中重复实验三次再次出现上述情况 <strong>或许是否考虑为OLED显示数据过多导致?</strong></p><p>同时对于True和False的打印每次总是停滞不再进行二次刷新的可能是否由于<strong>在循环中实际只循环了一次</strong></p><p><strong>最后解决方案:</strong>通过K210自带屏幕显示出人脸识别结果</p>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>毕设作品硬件接线备忘录</title>
<link href="/2024/01/31/%E6%AF%95%E8%AE%BE%E4%BD%9C%E5%93%81%E7%A1%AC%E4%BB%B6%E6%8E%A5%E7%BA%BF%E5%A4%87%E5%BF%98%E5%BD%95/"/>
<url>/2024/01/31/%E6%AF%95%E8%AE%BE%E4%BD%9C%E5%93%81%E7%A1%AC%E4%BB%B6%E6%8E%A5%E7%BA%BF%E5%A4%87%E5%BF%98%E5%BD%95/</url>
<content type="html"><![CDATA[<p> 以下接线说明是为了方便每一次接线实验,同时防止在实验中出现因为代码太多和硬件太多出现接线错误</p><p><strong>注意:在串口连接部分是RX->TX,TX->RX</strong></p><p><strong>蜂鸣器:I/O—>D2</strong> </p><p><strong>MQ2: AO—>A0</strong> <strong>5V电源</strong></p><p><strong>OLED: VCC=5V SCL=13 SDA=11 RES=8 DC=9 CS=10 BLK默认可以不接</strong> </p><p><strong>K210: Arduino TXD—> USB RXD Arduino GND—> USB GND/K210 GND</strong></p><p><strong>Arduino RXD—> K210 TXD Arduino VCC—>K210 5V</strong></p><p><strong>K210由于使用自启动 所以不需要额外接USB线</strong></p><p><strong>在K210中黄色线接VCC 白色线接GND 红色线接RXD</strong></p><p> </p>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>毕设Week6</title>
<link href="/2024/01/23/%E6%AF%95%E8%AE%BEWeek6/"/>
<url>/2024/01/23/%E6%AF%95%E8%AE%BEWeek6/</url>
<content type="html"><![CDATA[<h1 id="问题日志"><a href="#问题日志" class="headerlink" title="问题日志"></a>问题日志</h1><p><em>这一个周的内容就是<strong>问题日志</strong>,主要需要<strong>解决的问题</strong>是实现<strong>人脸识别</strong>功能。</em></p><p><strong>整个周的任务就是在复现人脸识别功能,以及在原有代码的程序上进行客制化,即将整个代码能够满足最后我的项目要求。</strong></p><p>由于上次和导师面谈后,现在把进度方向转到实现系统的人脸识别功能上,而这个一部分要实现的最核心基础是对原出场的人脸识别范例的实现。对于这一个范例, 尽管提供了PDF教程文件和源码,同时有着官方工程师的交流下,这么简单的工程依然无法复现。</p><p>一、PDF教程文件的粗略导致整个步骤做下来,很多操作都是缺失的和不完整的</p><p>二、工程师马虎了事,已经在把整个问题说明的很清楚的情况下,给出的建议和提示仍然无法解决问题,同时每天就是固定的回答时间,很短暂不说还有很多人在群里进行提问。</p><p>最后的最后这个这个问题又得重新回到用户的身上,得用户自己具有动手能力去解决。</p><p>所以如果不是因为为了节省钱,我肯定不会选择K210,而是选择更容易上手的OpenMV.</p><p>那么接下来只能从另外几个方面来入手看是什么问题</p><p>问题:<strong>当我把所有线接好后,Arduino板子之前烧录过一次程序,但是K210自启动后摄像头能捕捉到人脸,但是按下按键后,串口助手并不会打印出是否已经检测到人脸的信息。</strong></p><p>1.怀疑是K210中SD卡里的AI模型复制错了,因为当我重新翻阅手册的时候发现一个关键的字眼:<strong>K210-Al(stm32_pico_arduino)</strong>,但是这也不能完全怪我啊,给的资料和源码太混乱了,而且很多,有些也属于是人脸识别的代码。</p><p><strong>而这简单的复现却是充满了坎坷。</strong></p><p>更新:2024/1/24 晚上21:41出现突发新意外。</p><p>现象为:当根据之前的判断进行调整后,尝试将K210的AI模型进行切换,我先选择了将Arduino部分的串口打印代码烧录,接着完成搭线连接,这个时候屏幕自启动,再屏幕下发出现了Prompt词告诉我按下键后进行记录人脸,这个时候已经可以看到在屏幕中当人脸识别成功后方框会由白色转变为绿色(白色代表识别错误,绿色代表识别正确),同时打开串口助手后,将串口端选择为<strong>Arduino板的串口</strong>的时候,并且按照预设要求后,在命令行部分显示出识别框的横纵坐标,以及长度和宽度,同时会一并打印出判断结果,但是时间多过了一会后,<strong>屏幕中出现了不再人脸出现方框的情形,此时多次尝试reset键,以及将k210中的AI模型更换会不与Arduino结合的PY程序的时候,依然不会出现识别框,此时我陷入了沉思。</strong></p><p>而此时也只有我一个人孤军奋战,因为k210的技术部已经下班,不再回复我的消息,同时在官方提供的常见问题解决方法中,也没有出现这种情况,我不断地尝试重新进行整个实验或者通过更换例程来测试摄像头是否正常。</p><p>在<strong>晚上十点钟</strong>的时候这一切出现了转折,这个时候我试图放松并开始放起了古典音乐,试图在音乐中将自己的大脑重新活跃起来,收到启发,而这一特点是名侦探夏洛克最喜欢的方式,当我准备收拾好东西,打算在睡觉去在随便试一次的时候,奇迹发生了,<strong>摄像头正常在画面中出现了识别框</strong>,我仿佛看到了成功的喜悦,我迅速地按下记录键,此时方框再次由白色变为绿色,而此刻打开串口助手时也正常进行判断,为了证明摄像头具有人脸识别的功能,我叫来了另一个参考对象进行识别,<strong>实验显示在没有录入人脸库的情况下,其他参考对象会在屏幕中显示为白框,同时串口为打印出NO</strong>。</p><p>但是很不幸的是,不知道是因为我将摄像头举起后拉扯到杜邦线的原因还是其他原因时,此刻摄像头再次变为不在出现识别框的情况。</p><p><strong>至此我只能等待明天看是否供应商的技术能够给出回复。</strong></p><p><strong>更新:经过技术那边的回复是可能考虑为长时间不使用后超载情况的发生,那看来每次测试的时候得抓紧时间。</strong></p><p><strong>更新:由于最近忙着家里姐姐的事,进度又耽搁了几天。所以说啊最好的工作状态反而是在没有回家之前,当你回家后就会有很多事情去处理,把自己的该做的事情一拖再拖。</strong></p><h2 id="对于人脸识别部分和Arduino的协调方案"><a href="#对于人脸识别部分和Arduino的协调方案" class="headerlink" title="对于人脸识别部分和Arduino的协调方案"></a>对于人脸识别部分和Arduino的协调方案</h2><p>由于在利用k210进行人脸识别操作的项目中,主要的内容是完成从K210中的AI模型中通过按键记录下人脸后存在人脸库,通过人脸库信息与实时检测到的人脸内容进行比对,如果比对正确,会在K210的屏幕中通过由白方框变为绿方框的图像进行反馈,同时在Arduino端通过串口打印出YES,而当对比错误时,K210中的屏幕中则会通过更小的白方框进行反馈,同时在Arduino端通过串口打印NO。<strong>如果要在整个联控中,实现通过检测从K210中传输过来的有效数据的时候,将这个数据同时一并反馈给蜂鸣器和显示屏后,蜂鸣器报警,显示屏显示识别信息。</strong></p><p>而在K210官方提供的人脸识别例程中,给了我这么一个模板,让我在此基础上进行二次开发。</p><p><strong>在这其中里.c文件和.h文件则是重中之重</strong>,<code>k210_msg_deal.h</code> 文件是一个 C 语言头文件,用于定义与 K210 模块通信相关的结构和函数。这个头文件定义了一个名为 <code>msg_k210</code> 的结构体,用于存储从 K210 模块接收到的数据。这些数据包括:</p><ul><li>x, y:检测到的物体(如人脸)的横纵坐标。</li><li>w, h:检测到的物体的宽度和高度。</li><li>id:检测到的物体的标签或识别号。</li><li>class_n:例程编号,用于指示消息类型或处理程序。</li><li>msg_msg:一个字符数组,用于存储额外的有效数据。</li></ul><p>此外,文件还声明了两个函数 <code>recv_k210msg</code> 和 <code>deal_recvmsg</code>,这两个函数用于处理从 K210 接收到的消息。</p><p>而<code>k210_msg_deal.c</code> 文件包含了处理从 K210 模块接收到的消息的具体实现。这个文件实现了 <code>recv_k210msg</code> 函数,它负责接收和处理从 K210 发来的数据。</p><p>在 <code>recv_k210msg</code> 函数中,使用了几个变量来控制和跟踪消息的接收状态:</p><ul><li><code>buf_msg</code>:存储接收到的消息。</li><li><code>new_flag</code>:标记新消息的开始。</li><li><code>r_index</code>:记录当前接收到的数据的索引。</li><li><code>buf_crc</code>:用于消息的校验和。</li><li><code>tou_flag</code>、<code>len_flag</code>:分别用于标记包头和长度是否已接收。</li></ul><p>该函数首先检测消息的开始和结束标志(例如 <code>#</code>)。接着,它会对消息进行校验,并在校验成功时调用 <code>deal_recvmsg</code> 函数以进一步处理消息。</p><p><strong>其设计报警思路为:</strong></p><p><strong>当k210识别到特定人脸时且此时传感器读数阈值没有超过时,不报警;当k210识别到特定人脸且此时传感器读数阈值超过时,报警;当k210识别到人脸不在数据库中即不匹配且此时传感器读数阈值超过时,报警;当k210识别到人脸不在数据库中不匹配且传感器读数阈值也没有超过时,同样报警。</strong></p><p><em>图标如下:其中YES表示人脸识别成功或烟雾浓度过高情况,而NO表示人脸识别失败或烟雾浓度正常情况</em></p><table><thead><tr><th>人脸识别情况</th><th>烟雾浓度</th><th>报警情况</th></tr></thead><tbody><tr><td>YES</td><td>NO</td><td>NO</td></tr><tr><td>YES</td><td>YES</td><td>YES</td></tr><tr><td>NO</td><td>NO</td><td>YES</td></tr><tr><td>NO</td><td>YES</td><td>YES</td></tr></tbody></table><p>从而根据以上要求则将这部分的代码设计为:</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="comment">// 读取MQ-2传感器值并打印到串口</span></span><br><span class="line"> sensorValue = <span class="built_in">analogRead</span>(MQ2Pin);</span><br><span class="line"> Serial.<span class="built_in">print</span>(sensorValue);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 检查MQ-2传感器的值是否超过阈值</span></span><br><span class="line"> <span class="type">bool</span> mq2Alert = sensorValue > threshold;</span><br><span class="line"> <span class="type">bool</span> faceRecognized = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 从 K210 模块读取数据</span></span><br><span class="line"> <span class="keyword">if</span> (K210Serial.<span class="built_in">available</span>()) {</span><br><span class="line"> <span class="built_in">recv_k210msg</span>(K210Serial.<span class="built_in">read</span>());</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 如果接收到完整的人脸识别数据</span></span><br><span class="line"> <span class="keyword">if</span> (k210_msg.class_n == <span class="number">8</span>) {</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 检查是否识别到特定人脸</span></span><br><span class="line"> <span class="keyword">if</span> (k210_msg.id == <span class="string">'Y'</span> || k210_msg.id == <span class="string">'y'</span>) {</span><br><span class="line"> faceRecognized = <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 重置消息类型以准备接收下一个消息</span></span><br><span class="line"> k210_msg.class_n = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 根据识别到的人脸和MQ2传感器的数据决定是否报警</span></span><br><span class="line"> <span class="keyword">if</span> ((faceRecognized && mq2Alert) || (!faceRecognized)) {</span><br><span class="line"> <span class="built_in">digitalWrite</span>(buzzer, HIGH); <span class="comment">// 开启蜂鸣器报警</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, HIGH); <span class="comment">// 开启LED</span></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="built_in">digitalWrite</span>(buzzer, LOW); <span class="comment">// 关闭蜂鸣器</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, LOW); <span class="comment">// 关闭LED</span></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在这段代码中,首先读取并判断 MQ-2 传感器的读数是否超过阈值。然后,检查 K210 模块的数据以判断是否识别到特定的人脸。最后,根据要求进行的逻辑判断,来决定是否发出警报。<strong>当识别到特定人脸且传感器读数未超过阈值时,不发出警报。在其他所有情况下,均发出警报。</strong></p><p>同时在显示屏部分代码则为:</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"> ucg.<span class="built_in">clearScreen</span>();</span><br><span class="line"> ucg.<span class="built_in">setFont</span>(ucg_font_ncenB12_hr);</span><br><span class="line"> ucg.<span class="built_in">setColor</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>);</span><br><span class="line"> ucg.<span class="built_in">setPrintPos</span>(<span class="number">0</span>, <span class="number">50</span>);</span><br><span class="line"> String displayStr = <span class="string">"Smoke Level: "</span> + <span class="built_in">String</span>(sensorValue);</span><br><span class="line"> ucg.<span class="built_in">print</span>(displayStr.<span class="built_in">c_str</span>()); </span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">1000</span>); <span class="comment">// 等待一秒钟</span></span><br><span class="line"></span><br><span class="line"> ucg.<span class="built_in">setPrintPos</span>(<span class="number">0</span>, <span class="number">70</span>); <span class="comment">// 设置新的打印位置</span></span><br><span class="line"><span class="keyword">if</span> (faceRecognized) {</span><br><span class="line"> ucg.<span class="built_in">print</span>(<span class="string">"Face: YES"</span>);</span><br><span class="line">} <span class="keyword">else</span> {</span><br><span class="line"> ucg.<span class="built_in">print</span>(<span class="string">"Face: NO"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//再次延时</span></span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1000</span>);</span><br></pre></td></tr></table></figure><p><strong>至此人脸识别部分完成,在硬件方面还剩最后的云数据处理部分。</strong></p>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>Day11</title>
<link href="/2024/01/21/Day11/"/>
<url>/2024/01/21/Day11/</url>
<content type="html"><![CDATA[<h1 id="为网站继续添砖加瓦!!!"><a href="#为网站继续添砖加瓦!!!" class="headerlink" title="为网站继续添砖加瓦!!!"></a>为网站继续添砖加瓦!!!</h1><p>今天没有继续做毕设的内容,而是简单地完成了对网站的升级和维护。其主要原因是明天有事,要出门坐高铁,加上毕设关于摄像头这部分我认为只要把范例能够复现出来后,那么后面对于代码部分的更改就会更加轻松一点,这个可以等明天下高铁后继续完成</p><p>网站版本更新:新增添即刻短文功能,这个功能主要适用于有时候只想发一句话,不想添加标签、分类和单独创建一个md文件的情况,直接在就可以轻松码好字并上传!</p><p>下一步的打算是实现网站的自动部署上传文章</p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> Thoughts </tag>
</tags>
</entry>
<entry>
<title>完全图解编译原理笔记</title>
<link href="/2024/01/20/%E5%AE%8C%E5%85%A8%E5%9B%BE%E8%A7%A3%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86%E7%AC%94%E8%AE%B0/"/>
<url>/2024/01/20/%E5%AE%8C%E5%85%A8%E5%9B%BE%E8%A7%A3%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86%E7%AC%94%E8%AE%B0/</url>
<content type="html"><![CDATA[<h1 id="完全图解编译原理的一些笔记"><a href="#完全图解编译原理的一些笔记" class="headerlink" title="完全图解编译原理的一些笔记"></a>完全图解编译原理的一些笔记</h1><p>在编程语言中有两类分类是我比较模糊和难以理解的——面向过程型和面向对象型。</p><h2 id="面向过程型就是对需要执行的一系列处理的实现步骤进行定义,并在调用这一步骤的过程中推进处理。这些步骤里称为函数,子程序,程序。"><a href="#面向过程型就是对需要执行的一系列处理的实现步骤进行定义,并在调用这一步骤的过程中推进处理。这些步骤里称为函数,子程序,程序。" class="headerlink" title="面向过程型就是对需要执行的一系列处理的实现步骤进行定义,并在调用这一步骤的过程中推进处理。这些步骤里称为函数,子程序,程序。"></a><strong>面向过程型就是对需要执行的一系列处理的实现步骤进行定义,并在调用这一步骤的过程中推进处理。这些步骤里称为函数,子程序,程序。</strong></h2><p>面向过程型编程可以比作烹饪中的食谱。在这个比喻中,每一个烹饪步骤(如切菜、煮水、烹饪等)都类似于编程中的一个函数或过程。就像你会按照食谱的步骤一步步准备和烹饪食物,面向过程的编程也是按照定义好的函数和过程,一步一步执行任务来解决问题。每个函数都是一个具体的操作指南,专注于完成一个特定的任务,就像食谱中的每个步骤专注于烹饪过程的一个特定部分一样。</p><p><strong>缺点</strong>:面向过程型可以通过调用已经定义好的步骤,对已经编写好的代码加以重复利用,但是如果想要从源代码的任何位置都可以调用这些步骤,那么在编写大规模的程序时就可能会出现问题。此外当发生”弄错了调用顺序””遗漏了必要的步骤””随意地改写了数据”等问题时,要调查清楚问题产生的影响也是一件极为困难的事情。</p><h2 id="面向对象型将”数据”和”操作”集中在一起的集合被称为对象,只有事先指定的特点操作才能访问其内部的数据。"><a href="#面向对象型将”数据”和”操作”集中在一起的集合被称为对象,只有事先指定的特点操作才能访问其内部的数据。" class="headerlink" title="面向对象型将”数据”和”操作”集中在一起的集合被称为对象,只有事先指定的特点操作才能访问其内部的数据。"></a><strong>面向对象型将”数据”和”操作”集中在一起的集合被称为对象,只有事先指定的特点操作才能访问其内部的数据。</strong></h2><p>面向对象编程可以比喻为一个公司的运作方式。在这个比喻中,一个公司由不同的部门(如人力资源、财务、市场营销等)组成,这些部门就像编程中的“对象”。</p><p>每个部门(对象)都有其特定的功能(方法)和负责的数据(属性)。例如,人力资源部门负责员工信息(属性)和招聘、培训(方法)。部门之间可以相互协作,共享资源和信息,就像对象之间可以相互通信和交互。</p><p>公司的整体结构提供了一个框架,使得各部门能够协同工作,同时又保持了各自的独立性和专业性。这类似于面向对象编程中类的概念,它允许创建具有特定属性和方法的独立对象,同时也支持继承和多态,这样不同的对象可以共享和重写某些特性或行为。</p><p>总之,就像一个公司由不同的部门组成,协同工作以达到共同的目标,面向对象编程也是通过创建相互交互的对象来构建程序的。</p><p>这样可以将那些没必要让其他处理看见的数据和操作隐藏起来,只讲必要的操作公开,即可有效地地防止”使用了错误的步骤””随意地改写了数据”等问题的发生</p><h2 id="在这其中面向过程型的有:C语言,BASIC,COBOL,Fortran-Pascal等,而面向对象型的有:C-GO-Java-JavaScript-PHP-Python等"><a href="#在这其中面向过程型的有:C语言,BASIC,COBOL,Fortran-Pascal等,而面向对象型的有:C-GO-Java-JavaScript-PHP-Python等" class="headerlink" title="在这其中面向过程型的有:C语言,BASIC,COBOL,Fortran,Pascal等,而面向对象型的有:C++,GO,Java,JavaScript,PHP,Python等"></a><strong>在这其中面向过程型的有:C语言,BASIC,COBOL,Fortran,Pascal等,而面向对象型的有:C++,GO,Java,JavaScript,PHP,Python等</strong></h2><p>C语言的优点是很适合接近硬件的部分,而C++广泛的用于物联网等嵌入式设备的软件开发</p><p>C#对初学者非常友好,使用的是C++和Java相似的语法。</p><h3 id="知识点补充:关于哈希函数"><a href="#知识点补充:关于哈希函数" class="headerlink" title="知识点补充:关于哈希函数"></a>知识点补充:关于哈希函数</h3><p>在网页使用密码登录的过程中,哈希函数的作用可以通过一个比喻来理解:将哈希函数比作一个“加密信箱”。</p><p>假设你有一条重要信息(即你的密码),你需要将它安全地传递给你的朋友(即网站服务器)。为了保证信息的安全,你决定使用一个特殊的加密信箱(哈希函数)。这个信箱的特殊之处在于:</p><ol><li><p><strong>单向性</strong>:你可以把信息放入信箱并锁上(生成哈希值),但是一旦锁上,就无法从信箱中取出原始信息(非逆性)。</p></li><li><p><strong>唯一性</strong>:每次你放入相同的信息,这个信箱都会生成完全相同的加密形式(确定性)。但是,即便是非常微小的信息差异,比如一个字母的改变,信箱也会生成一个截然不同的加密形式。</p></li><li><p><strong>安全性</strong>:即使有人拿到了加密后的信息(哈希值),他们也无法知道原始信息是什么(安全性)。</p></li></ol><p> 当你通过网页登录时,你的密码被放入这个“加密信箱”(哈希函数),生成一个加密后的版本(哈希值),然后发送给服务器。服务器上存储的是你密码的加密版本,而不是原始密码。当服务器收到你的加密密码时,它会将其与存储的加密密码进行比较。如果两者匹配,就证明密码正确,而无需知道或比较原始密码。</p><p>这种方式增加了安全性,因为即使服务器被黑客入侵,黑客也只能看到加密后的密码,而非真实密码。同时,即使两个用户的原始密码相同,由于哈希函数的特性,它们在服务器上的加密形式也几乎总是不同的,这进一步提升了安全性。</p><p>使用哈希函数的一个简单例子是在Python中生成字符串的哈希值。Python提供了内置的哈希库,如<code>hashlib</code>,可以用来轻松地生成常见的哈希值,例如MD5、SHA-1、SHA-256等。下面是一个简单的示例,展示如何使用Python中的<code>hashlib</code>库来生成字符串的SHA-256哈希值:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> hashlib</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">\<span class="comment"># 要哈希的字符串</span></span><br><span class="line"></span><br><span class="line">string_to_hash = <span class="string">"hello world"</span></span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">\<span class="comment"># 使用 hashlib 创建 sha256 哈希对象</span></span><br><span class="line"></span><br><span class="line">hash_object = hashlib.sha256(string_to_hash.encode())</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">\<span class="comment"># 生成哈希值</span></span><br><span class="line"></span><br><span class="line">hash_digest = hash_object.hexdigest()</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">f"The SHA-256 hash of '<span class="subst">{string_to_hash}</span>' is: <span class="subst">{hash_digest}</span>"</span>)</span><br><span class="line"></span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>在这个示例中,我们首先导入了<code>hashlib</code>库。然后创建了一个字符串<code>string_to_hash</code>,它是我们想要哈希的内容。通过调用<code>hashlib.sha256()</code>并传入编码后的字符串,我们创建了一个SHA-256哈希对象。最后,我们调用<code>.hexdigest()</code>方法来获取哈希值的十六进制表示。</p><p>这个过程可以用于生成任何字符串的哈希值,是一种常见的哈希应用方式。在实际应用中,哈希函数通常用于数据完整性验证、安全存储(如密码)和快速数据查找等场景。</p>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 笔记 </tag>
</tags>
</entry>
<entry>
<title>嵌入式基础知识笔记V1</title>
<link href="/2024/01/12/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0V1/"/>
<url>/2024/01/12/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E7%AC%94%E8%AE%B0V1/</url>
<content type="html"><![CDATA[<h1 id="嵌入式的基础知识"><a href="#嵌入式的基础知识" class="headerlink" title="嵌入式的基础知识"></a>嵌入式的基础知识</h1><h2 id="嵌入式处理器的分类"><a href="#嵌入式处理器的分类" class="headerlink" title="嵌入式处理器的分类"></a>嵌入式处理器的分类</h2><p><strong>MCU</strong>(Micro-Controller Unit) <strong>特点</strong>:资源有限、逻辑简单、特定任务</p><p><strong>应用</strong>:家电、汽车控制系统、物联网设备</p><p><strong>DSP</strong>(Digital Signal Processor)<strong>特点</strong>:在数字信号处理方面的高效运算能力、设计数学信号(音频,图像等)处理</p><p><strong>应用</strong>:无线通信、音视频处理、雷达系统</p><p><strong>FPGA</strong>(Field-Programmable Gate Array)<strong>特点</strong>;使用前可由用户编程的集成电路。灵活性、可重构性、高实时性</p><p><strong>应用</strong>:原型设计,加速计算,仪器测控</p><p><u><strong>其中经典的MCU有:89C51、STM32、ESP32</strong></u></p><p><strong>ARM</strong>: 一家英国公司,它设计了一系列低功耗、高性能的处理器架构,授权给其他公司。通常指MCU中的一种。</p><p><strong>树莓派</strong>:每个树莓派板都包含一个芯片,其中集成了处理器、内存、输入/输出接口等组件。树莓派的SoC中包含了ARM架构的处理器核心。</p><p><strong>Arduino</strong>:是一个开源嵌入式硬件平台,用来供用户制作可交互式的嵌入式项目。</p><h2 id="硬件、软件、固件"><a href="#硬件、软件、固件" class="headerlink" title="硬件、软件、固件"></a>硬件、软件、固件</h2><p><strong>硬件=处理器(思考、支配身体)+存储器(记忆)+传感器(获取知觉)+执行器(执行动作)</strong></p><p><strong>软件=数据(知识)+可执行代码(行为逻辑)+操作系统(神经系统)</strong></p><p><strong>固件:而它则是硬件和软件的桥梁,存储在非易失性存储器中的代码和数据,用于控制硬件设备的操作和功能。通常包括控制器上运行的低级别代码,用于初始化硬件、加载操作系统或直接执行控制功能</strong></p><h2 id="典型MCU结构与功能"><a href="#典型MCU结构与功能" class="headerlink" title="典型MCU结构与功能"></a>典型MCU结构与功能</h2><p><strong>一台完整的计算机由:处理器、存储器、I/O(输入输出)组成</strong></p><h3 id="1-处理器:"><a href="#1-处理器:" class="headerlink" title="1.处理器:"></a>1.处理器:</h3><p>1.CPU:运算,控制,寄存</p><p>2.时钟>定时器>中断>看门狗</p><p>(时钟提供计时基准>定时器)>(定时器用于生成精确的时间延迟>达到设定值触发中断>响应时钟间隔>执行指定任务)>(看门狗用于监控系统运行状态,防止死锁或系统崩溃)</p><p><strong>这其中看门狗非常形象,它需要产生的指定任务定时发任务给它</strong></p><h3 id="2-存储器:"><a href="#2-存储器:" class="headerlink" title="2.存储器:"></a>2.存储器:</h3><p>ROM(只读存储器:智能读取,在出厂前写定内容,无法修改) </p><p><strong>程序启动 内核功能调用</strong></p><p>SRAM(静态随机存储器:读写速度较快,断电丢失)</p><p><strong>存储运行时临时性数据</strong></p><p>FLASH(闪存:读写速度适中,断电不丢失)</p><p><strong>存储程序代码、存储数据、存储固件</strong></p><h3 id="3-I-O(输入-输出)"><a href="#3-I-O(输入-输出)" class="headerlink" title="3.I/O(输入/输出):"></a>3.I/O(输入/输出):</h3><p><strong>而I/O口可以从外设接口和无线通信两方面来进行讲述</strong></p><h4 id="一、模拟量与数字量的概念:"><a href="#一、模拟量与数字量的概念:" class="headerlink" title="一、模拟量与数字量的概念:"></a>一、模拟量与数字量的概念:</h4><p>模拟量:语音、温度、速度、电压(<strong>连续变化的信号,在一定范围内取一切数值且可以无限细分</strong>、<strong>计算机不能直接处理</strong>)</p><p>数字量:电灯的开关、数字图像、时钟(<strong>离散的信号,在离散的信号中取值,有限的、特定的数值</strong>)</p><h4 id="二、转化"><a href="#二、转化" class="headerlink" title="二、转化"></a>二、转化</h4><p>单片机将模拟量<strong>采样量化</strong>成数字量,再通过<strong>逆量化滤波</strong>将数字量转化成模拟量</p><p>模拟量和数字量之间的转换涉及两个主要过程:模数转换(ADC)和数模转换(DAC)。</p><ol><li><p><strong>模数转换(ADC)</strong>:这是将模拟信号(连续信号)转换为数字信号(离散信号)的过程。这通常涉及以下步骤:</p><ul><li><strong>采样</strong>:在固定的时间间隔内测量模拟信号的幅度。</li><li><strong>量化</strong>:将每次采样的模拟值转换成最接近的数字级别。在这个过程中,由于数字信号的离散性质,可能会产生一些误差。</li><li><strong>编码</strong>:将量化的结果转换为二进制数。</li></ul></li><li><p><strong>数模转换(DAC)</strong>:这是将数字信号转换回模拟信号的过程。这个过程通常包括:</p><ul><li><strong>解码</strong>:将数字信号的二进制数转换为相应的模拟级别。</li><li><strong>平滑</strong>:使用模拟滤波器消除数字信号的阶梯状特征,使输出信号更加平滑,接近原始的模拟信号。</li></ul></li></ol><p>这两种转换在各种电子设备和系统中都非常重要,比如音频处理、数字通信、数据采集系统等。模数转换使我们能够以数字形式处理、存储和传输模拟信号,而数模转换则允许数字信号控制模拟设备或被模拟设备读取。</p><h4 id="三、单片机与外部"><a href="#三、单片机与外部" class="headerlink" title="三、单片机与外部"></a>三、单片机与外部</h4><h5 id="1-GPIO-通用输入-输出"><a href="#1-GPIO-通用输入-输出" class="headerlink" title="1.GPIO-通用输入/输出"></a>1.GPIO-通用输入/输出</h5><p>与外部设备进行数字通信,是连接外设和传感器的通用接口。</p><h5 id="2-PWM-脉冲宽度调制"><a href="#2-PWM-脉冲宽度调制" class="headerlink" title="2.PWM-脉冲宽度调制"></a>2.PWM-脉冲宽度调制</h5><p>用于产生模拟信号,如控制电机速度、调光LED等。</p><p>快速切换的高低电平(PWM)会被电机平均为对应占空比的比较平滑的模拟信号</p><h5 id="3-数字与模拟"><a href="#3-数字与模拟" class="headerlink" title="3.数字与模拟"></a>3.数字与模拟</h5><p>模/数转换器(ADC) 将模拟信号转换为数字形式,用于从传感器中读取模拟数据。</p><p>数/模转换器(DAC) 将数字信号转换为模拟信号,用于向执行器生成模拟输出。</p><h4 id="四、芯片与芯片(串口通信的方式)"><a href="#四、芯片与芯片(串口通信的方式)" class="headerlink" title="四、芯片与芯片(串口通信的方式)"></a>四、芯片与芯片(串口通信的方式)</h4><table><thead><tr><th></th><th>通信方式</th><th>从属关系</th><th>速度</th><th>应用</th></tr></thead><tbody><tr><td>UART-通用异步收发器</td><td>异步(时间差异)、全双工(各干各的)</td><td>点对点</td><td>20kbps-10mbps</td><td>与计算机连接,烧录调试程序</td></tr><tr><td>串行外设接口(SPI)</td><td>同步 全双工</td><td>用片选信号选择从机</td><td>≤10mbps</td><td>与存储器,屏幕连接</td></tr><tr><td>I’C总线(I’C)</td><td>同步 、半双工(说话时不能插嘴)</td><td>用地址选择从机</td><td>100kbps-3.4mbps</td><td>与各种传感器连接</td></tr></tbody></table><h4 id="五、单片机与单片机"><a href="#五、单片机与单片机" class="headerlink" title="五、单片机与单片机"></a><strong>五、单片机与单片机</strong></h4><table><thead><tr><th></th><th>通信范围</th><th>功耗要求</th><th>数据速率</th><th>设备密度</th></tr></thead><tbody><tr><td>Wi-Fi</td><td>受限</td><td>高</td><td>10mbps-1gbps</td><td>高</td></tr><tr><td>ZigBee</td><td>受限</td><td>低</td><td>s250kbps</td><td>高</td></tr><tr><td>NB-loT</td><td>广</td><td>低</td><td>≤250kbps</td><td>低</td></tr><tr><td>Bluetooth</td><td>受限</td><td>低</td><td>≤100mbps</td><td>低</td></tr><tr><td>LoRa</td><td>广</td><td>低</td><td>100bps-10kbps</td><td>低</td></tr></tbody></table>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 笔记 </tag>
</tags>
</entry>
<entry>
<title>Day10</title>
<link href="/2024/01/10/Day10/"/>
<url>/2024/01/10/Day10/</url>
<content type="html"><![CDATA[<h1 id="在库迪咖啡体验摇咖啡的四个小时"><a href="#在库迪咖啡体验摇咖啡的四个小时" class="headerlink" title="在库迪咖啡体验摇咖啡的四个小时"></a>在库迪咖啡体验摇咖啡的四个小时</h1><h2 id="CLEAN-IS-EVERYTHING"><a href="#CLEAN-IS-EVERYTHING" class="headerlink" title="CLEAN IS EVERYTHING!"></a>CLEAN IS EVERYTHING!</h2><p>直到现在我的双脚依然在很疲惫,而我的双手充满了消毒水的味道</p><p>真的 做的最多的事情不是制作咖啡(反而是他们的清洁工作) 制作并不难 只要记熟了就简单 但是每次总是要去打泡后清洗</p><p>哎 今天真实体会到了实践出真知 只有好好读书 才能不用做那么痛苦的体力活</p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> Works </tag>
</tags>
</entry>
<entry>
<title>毕设Week5</title>
<link href="/2024/01/09/%E6%AF%95%E8%AE%BEWeek5/"/>
<url>/2024/01/09/%E6%AF%95%E8%AE%BEWeek5/</url>
<content type="html"><![CDATA[<h1 id="错误使人进步和慢工出细活"><a href="#错误使人进步和慢工出细活" class="headerlink" title="错误使人进步和慢工出细活"></a>错误使人进步和慢工出细活</h1><p>最近在学习和生活中出现的一些错误导致我产生了抗拒情绪,回头来思索时我认为这些错误使我产生了进步,正所谓:</p><p><em><strong>错误是不可避免的,但是不要重复错误—《周恩来选集》</strong></em></p><p>而对于一件事情,如果想要把它做好,那一定不能急躁和一味追求效率,是需要花时间静下心来去阅读论文和学习技术的,正所谓:</p><p><em><strong>soft fire makes sweet malt—慢工出细活</strong></em></p><h2 id="如何解决问题?"><a href="#如何解决问题?" class="headerlink" title="如何解决问题?"></a>如何解决问题?</h2><p>现在的我毕设开始遇到了困难,主要原因是我选择了利用Blynk平台作为收集和反馈我的数据,并将数据发送至手机端APP,这个东西说起来简单,但是实际运用和操作的时候最大的问题是在官网的配置和代码的使用。</p><p><strong>首先这个Blynk网站是全英的,阅读其官网文档对我来说虽然有翻译可以作为辅助,但是很大程度上它的配置并没有想象中的那么简单,对于它给出的一些库文件,甚至没有详细说明或者下载链接就一笔带过,同时它所支持的Board和我使用的UNO板以及它所提供的模块与我的ESP8266-01S可能存在有不兼容的情况</strong></p><p>所以当我把我的源码修修改改后总是会报错,可是我又不能从代码中找到修改的方法,现在的道路对我而言只有死磕这条路和寻求国内的其他方法,例如<strong>阿里云和百度云</strong>提供的这种类型的服务。</p><h2 id="未来方向是什么?"><a href="#未来方向是什么?" class="headerlink" title="未来方向是什么?"></a>未来方向是什么?</h2><p>现在是周二,周五会有一个开卷考试。</p><p>我打算在周三周四对那个课程进行一定复习工作,那么这个周的方向,我打算将其转换为先去完成人脸识别部分的功能,等这个功能实现后再去尝试对于线上部分的代码和开发。</p>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>毕设Week4</title>
<link href="/2024/01/04/%E6%AF%95%E8%AE%BEWeek4/"/>
<url>/2024/01/04/%E6%AF%95%E8%AE%BEWeek4/</url>
<content type="html"><![CDATA[<h1 id="全身心投入到毕设的制作"><a href="#全身心投入到毕设的制作" class="headerlink" title="全身心投入到毕设的制作"></a>全身心投入到毕设的制作</h1><p>距离上次发布的Week3已经过去了17天,回家处理了一些事情后,终于能投入到自己所喜欢的毕设项目里面。目前我的主要计划是在1.20号回家前能够完成整个硬件部分的任务,利用寒假的时间则是完成paper。</p><h2 id="目前的现状"><a href="#目前的现状" class="headerlink" title="目前的现状"></a>目前的现状</h2><p><strong>由于回家后没有太多时间来做我的事情,所以大部分的工作内容主要放在阅读文献和学习一些其他人的repo(代码仓库)</strong> </p><p>现在回到学校后重新整理之前的几个问题就是:</p><ol><li><p>我已经获得了读卡器,也就是说现在可以先实现将带有AI的模型装到SD卡中,但是由于没有烧录器,还不好将这个模型烧录到K210中,不过<strong>这个烧录器已经在路上</strong>,也就是说下个周能够开始训练我的人脸模型</p></li><li><p>对于整个毕设的<strong>第二难度</strong>的问题(第一难度的问题是K210的人脸识别功能,但是我很有自信同时我坚信这一次我努力可以做到这个任务)是如何将外部模块接收到的数据传送到云端,再通过它作为中介最后发送到用户的手机上。</p><p>之前的时候考虑的方案是利用Blynk平台的免费版本实现将数据传输到其IoT平台上,再通过它在安卓手机上安装同样的软件,这样就能实现通过使用手机对其进行控制,同时在一定程度上减少app应用开发的难度</p><p>然而当初最开始在采购硬件的时候,我以为ESP8266开发板会意味着性能更佳,但实际上它已经是一个<strong>完整的微控制器</strong>系统,能够独立运行功能。</p></li></ol><h2 id="考虑的方案"><a href="#考虑的方案" class="headerlink" title="考虑的方案"></a>考虑的方案</h2><p><u>根据以上的现状分析,我打算首先完成对于云服务这一部分的内容</u></p><p>方案具体如下:</p><p>1.<strong>测试</strong>:在ESP01S模块还没有到之前,我需要直接利用ESP8266的开发板来测试将MQ2收集到的数据通过WIFI上传到云,在通过云服务器向手机端测试发送信息</p><p>2.<strong>将ESP8266结合Arduino UNO使用</strong>,Arduino Uno可以负责处理传感器数据和其他硬件交互,而ESP8266则负责处理网络通信,即MQ2发送数据这部分的工作直接给ESP8266开发板,两者之间使用串口通信,但是我觉得这个方案的实现有点杀鸡焉用牛刀。</p><p>3.等ESP01S模块和烧录器到了之后,再实现之前的功能,那么这个周的任务主要是<strong>测试app这部分的内容实现</strong></p><h2 id="未来的计划"><a href="#未来的计划" class="headerlink" title="未来的计划"></a>未来的计划</h2><p>1.对于后面没有使用到的<strong>ESP8266开发板</strong>可能考虑是否可以在整个项目中是实现一些其他功能</p><p>2.对于这个周也不是说再次混过去,我对于未来有个想法是在项目的OLED显示端,是否考虑引入<strong>旋钮</strong>的硬件,然后结合设计UI和一个简单的系统,实现通过旋钮能够实现其他更多选项和一些功能的实现</p><p>3.是否考虑再次引入语音识别功能,使其还能通过语音询问后给出一些数据和信息,我更偏向于希望这个项目能有更多的可能性,更贴近物联网<strong>服务于人</strong>的理念。</p><p><strong>更新 Process</strong>:现在已经签收了ESP01S模块和烧录器,那我还是首先选择先去做云服务器部分的内容(即完成将数据传送到云端,再将云端数据能够发送到手机端的任务)</p><h2 id="更新-issue(1-6-23-44-solved)"><a href="#更新-issue(1-6-23-44-solved)" class="headerlink" title="更新 issue(1.6/23:44 solved)"></a>更新 issue(1.6/23:44 solved)</h2><h3 id="问题:"><a href="#问题:" class="headerlink" title="问题:"></a>问题:</h3><p><strong>1.ESP8266-01s通过杜邦线连接烧录器后,无法读取到端口。—>这直接导致烧录软件无法搜索到端口</strong>—><strong>从而连烧录都无法进行</strong></p><p><strong>2.ESP8266-01S固件库无法正确烧录(ESP01SWIFI模块)—>由于这个固件库无法烧录会导致后续整个对于UNO开发板接收到的数据无法发送至云服务器—>直接卡住整个项目</strong></p><h3 id="解决途径:"><a href="#解决途径:" class="headerlink" title="解决途径:"></a>解决途径:</h3><h4 id="第一个问题"><a href="#第一个问题" class="headerlink" title="第一个问题"></a><strong>第一个问题</strong></h4><p>我首先考虑的是为什么无法读取到串口,这里我选择了重新安装串口驱动,以及谷歌、百度等试图寻找相关的类似解决方案,但是并不奏效。</p><p>这个时候我意识到应该<strong>先检查是烧录器的问题还是ESP8266的问题</strong>,这是一个简单的问题排查,那么这个时候我先找到了烧录器的官方文档,通过说明利用<strong>将TX和RX短接</strong>,在接入电脑后利用串口软件发送字符,很明显的观察到<strong>在烧录器上出现蓝灯显示,并且字符正常收到</strong>,这个时候打开电脑的设备管理器的时候发现很明显的出现的串口,说明不是烧录器的问题,考虑<strong>是否是接线问题</strong>,但是在这里我犯了一个<strong>致命的错误</strong>,并且深深地影响了后面长达数小时地反复寻找问题。</p><p>既然不是烧录器的问题,那么看来是我的ESP01S与烧录器进行连接的过程中出现的问题,根据与购买硬件的客服了解中我的烧录器只有6个接口,而01S(<strong>后面直接用01S来替代ESP8266-01S模块</strong>)的接口是8个,如果按照文档应该是每一个引脚都与之相对应的,但是客服却告诉我那只需要接4线,正是这种业余客服的回答加重了我问题解决的进度,实际上正是<strong>接线的原因导致的</strong>,<strong>而接线这个问题甚至后面也影响了我的第二个问题</strong>,烧录器只有6个接口,而01S是8个接口,实际上这里的解决方法是我<u>后面将烧录口的3.3V和GND通过杜邦线接到面包板后,再将那01S中多的两个接口接到面包板后,问题成功的解决,搜索到了端口。</u></p><h4 id="第二个问题"><a href="#第二个问题" class="headerlink" title="第二个问题"></a><strong>第二个问题</strong></h4><p>1.寻找购买元器件的淘宝客服,继续请求获得技术支持—>由于现在是周末,技术不在线,只能等到周一且客服提出的建议非常有限,所以我选择自己继续死磕。</p><p>2.阅读客服发给我的硬件使用文档,在其中寻求解决方案—>结果很显然的是这其中唯一有用的是使用手册,非常巧的是其中提到了关于无法烧录问题的解决,同时非常巧的是只给出了一个似乎是官网网站链接但是这个链接已经失效</p><p>3.<strong>一切出现了新的契机</strong>,正是这个链接给了我启发,根据一通寻找下我找到了该公司建立的论坛,而非常令人震撼的是这其中有开发资料,并且最新更新时间到了2020年(这说明这个公司还没有倒闭还在运行),因为这个原因我下载到了最新的烧录软件(该公司开发的第三方软件)和最新问题解决文档—>但是阅读文档还是无法解决问题,其实我遇到了困难,我有点痛苦。</p><p>4.我开始从代码上来判断问题,当我每次利用第三方软件烧录的时候,总有个命令行终端同时出现,但是我之前并没有主要到这个东西,根据命令行显示<code>esp8266 chip sync error esp_sync_blocking.</code>(芯片同步错误)实际上这一行代码的出现以及带来了新的方向,同时也告诉<strong>我们学好英语多么的重要</strong>。</p><p>5.根据这行代码我开始尝试谷歌,希望在网络上能够有相似的问题出现和解决方法,最开始在Arduino社区和ESP32社区出现了类似的问题,这些问答基本上都是英语回答的,不过还好我有翻译插件,其中一个回答指向了<strong>COM端口的比特率是否和烧录器的比特率一致</strong>,这吓得我赶紧去查看,果然COM端口在电脑上默认是9600,可能是Arduino的原因—>但是更改后仍然没有解决问题,我又受到了打击</p><p>6.继续在网络中寻找答案,<strong>我今天必须把这个问题解决</strong>,很多人都说CSDN这个国内社区里的内容都是屎里掏金,结果我在一篇学习分享中发现了一个重要的回答:**<u><em>凡是出现: Chip sync error: Failed to connect to ESP8266: Timed out waiting for packet header没有其他花里胡哨的!!!只有一个问题:就是接线错误!!!接线错误!!!接线错误!!!说三遍!!!如果是烧写模式选错了,烧写完成后固件不可用!!!</em></u>**</p><p>等等怎么和我的错误很相似</p><p><strong>正是这一个细节让我再次重新复查的时候发现,我的RX和TX这两个线的对接是错误的,错误地将RX与RX对接,TX和TX对接,正是这一个小小的错误导致整个烧录无法正常进行。</strong></p><p>那么为什么TX和RX要对应相接呢,其实这个是在学习单片机的时候就已经学习过的串口通信知识,但是因为知识长期没有回顾以及当时没有认真去学,所以在接线的时候没有去认真做好这一个事情。</p><p>简单来说<strong>RX代表接收,TX代表发送</strong>,为了实现两个设备间的通信,就必须将发送端连接到接收到,因为两个设备之间是会存在相互发送数据的,所以必须对应连接,如果接线错误就会导致错位,从而无法正确通信。</p><p>那么以上就是整个问题的解决回顾</p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>当出现这种问题的时候</p><p>首先考虑排除问题,特别是后期做到整个设备的联控的时候,更有可能出现这种细小问题导致的大问题,那么解决的关键就在于要学会去按照分部分来逐个排查问题,这样才能节约和利用好整个处理问题的时间和提高效率.</p><p>其次这种硬件上的问题,特别是接线上的问题的时候,除了排查软件部分即代码出现的问题,还要重新考虑是否是接线导致的,所以非常关键的一点就是对于平时的接线要做到慢准稳。在自动原理控制里我们说的是稳准快,而其中的核心就是要先稳,最后才追求的是快。</p><p>最后我想说的是遇到问题并不可怕,解决问题也没有想象中的那么困难,在今年我始终坚信的一点是<strong>要相信自己,并且不轻易放弃</strong>。为什么?心态非常的重要,不仅是对处理问题,对于整个人的人生也会有非常之重要的左右,在我以前阅读的书籍中很多时候已经提到,心态有时候甚至会决定一个人一生的命运或是成功,忧患惆怅或者急躁之人终不会成就大事,只有处波澜之中仍然处乱不惊的人方能成就之伟业。</p>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>Day9</title>
<link href="/2024/01/03/Day9/"/>
<url>/2024/01/03/Day9/</url>
<content type="html"><![CDATA[<h1 id="BACK-TO-BACK"><a href="#BACK-TO-BACK" class="headerlink" title="BACK TO BACK"></a><strong>BACK TO BACK</strong></h1><p>终于回到学校,接下来是认真完成各种考试和报告,以及在放假前把整个毕设的基本硬件部分给完成。</p><h1 id="Work-Hard"><a href="#Work-Hard" class="headerlink" title="Work Hard"></a>Work Hard</h1><p>在整个寒假以及过年之前的任务就是主要去完成毕业论文的写作。</p><p>我觉得我最需要的就是把自己的整个状态调整为克服懒惰 让自己总是学着去做一些对生活和学习有正方向的事情。这些事情可以是学习知识,可以是阅读书籍,可以是欣赏一些电影,但是我不想再去看那些集数太长的番剧或者电视剧。更多的是结合自己的爱好和兴趣去做一些有一些意义的事情。</p><p>比如说现在我正在一门意义并不大的专业选修课上,但是我没有浪费时间去浏览一些没有营养的短视频或者花边新闻。I DON’T CARE ABOUT THESE PEOPLE… 而我把事情转换到了打开WORD文档,把我想写的先写来最后再回去后PULL到我的Blog上。</p><h1 id="Last"><a href="#Last" class="headerlink" title="Last"></a>Last</h1><p>最后我觉得很多事情没必要在分享在朋友圈,特别是文字类的自我感想,只需要分享图片就可以了。</p><p>努力吧 今年 好好地 认真地 去做好每一件事</p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> Thoughts </tag>
</tags>
</entry>
<entry>
<title>毕设Week3</title>
<link href="/2023/12/17/%E6%AF%95%E8%AE%BEWeek3/"/>
<url>/2023/12/17/%E6%AF%95%E8%AE%BEWeek3/</url>
<content type="html"><![CDATA[<h1 id="因考研将进度推迟一段时间"><a href="#因考研将进度推迟一段时间" class="headerlink" title="因考研将进度推迟一段时间"></a>因考研将进度推迟一段时间</h1><p>目前是模块已经齐全 对于整个系统最核心的摄像头模块 也已经购买了K210摄像头模块 打算等考完后再去深入研究</p><p>而如果按照接下来的进度就是处理以下几个问题:</p><p><u>1.将数据通过ESP8266模块结合WIFI功能传送到IoT平台,对于IoT平台的数据再实时反馈到手机上,如果有出现数据异常的情况,则及时提醒手机用户。</u></p><p><u>2.实现摄像头部分的代码,以及人脸库的训练,从而完成通过机器识别人脸与信息库进行比对,如果数据异常,则通过Arduino部分将信息反馈到IoT平台后传送到手机端</u></p><p><u>3.最终能够通过手机WIFI控制下位机的报警装置的开关</u></p><p><u>4.进行整个系统联调。</u></p><p>按照整个项目的进度,大概在1月20号之前应该完整基本初步功能的实现</p><h1 id="续更:"><a href="#续更:" class="headerlink" title="续更:"></a><strong>续更</strong>:</h1><p>目前根据对官方K210文档进行研究发现,如果要实现对于人脸识别功能的话,在硬件方面我还需要<strong>一个USB转TTL模块</strong>,之所以用到这个模块是因为</p><p>1.为了更好的实现Arduino和K210模块之间的串口通信</p><p>2.数据传输:USB转TTL模块可以帮助Arduino板通过串口接收来自K210摄像头模块的数据。整个流程是:将摄像头捕获的图像进行处理后,再通过串口将结果反馈给Arduino,再通过Arduino的ESP8266发送至云服务端,最后通过云服务端传送到用户的手机上</p><p><strong>不过除此之外我还需要一个读卡器。</strong>这需要借助读卡器来将带有AI的模型装到SD卡中</p><p>根据官方文档来说,如果要实现人脸识别需要的就是</p><h2 id="一-实验接线"><a href="#一-实验接线" class="headerlink" title="一.实验接线"></a><strong>一.实验接线</strong></h2><table><thead><tr><th align="center">Arduino</th><th align="center">USB</th></tr></thead><tbody><tr><td align="center">TXD</td><td align="center">RXD</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><table><thead><tr><th align="center">Arduino</th><th align="center">k210</th></tr></thead><tbody><tr><td align="center">RXD</td><td align="center">TXD</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">VCC</td><td align="center">5V</td></tr></tbody></table><h2 id="二-连线图演示:"><a href="#二-连线图演示:" class="headerlink" title="二.连线图演示:"></a>二.连线图演示:</h2><p>这里我给一个嵌入图片 如果网速加载的好可能会流畅显示</p><p><a href="https://www.yahboom.com/public/upload/upload-html/1697529742/2023060600006.png![](https://www.yahboom.com/public/upload/upload-html/1697529742/2023060600006.png)">https://www.yahboom.com/public/upload/upload-html/1697529742/2023060600006.png![](https://www.yahboom.com/public/upload/upload-html/1697529742/2023060600006.png)</a></p><h2 id="三-代码示例"><a href="#三-代码示例" class="headerlink" title="三.代码示例"></a>三.代码示例</h2><p>这只是官方文档给出的基础示例代码(为了方便后续进行修改的时候 不用去找范例 我把它POST在这)</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">while</span> (K210Serial.<span class="built_in">available</span>()) </span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">recv_k210msg</span>(K210Serial.<span class="built_in">read</span>());</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> (k210_msg.class_n != <span class="number">0</span>)<span class="comment">//例程号不为空</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(k210_msg.class_n == <span class="number">8</span>)<span class="comment">//是人脸识别</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">sprintf</span>(buff_com,<span class="string">"x=%d,y=%d,w=%d,h=%d\r\n"</span>,k210_msg.x,k210_msg.y,k210_msg.w,k210_msg.h);</span><br><span class="line"> K210Serial.<span class="built_in">print</span>(buff_com);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(k210_msg.id == <span class="string">'Y'</span> || k210_msg.id == <span class="string">'y'</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">sprintf</span>(buff_com,<span class="string">"Yes\r\n"</span>);</span><br><span class="line"> K210Serial.<span class="built_in">print</span>(buff_com);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">sprintf</span>(buff_com,<span class="string">"NO\r\n"</span>);</span><br><span class="line"> K210Serial.<span class="built_in">print</span>(buff_com);</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> k210_msg.class_n = <span class="number">0</span>;<span class="comment">//清除例程号 </span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>经过以上的程序,如果是跑这个例程,k210_msg结构体的成员就有对应的值,并通过串口打印处理</p><p>k210_msg:是接收信息的结构体,它的主要成员有</p><ul><li>x:是识别出来框左上角的横坐标(范围:0-240)</li><li>y:是识别出来框左上角的纵坐标(范围:0-320)</li><li>w:是识别出来框的宽度(范围:0-240)</li><li>h:是识别出来框的长度(范围:0-320)</li><li>id:是识别出来的标签</li><li>class_n:例程编号</li><li>msg_msg[20]:有效数据</li></ul><p>经过数据接收的函数并处理,k210_msg的每个成员都会存储到有效信息,如果想要二次开发,直接调用就k210_msg的成员就可以了</p><h2 id="四-实验现象"><a href="#四-实验现象" class="headerlink" title="四.实验现象"></a>四.实验现象</h2><p><u>1.完成接线 通过按键记录人脸</u></p><p><u>2.将串口助手设定好同一个波特率</u></p><p><u>3.跑上面的历程,然后XCOM串口助手则会反馈 YES或者NO</u> </p><h2 id="五-总结"><a href="#五-总结" class="headerlink" title="五,总结"></a>五,总结</h2><p>所以如果要完整整个毕设,在当下来看<strong>关键点</strong>为:</p><p>1.在人脸识别部分的模块需要重写,不仅需要满足能过通过训练出的模型与检测到的人脸进行成功对比,还需要将得到的信息通过串口反馈给Arduino,再通过Arduino利用ESP8266模块的WIFI将数据传送到IoT云服务端,通过云服务端能够向用户反馈是否出现了陌生人识别错误的情况,通过在下位机端要对其进行报警。</p><p>2.对于蜂鸣器的报警或许也要对其两种不同的情况进行区分,一种是当烟雾浓度过高的报警,一种是陌生人侵入时的报警,这两种报警方式可以根据鸣笛的时间长短不同来进行区别。</p><p>3.IOT云服务器端,在这里需要的就是处理两个信息,一是来自于烟雾传感器的浓度过高信息报警反馈到手机端,二是对于人脸信息不匹配时的将警报预警信息反馈到手机。</p><p>4.从手机端对其警报器进行控制。</p><p>目前而言需要解决的就以下几个问题 虽然进度上现在暂时停滞 但是我会后面尽快的赶上来</p>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>毕设材料清单</title>
<link href="/2023/12/12/%E6%AF%95%E8%AE%BE%E6%9D%90%E6%96%99%E6%B8%85%E5%8D%95/"/>
<url>/2023/12/12/%E6%AF%95%E8%AE%BE%E6%9D%90%E6%96%99%E6%B8%85%E5%8D%95/</url>
<content type="html"><![CDATA[<h1 id="以下是完整的整个毕设课题材料的清单"><a href="#以下是完整的整个毕设课题材料的清单" class="headerlink" title="以下是完整的整个毕设课题材料的清单"></a>以下是完整的整个毕设课题材料的清单</h1><p>如果后续有其他更新会在这里</p><table><thead><tr><th align="center"></th><th align="center">数量</th><th align="center">价格</th></tr></thead><tbody><tr><td align="center">气体传感器MQ-2</td><td align="center">2</td><td align="center">15.28</td></tr><tr><td align="center">显示屏SPI 0.96寸</td><td align="center">1</td><td align="center">8.7</td></tr><tr><td align="center">杜邦线</td><td align="center">40</td><td align="center">1.7</td></tr><tr><td align="center">ESP8266开发板</td><td align="center">1</td><td align="center">11.4</td></tr><tr><td align="center">蜂鸣器</td><td align="center">1</td><td align="center">1</td></tr><tr><td align="center">塑料盒</td><td align="center">1</td><td align="center">4.3</td></tr><tr><td align="center">面包板</td><td align="center">2</td><td align="center">7.55</td></tr><tr><td align="center">Arduino Uno开发板</td><td align="center">1</td><td align="center">25.8</td></tr><tr><td align="center">K210视觉识别模块</td><td align="center">1</td><td align="center">245</td></tr><tr><td align="center">串口下载器</td><td align="center">1</td><td align="center">5.57</td></tr><tr><td align="center">ESP01S串口</td><td align="center">1</td><td align="center">5.20</td></tr><tr><td align="center">合计</td><td align="center"></td><td align="center">331.5</td></tr></tbody></table>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>毕设Week2</title>
<link href="/2023/12/09/%E6%AF%95%E8%AE%BEWeek2/"/>
<url>/2023/12/09/%E6%AF%95%E8%AE%BEWeek2/</url>
<content type="html"><![CDATA[<h1 id="毕设Week2-对于MQ2传感器检测数值的实验反馈"><a href="#毕设Week2-对于MQ2传感器检测数值的实验反馈" class="headerlink" title="毕设Week2-对于MQ2传感器检测数值的实验反馈"></a>毕设Week2-对于MQ2传感器检测数值的实验反馈</h1><h2 id="一-进度反馈:"><a href="#一-进度反馈:" class="headerlink" title="一.进度反馈:"></a>一.进度反馈:</h2><h3 id="1-材料以及陆续到齐-(除摄像头模块)"><a href="#1-材料以及陆续到齐-(除摄像头模块)" class="headerlink" title="1.材料以及陆续到齐 (除摄像头模块)"></a><u>1.材料以及陆续到齐</u> (除摄像头模块)</h3><h3 id="2-对于代码的调试有了新的进展"><a href="#2-对于代码的调试有了新的进展" class="headerlink" title="2.对于代码的调试有了新的进展"></a><u>2.对于代码的调试有了新的进展</u></h3><h3 id="3-对于第一部分可以完全实现其功能"><a href="#3-对于第一部分可以完全实现其功能" class="headerlink" title="3.对于第一部分可以完全实现其功能"></a><u>3.对于第一部分可以完全实现其功能</u></h3><h3 id="4-对于摄像头的选取和方法还需要进一步研究(这需要从经济和性能方面考究)"><a href="#4-对于摄像头的选取和方法还需要进一步研究(这需要从经济和性能方面考究)" class="headerlink" title="4.对于摄像头的选取和方法还需要进一步研究(这需要从经济和性能方面考究)"></a><u>4.对于摄像头的选取和方法还需要进一步研究</u>(这需要从经济和性能方面考究)</h3><h2 id="二-硬件与代码结合的烟雾监测实验"><a href="#二-硬件与代码结合的烟雾监测实验" class="headerlink" title="二.硬件与代码结合的烟雾监测实验"></a>二.硬件与代码结合的烟雾监测实验</h2><p>根据第一周编写的烟雾监测部分代码,通过硬件演示发现在现场并无烟雾的情况下,通过AO口监测到的实时数据维持在290-300附近,并且由于设定值为40,故设定的LED灯出现闪烁情况。</p><p>所以根据实验情况,将阈值更改为300后,进行第二次烟雾监测发现,此时通过串口显示数值增加至240左右后开始出现数据下降的情况最后数据维持在20-22之间,而此时现场中并没有烟雾.根据这一数据监测,我目前大致收集到在正常没有烟雾的环境中,MQ-2的气体数值在16-25之间。</p><p>现在我需要利用香烟做烟雾检测,来设定出合适的报警阈值。</p><p>根据两次实验反馈,当香烟点燃,并且开始出现有烟雾的情况下,烟雾报警器的数值通过串口显示器开始不断攀升,最终达到235,除此之外当香烟不再出现明显的烟雾时,空气中检测到的数值仍然维持在230-235左右,最后通过用手挥散周围空气的途径,监测数值恢复到12,并维持在该数值附近。</p><p><strong>结论</strong>:</p><p>1.<u>如果在厨房等对烟雾需要敏感监测的环境中,要对出现轻微烟雾的情况,比如香烟等物质进行监测时,应该将阈值设置在200,当传感器读数超过该阈值时,则通过蜂鸣器进行警报,以及信号灯闪烁的形式。</u></p><p>2.根据多次实验的检测,以下数据的收集表</p><table><thead><tr><th align="center">烟雾模块检测数据</th><th align="center">香烟点燃情况</th><th align="center">检测到的模拟值</th></tr></thead><tbody><tr><td align="center">第一次实验</td><td align="center">点燃但无烟雾初期</td><td align="center">211</td></tr><tr><td align="center">第二次实验</td><td align="center">完全熄灭状态</td><td align="center">12</td></tr><tr><td align="center">第三次实验</td><td align="center">点燃但无烟雾末期</td><td align="center">235</td></tr><tr><td align="center">第四次实验</td><td align="center">点燃有烟雾</td><td align="center">230</td></tr><tr><td align="center">第五次实验</td><td align="center">点燃有烟雾</td><td align="center">234</td></tr></tbody></table><p>3.传感器模块数据与电压之间的关系:</p><p>由于Arduino Uno的模拟输入引脚通过内置的模拟-数字转换器(ADC)将输入的电压转换为0至1023之间的数字值。Arduino Uno的ADC为10位,这意味着它可以表示2的10次方=1024个不同的值。Arduino的输入电压是5V,这意味着每个模拟读数单位代表的电压大约是5<em>V</em>/1024≈0.00488<em>V</em>(4.88mV)。</p><p>将模拟读数转换为实际的电压值,利用公式:</p><p><em><em>电压值=模拟读数</em>(5v/1024)</em>*</p><p>根据实验反馈当无烟雾时模拟数值为12,那么对应的电压大约为:12×0.00488<em>V</em>≈0.05856<em>V</em></p><p>当点燃但无明显烟雾初期,对应的电压为1.0296V</p><p>当有明显的烟雾时,读数为230-235之间,根据计算对应的电压大约为:1.1377V</p><p>最后通过厂家的说明书得知当电压处于0.1-0.3V时表示相对无污染,而高浓度时电压为4V左右,实验数据反映出在无烟雾的环境下电压接近0.05856V,这确实处于低污染的范围内。而在有烟雾的情况下,电压值在1.1V左右,说明传感器检测到了一定程度的气体浓度增加,同时代码正常运作(不过由于当时我的阈值在检测的时候仍然设定为300,所以在视频和图片演示中,没有出现闪烁的情况)。</p><p><strong>关于烟雾检测的代码修改如下:</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> MQ2Pin = A0; <span class="comment">// MQ-2传感器连接的模拟输入引脚</span></span><br><span class="line"><span class="type">int</span> LED = <span class="number">13</span>; <span class="comment">// LED灯连接到数字引脚8</span></span><br><span class="line"><span class="type">int</span> threshold = <span class="number">200</span>; <span class="comment">// 设定的气体浓度阈值</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="built_in">pinMode</span>(LED, OUTPUT); <span class="comment">// 设置LED引脚为输出模式</span></span><br><span class="line"> Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); <span class="comment">// 开始串口通信</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="type">int</span> sensorValue = <span class="built_in">analogRead</span>(MQ2Pin); <span class="comment">// 读取传感器值</span></span><br><span class="line"> Serial.<span class="built_in">println</span>(sensorValue); <span class="comment">// 输出传感器值到串口</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (sensorValue > threshold) {</span><br><span class="line"> <span class="comment">// 如果传感器读数超过阈值,LED灯连续闪烁</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, HIGH); <span class="comment">// 打开LED灯</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">500</span>); <span class="comment">// 延时500毫秒</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, LOW); <span class="comment">// 关闭LED灯</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">500</span>); <span class="comment">// 延时500毫秒</span></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, LOW); <span class="comment">// 如果没有超过阈值,保持LED灯关闭</span></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="三-将数据通过OLED显示屏进行实时反馈监测"><a href="#三-将数据通过OLED显示屏进行实时反馈监测" class="headerlink" title="三.将数据通过OLED显示屏进行实时反馈监测"></a>三.将数据通过OLED显示屏进行实时反馈监测</h2><p><strong>硬件连接</strong>:</p><p>按照OLED模块说明书,将对应的引脚按照SCL=13 SDA=11 RES=8 DC=9 CS=10的方式,将OLED直接连接到开发板上,而VCC和GND则通过面包板,将OLED模块和MQ2模块一并连接。</p><p><u><strong>实现功能:为读取MQ-2传感器值并将数据传到OLED显示屏上,通过OLED显示屏实时反应监测到的数据,并且能够一秒钟显示一个数据</strong></u></p><p>所以将代码修改为</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><SPI.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"Ucglib.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义MQ-2传感器和LED</span></span><br><span class="line"><span class="type">int</span> MQ2Pin = A0; <span class="comment">// MQ-2传感器连接的模拟输入引脚</span></span><br><span class="line"><span class="type">int</span> LED = <span class="number">13</span>; <span class="comment">// 使用Arduino板上的内置LED</span></span><br><span class="line"><span class="type">int</span> threshold = <span class="number">200</span>; <span class="comment">// 设定的气体浓度阈值</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义OLED显示屏连接的引脚</span></span><br><span class="line"><span class="function">Ucglib_ST7735_18x128x160_SWSPI <span class="title">ucg</span><span class="params">(<span class="comment">/*sclk=*/</span> <span class="number">13</span>, <span class="comment">/*data=*/</span> <span class="number">11</span>, <span class="comment">/*cd=*/</span> <span class="number">9</span>, <span class="comment">/*cs=*/</span> <span class="number">10</span>, <span class="comment">/*reset=*/</span> <span class="number">8</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="comment">// 初始化LED和串口</span></span><br><span class="line"> <span class="built_in">pinMode</span>(LED, OUTPUT);</span><br><span class="line"> Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 初始化OLED显示屏</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">1000</span>); <span class="comment">// 等待硬件准备就绪</span></span><br><span class="line"> ucg.<span class="built_in">begin</span>(UCG_FONT_MODE_TRANSPARENT);</span><br><span class="line"> ucg.<span class="built_in">clearScreen</span>();</span><br><span class="line"> <span class="comment">//ucg.setRotate90(); // 设置屏幕为横向显示</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="comment">// 读取MQ-2传感器值并打印到串口</span></span><br><span class="line"> <span class="type">int</span> sensorValue = <span class="built_in">analogRead</span>(MQ2Pin);</span><br><span class="line"> Serial.<span class="built_in">println</span>(sensorValue);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 判断是否超过阈值,并控制LED</span></span><br><span class="line"> <span class="keyword">if</span> (sensorValue > threshold) {</span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, HIGH); <span class="comment">// 打开LED灯</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">500</span>); <span class="comment">// 延时</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, LOW); <span class="comment">// 关闭LED灯</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">500</span>); <span class="comment">// 延时</span></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, LOW); <span class="comment">// 关闭LED</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 设置OLED屏幕的字体和颜色</span></span><br><span class="line"> ucg.<span class="built_in">setFont</span>(ucg_font_ncenR12_tr);</span><br><span class="line"> ucg.<span class="built_in">setColor</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 清除屏幕并设置打印位置</span></span><br><span class="line"> ucg.<span class="built_in">clearScreen</span>();</span><br><span class="line"> ucg.<span class="built_in">setPrintPos</span>(<span class="number">0</span>, <span class="number">20</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 打印实时数据到OLED屏幕</span></span><br><span class="line"> ucg.<span class="built_in">print</span>(sensorValue);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">1000</span>); <span class="comment">// 等待一段时间再刷新屏幕</span></span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>但是在实际过程中,出现了很明显的数据显示不全或没有的情况,而使用示例代码打印HELLO WORLD时则是正常的 对于OLED这部分代码我还需要进行修改 或考虑为是否接触不良</p><h2 id="四-引入蜂鸣报警器"><a href="#四-引入蜂鸣报警器" class="headerlink" title="四.引入蜂鸣报警器"></a>四.引入蜂鸣报警器</h2><p><u><strong>利用低电平触发蜂鸣报警器,实现当MQ2烟雾传感器模块监测数据超过阈值时发出报警,而当数值低于阈值时则不发出报警的功能。</strong></u></p><p><strong>硬件连接</strong>:将IO模拟口接到D2引脚,将VCC和GND按正常连接</p><p>修改代码如下:</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><SPI.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"Ucglib.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义MQ-2传感器、LED和蜂鸣器</span></span><br><span class="line"><span class="type">int</span> MQ2Pin = A0; <span class="comment">// MQ-2传感器连接的模拟输入引脚</span></span><br><span class="line"><span class="type">int</span> LED = <span class="number">13</span>; <span class="comment">// 使用Arduino板上的内置LED</span></span><br><span class="line"><span class="type">int</span> buzzer = <span class="number">2</span>; <span class="comment">// 蜂鸣器连接到数字引脚D2</span></span><br><span class="line"><span class="type">int</span> threshold = <span class="number">200</span>; <span class="comment">// 设定的气体浓度阈值</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义OLED显示屏连接的引脚</span></span><br><span class="line"><span class="function">Ucglib_ST7735_18x128x160_SWSPI <span class="title">ucg</span><span class="params">(<span class="comment">/*sclk=*/</span> <span class="number">13</span>, <span class="comment">/*data=*/</span> <span class="number">11</span>, <span class="comment">/*cd=*/</span> <span class="number">9</span>, <span class="comment">/*cs=*/</span> <span class="number">10</span>, <span class="comment">/*reset=*/</span> <span class="number">8</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="comment">// 初始化LED、串口和蜂鸣器</span></span><br><span class="line"> <span class="built_in">pinMode</span>(LED, OUTPUT);</span><br><span class="line"> <span class="built_in">pinMode</span>(buzzer, OUTPUT);</span><br><span class="line"> Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 初始化OLED显示屏</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line"> ucg.<span class="built_in">begin</span>(UCG_FONT_MODE_TRANSPARENT);</span><br><span class="line"> ucg.<span class="built_in">clearScreen</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="comment">// 读取MQ-2传感器值并打印到串口</span></span><br><span class="line"> <span class="type">int</span> sensorValue = <span class="built_in">analogRead</span>(MQ2Pin);</span><br><span class="line"> Serial.<span class="built_in">println</span>(sensorValue);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 判断是否超过阈值,并控制LED和蜂鸣器</span></span><br><span class="line"> <span class="keyword">if</span> (sensorValue > threshold) {</span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, HIGH); <span class="comment">// 打开LED灯</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(buzzer, LOW); <span class="comment">// 激活蜂鸣器(低电平触发)</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, LOW); <span class="comment">// 关闭LED灯</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(buzzer, HIGH); <span class="comment">// 关闭蜂鸣器</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, LOW); <span class="comment">// 关闭LED</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(buzzer, HIGH); <span class="comment">// 确保蜂鸣器关闭</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 更新OLED屏幕显示</span></span><br><span class="line"> ucg.<span class="built_in">clearScreen</span>();</span><br><span class="line"> ucg.<span class="built_in">setPrintPos</span>(<span class="number">0</span>, <span class="number">20</span>);</span><br><span class="line"> ucg.<span class="built_in">print</span>(sensorValue);</span><br><span class="line"> </span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">1000</span>); <span class="comment">// 等待一秒钟</span></span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong><u>经过检测,该功能正常实现,当超过阈值时,蜂鸣器能正常发出报警声,当数据低于阈值时,蜂鸣器不发出报警。</u></strong></p><h2 id="五-反思和下一阶段任务"><a href="#五-反思和下一阶段任务" class="headerlink" title="五.反思和下一阶段任务"></a>五.反思和下一阶段任务</h2><p><strong>通过这个周的工作,目前初步解决第一个问题,即烟雾报警器的监测和蜂鸣报警器的功能实现,以及显示屏的初步调整。</strong></p><h3 id="目前问题如下:"><a href="#目前问题如下:" class="headerlink" title="目前问题如下:"></a>目前问题如下:</h3><p>1.显示屏不能正常显示通过传感器监测到的数据,并按照每秒显示一次数据的形式</p><p>2.是否考虑为设置的字体大小不恰当,以及显示信息的坐标不合理。</p><h3 id="下一阶段任务:"><a href="#下一阶段任务:" class="headerlink" title="下一阶段任务:"></a>下一阶段任务:</h3><p>1.如何通过ESP8266模块,将信息上传至云平台对数据有着更为方便的监测和管理,以及实现对于数据通过何种形式对用户能够起到反馈作用,是否考虑为基于Kotlin语言开发出安卓应用,通过WIFI的形式,将数据反馈到手机上,并能通过手机对上位机做出何种操作反馈。</p><p>2.如何实现其通过摄像头模块来进行人脸识别功能,是否考虑为使用OV7670摄像头模块结合Python Cv实现人脸检测或是利用成本更贵的Open Mv结合Python语言进行人脸检测功能</p><p><strong>根据资料收集的结果是:</strong></p><p>基于Arduino的处理能力和内存限制,传统的人脸检测算法,例如OpenCV中的Haar特征级联分类器,通常需要较高的计算能力,这超出了大多数Arduino板的能力范围。</p><p><strong>方法一:</strong>考虑为:使用专门的硬件模块:例如OpenMV Cam或Pixy Cam,在这些模块中内置了用于图像处理和人脸检测的专用硬件和软件。</p><p>如果是:</p><ol><li><strong>OpenMV Cam</strong>:这是一个小型的低功耗摄像头模块,配备了强大的ARM Cortex M7处理器,能够运行简单的人脸检测算法。</li><li><strong>Pixy Cam</strong>:Pixy是一个快速的视觉传感器,可以轻松地集成到各种项目中,包括Arduino项目。它可以用于检测特定颜色的物体,但进行复杂的图像识别(如人脸检测)可能有限。</li></ol><p><strong>方法二:</strong>为结合Arduino和树莓派,因为树莓派的功能更强大,同时国产树莓派例如香蕉派这种的价格并不是很贵,可以通过树莓派上运行OpenCV处理图像识别和人脸检测的任务,并通过串口或网络将检测结果发送给Arduino。Arduino随后可以根据这些信息控制电机、LED或其他设备。</p><p><strong>方法三:</strong>使用价格更为便宜的OV7670摄像头模块结合Python和OpenCV,但是不是直接通过Arduino实现的。OV7670的低成本低,但它本身不包含进行图像处理或人脸检测的处理器。因此,还需要需要一个中间设备(如树莓派或PC)来处理从OV7670摄像头捕获的图像。</p><p><strong><u>基于目前的工作进度还有很多需要去实现和做到的功能,不过我会尽我的努力去实现!</u></strong></p><h2 id="补充:今晚临时加班,重新对显示屏部分代码进行修改和调整,现在能正常打印出传感器数值以及英文文字,要想打印出中文,还需要借助取模软件。"><a href="#补充:今晚临时加班,重新对显示屏部分代码进行修改和调整,现在能正常打印出传感器数值以及英文文字,要想打印出中文,还需要借助取模软件。" class="headerlink" title="补充:今晚临时加班,重新对显示屏部分代码进行修改和调整,现在能正常打印出传感器数值以及英文文字,要想打印出中文,还需要借助取模软件。"></a>补充:今晚临时加班,重新对显示屏部分代码进行修改和调整,现在能正常打印出传感器数值以及英文文字,要想打印出中文,还需要借助取模软件。</h2><p>通过创建一个包含文本和数值的字符串,调整字体大小和字符串显示坐标,最后使它呈现在屏幕上。</p><p>在这其中有两行比较关键的代码,我在下面做出一定的解释:</p><p><code>String displayStr = "Smoke Level: " + String(sensorValue);</code></p><ul><li>这一行创建了一个新的 <code>String</code> 对象,名为 <code>displayStr</code>。</li><li><code>"Smoke Level: "</code> 是一个字符串文字,它是这个新字符串的开始部分。</li><li><code>String(sensorValue)</code> 将整数 <code>sensorValue</code> 转换成一个 <code>String</code> 对象。这是必要的,因为在Arduino的C++中,不能直接将字符串和整数用 <code>+</code> 运算符相加。转换为 <code>String</code> 对象后,就可以使用 <code>+</code> 运算符将它们连接起来。</li><li>这行代码的结果是一个包含了 “Smoke Level: “ 文本和 <code>sensorValue</code> 数值(转换为字符串形式)的新字符串。</li></ul><p><code>ucg.print(displayStr.c_str());</code></p><ul><li><p><code>ucg.print()</code> 函数用于在Ucglib控制的显示屏上显示文本。</p></li><li><p><code>displayStr.c_str()</code> 调用 <code>String</code> 对象的 <code>c_str()</code> 方法,这将 <code>String</code> 对象转换为一个C风格的字符串(即一个以null结尾的字符数组)。<code>Ucglib</code> 的 <code>print()</code> 函数需要这种类型的字符串作为参数。</p></li><li><p>这行代码的作用是在屏幕上打印出 <code>displayStr</code> 中的内容。</p><h3 id="最后经过调整的完整第一部分代码如下:"><a href="#最后经过调整的完整第一部分代码如下:" class="headerlink" title="最后经过调整的完整第一部分代码如下:"></a>最后经过调整的完整第一部分代码如下:</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><SPI.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"Ucglib.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义MQ-2传感器、LED和蜂鸣器</span></span><br><span class="line"><span class="type">int</span> MQ2Pin = A0; <span class="comment">// MQ-2传感器连接的模拟输入引脚</span></span><br><span class="line"><span class="type">int</span> LED = <span class="number">13</span>; <span class="comment">// 使用Arduino板上的内置LED</span></span><br><span class="line"><span class="type">int</span> buzzer = <span class="number">2</span>; <span class="comment">// 蜂鸣器连接到数字引脚D2</span></span><br><span class="line"><span class="type">int</span> threshold = <span class="number">200</span>; <span class="comment">// 设定的气体浓度阈值</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义OLED显示屏连接的引脚</span></span><br><span class="line"><span class="function">Ucglib_ST7735_18x128x160_SWSPI <span class="title">ucg</span><span class="params">(<span class="comment">/*sclk=*/</span> <span class="number">13</span>, <span class="comment">/*data=*/</span> <span class="number">11</span>, <span class="comment">/*cd=*/</span> <span class="number">9</span>, <span class="comment">/*cs=*/</span> <span class="number">10</span>, <span class="comment">/*reset=*/</span> <span class="number">8</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="comment">// 初始化LED、串口和蜂鸣器</span></span><br><span class="line"> <span class="built_in">pinMode</span>(LED, OUTPUT);</span><br><span class="line"> <span class="built_in">pinMode</span>(buzzer, OUTPUT);</span><br><span class="line"> Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 初始化OLED显示屏</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line"> ucg.<span class="built_in">begin</span>(UCG_FONT_MODE_TRANSPARENT);</span><br><span class="line"> ucg.<span class="built_in">clearScreen</span>();</span><br><span class="line"> ucg.<span class="built_in">setRotate90</span>(); <span class="comment">// 将屏幕旋转90度</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">(<span class="type">void</span>)</span> </span>{</span><br><span class="line"> <span class="comment">// 读取MQ-2传感器值并打印到串口</span></span><br><span class="line"> <span class="type">int</span> sensorValue = <span class="built_in">analogRead</span>(MQ2Pin);</span><br><span class="line"> Serial.<span class="built_in">println</span>(sensorValue);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 判断是否超过阈值,并控制LED和蜂鸣器</span></span><br><span class="line"> <span class="keyword">if</span> (sensorValue > threshold) {</span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, HIGH); <span class="comment">// 打开LED灯</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(buzzer, LOW); <span class="comment">// 激活蜂鸣器(低电平触发)</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, LOW); <span class="comment">// 关闭LED灯</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(buzzer, HIGH); <span class="comment">// 关闭蜂鸣器</span></span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="built_in">digitalWrite</span>(LED, LOW); <span class="comment">// 关闭LED</span></span><br><span class="line"> <span class="built_in">digitalWrite</span>(buzzer, HIGH); <span class="comment">// 确保蜂鸣器关闭</span></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 更新OLED屏幕显示</span></span><br><span class="line"> ucg.<span class="built_in">clearScreen</span>();</span><br><span class="line"> ucg.<span class="built_in">setFont</span>(ucg_font_ncenB12_hr);</span><br><span class="line"> ucg.<span class="built_in">setColor</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>);</span><br><span class="line"> ucg.<span class="built_in">setPrintPos</span>(<span class="number">0</span>, <span class="number">50</span>);</span><br><span class="line"> String displayStr = <span class="string">"Smoke Level: "</span> + <span class="built_in">String</span>(sensorValue);</span><br><span class="line"> ucg.<span class="built_in">print</span>(displayStr.<span class="built_in">c_str</span>()); </span><br><span class="line"> <span class="built_in">delay</span>(<span class="number">1000</span>); <span class="comment">// 等待一秒钟</span></span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>Day8</title>
<link href="/2023/12/03/Day8/"/>
<url>/2023/12/03/Day8/</url>
<content type="html"><![CDATA[<h1 id="教练我要疯狂学习代码"><a href="#教练我要疯狂学习代码" class="headerlink" title="教练我要疯狂学习代码"></a>教练我要疯狂学习代码</h1><p> Code and Cook(basically refer to music) is the things I will learn for my all life… DO IT PLZ </p><p><a href="https://ooo.0x0.ooo/2023/12/03/OABhwp.jpg">https://ooo.0x0.ooo/2023/12/03/OABhwp.jpg</a></p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> Thoughts </tag>
</tags>
</entry>
<entry>
<title>毕设Week1</title>
<link href="/2023/12/01/%E6%AF%95%E8%AE%BEWeek1/"/>
<url>/2023/12/01/%E6%AF%95%E8%AE%BEWeek1/</url>
<content type="html"><![CDATA[<h1 id="毕设Week1-关于MQ2传感器监测的实现"><a href="#毕设Week1-关于MQ2传感器监测的实现" class="headerlink" title="毕设Week1-关于MQ2传感器监测的实现"></a>毕设Week1-关于MQ2传感器监测的实现</h1><p> <strong>对于毕设中第一个功能要求是实现对家庭室内环境(甲醇/烟雾)的监测,当数据异常时,上报手机。</strong></p><h2 id="传感器选择理由"><a href="#传感器选择理由" class="headerlink" title="传感器选择理由"></a>传感器选择理由</h2><p>对于这一功能 我在传感器方面选择了</p><h3 id="一-MQ-2气体传感器"><a href="#一-MQ-2气体传感器" class="headerlink" title="一.MQ-2气体传感器"></a>一.MQ-2气体传感器</h3><p>选择这款传感器的原因是 </p><p>1)简单的驱动电路 2)高灵敏度/快速响应恢复 3)广泛的探测范围 4)优异的稳定性/寿命长</p><p>5)成本低</p><p>它非常适用于家庭或工厂的气体泄漏监测装置 适用于液化气、酒精、烟雾等监测 单价在7-8元之间 </p><h3 id="二-ESP8266开发板"><a href="#二-ESP8266开发板" class="headerlink" title="二.ESP8266开发板"></a>二.ESP8266开发板</h3><p>1)低成本 2)运用非常广泛 3)广泛的社区支持 4)尺寸小</p><h2 id="模块实现流程"><a href="#模块实现流程" class="headerlink" title="模块实现流程"></a>模块实现流程</h2><p> 那么对于第一个要求要实现的流程图是 检测有害气体浓度——> 传输到云平台(通过ESP8266模块实现)——>检测有害气体浓度是否过高:1)如果是将报警并输出 2)如果否则返回第一步继续对当前环境进行监测</p><h2 id="代码实现-烟雾监测"><a href="#代码实现-烟雾监测" class="headerlink" title="代码实现-烟雾监测"></a>代码实现-烟雾监测</h2><p>根据这个具体流程对于MQ2模块的实现功能的代码如下:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">int MQ2Pin = A0; // MQ-2传感器连接的模拟输入引脚</span><br><span class="line">int LED = 8; // LED灯连接到数字引脚8</span><br><span class="line">int threshold = 40; // 设定的气体浓度阈值</span><br><span class="line"></span><br><span class="line">void setup() {</span><br><span class="line"> pinMode(LED, OUTPUT); // 设置LED引脚为输出模式</span><br><span class="line"> Serial.begin(9600); // 开始串口通信</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">void loop() {</span><br><span class="line"> int sensorValue = analogRead(MQ2Pin); // 读取传感器值</span><br><span class="line"> Serial.println(sensorValue); // 输出传感器值到串口</span><br><span class="line"></span><br><span class="line"> if (sensorValue > threshold) {</span><br><span class="line"> // 如果传感器读数超过阈值,LED灯连续闪烁</span><br><span class="line"> digitalWrite(LED, HIGH); // 打开LED灯</span><br><span class="line"> delay(500); // 延时500毫秒</span><br><span class="line"> digitalWrite(LED, LOW); // 关闭LED灯</span><br><span class="line"> delay(500); // 延时500毫秒</span><br><span class="line"> } else {</span><br><span class="line"> digitalWrite(LED, LOW); // 如果没有超过阈值,保持LED灯关闭</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在这个代码中会持续读取MQ2传感器的数值,并将读数通过串口输出。当读数超过预定值40时,通过连续闪烁LED灯来示意,如果读数低于或等于40时,LED灯将保持关闭。</p><p>但是对于读数40这个指标目前仍不能完全作为唯一指标,这是我基于该传感器说明手册而做出的数值考量,因为在正常条件下传感器的读数通常在20到30的范围内,所以我选择将报警阈值设定略高于这个数值,作为参考来监测潜在的危险气体浓度增加的情况。</p><h2 id="传感器实现原理"><a href="#传感器实现原理" class="headerlink" title="传感器实现原理"></a>传感器实现原理</h2><p>这一部分实现的原因是通过MQ-2气体传感器的输出信号被连接到Arduino上的一个模拟输入引脚。在Arduino上,模拟输入引脚用于读取模拟信号,这些信号通常表示为0到1023之间的值,对应于0到5伏的电压。</p><p>当MQ-2传感器检测到特定浓度的气体时,它会产生一个与气体浓度成比例的电压信号。Arduino通过其模拟输入引脚读取这个电压信号,并将其转换为数字值。</p><p>这样,通过读取这个数字值,可以大致了解传感器检测到的气体浓度。而在代码中,使用 <code>analogRead(MQ2Pin);</code> 函数来读取连接到指定模拟输入引脚的传感器的值。</p><h2 id="硬件连接模拟"><a href="#硬件连接模拟" class="headerlink" title="硬件连接模拟"></a>硬件连接模拟</h2><p>由于上次商家给我发的杜邦线发错成公对公 所以目前我的模拟暂且不能实现 所以我目前只能通过软件仿真来模拟 对于软件的选择 这边我选择了在<strong>Proteus</strong>平台来进行仿真 </p><p>由于我的Arduino库中的UNO芯片缺少VCC和GND 所以我选择Nano来搭建</p><p><a href="https://ooo.0x0.ooo/2023/12/01/Orwojx.png">https://ooo.0x0.ooo/2023/12/01/Orwojx.png</a></p><h2 id="报警反馈功能实现(预实现)"><a href="#报警反馈功能实现(预实现)" class="headerlink" title="报警反馈功能实现(预实现)"></a>报警反馈功能实现(预实现)</h2><p>对于当数据异常的时候上报手机这一功能的实现 根据资料收集方案有以下三种:</p><ol><li><p><strong>使用Wi-Fi或蓝牙模块</strong>:你可以将Arduino与Wi-Fi或蓝牙模块(如ESP8266或HC-05)相连。当检测到异常数据时,Arduino可以通过这些模块发送警报到手机。对于Wi-Fi模块,你可以使用HTTP请求发送数据到一个网络服务器,然后通过服务器推送通知到手机。对于蓝牙,你可以直接与手机应用通信。</p></li><li><p><strong>使用GSM模块</strong>:GSM模块(如SIM900)可以让Arduino通过移动网络发送SMS或拨打电话。当检测到异常值时,Arduino可以自动发送警报短信或拨打预设电话号码。</p></li><li><p><strong>集成IoT平台</strong>:使用IoT平台如<strong>Blynk</strong>或<strong>Thing Speak</strong>,你可以将传感器数据发送到云端,然后通过这些平台的手机应用接收通知。</p><p>对于该系统的设计中考虑到后续要利用手机通过蓝牙或Wi-Fi模块控制报警器 我选择利用WIFI模块对其接受数据,其模块选择ESP8266开发板将MQ2传感器数据发送到手机,而对于接受和处理来自Arduino的数据设计方法有设置一个手机应用或服务器端程序,同理要想设置服务器端点来接受来自ESP8266的HTTP请求并发送警报到手机,暂时考虑为利用开发一个安卓应用程序,通过互联网从我的服务器接收数据,并在手机上显示通知。</p><p>不过未来的方案中还可以考虑利用现有的云服务来实现。之所以有这个想法也是目前我在阿里云上有两个服务器,一个是新加坡的轻量服务器,一个是在河源的云服务器ECS。我可以利用云服务器作为接收来自ESP8266的HTTP请求的后端服务器,处理这些请求,并根据需要将警报推送到手机。</p><p>如果要做到这一点,到时候需要在服务器上运行一个网络应用,比如使用Node.js或者Python Flask。这个应用将监听来自ESP8266的HTTP请求,处理这些请求(比如记录数据、分析数据),并且可以通过集成推送通知服务、发送电子邮件或短信等方式,将警报发送到我的手机。</p></li></ol><h2 id="改进与思路"><a href="#改进与思路" class="headerlink" title="改进与思路"></a>改进与思路</h2><p>如果要确定MQ-2传感器在检测烟雾时哪个数值表示出现火灾,需要考虑几个因素:</p><ol><li><p><strong>传感器校准</strong>:MQ-2传感器需要根据特定环境进行校准。不同的环境(例如湿度、温度、气压)可能影响传感器的读数。</p></li><li><p><strong>阈值设定</strong>:通常情况下,烟雾传感器的阈值需要根据实际环境和需求来设定。没有一个固定的“通用”阈值可以适用于所有情况。</p></li><li><p><strong>实验数据</strong>:建立一个准确的阈值通常需要在控制条件下进行实验,以获取传感器在正常环境和火灾情况下的读数。</p></li><li><p><strong>参考资料</strong>:有些制造商可能会提供指导性的阈值,但这些值通常只能作为一个大致的参考。</p><p>所以在实际应用中,在后续阶段我需要将它安装在家里的厨房中,对其定期测试和不断数据校准,才能得到一个准确可靠的阈值,要能够准确的根据实际情况出现报警需要大量的数据支撑,这些都是后续需要考虑和改进的地方。</p></li></ol>]]></content>
<categories>
<category> 大学 </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>Day7-20:18</title>
<link href="/2023/11/30/Day7-20-18/"/>
<url>/2023/11/30/Day7-20-18/</url>
<content type="html"><![CDATA[<h1 id="部署服务器让我难受的一比"><a href="#部署服务器让我难受的一比" class="headerlink" title="部署服务器让我难受的一比"></a>部署服务器让我难受的一比</h1><p>很成功的部署服务器失败了 从今天到晚上 部署阿里云轻量到云服务器 都失败了 看了好几篇不同人的教程资料最后还是出现了 无法成功将数据拉去到服务器的结果 而且还不给我报错! 离谱 然后我也暂时不去备案网站了</p><p>目前的问题就是 又换回Github部署的服务器后 多多少少会慢会卡 图床加载也满的情况 不过无所谓能让我正常更新博客内容就行</p><p>今天第一阶段的毕设耗材以及到了 开始着手把第一段的烟雾检测的硬件部分和软件部分给实现吧 争取在周末的时候对其进行更新总结 就这样吧</p><p>最后测试一下代码的嵌入是否可以成功</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">()</span>{</span><br><span class="line"> pinMode(<span class="number">13</span>,HIGH);</span><br><span class="line">}</span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">()</span>{</span><br><span class="line">digitalWrite(<span class="number">13</span>,HIGH);</span><br><span class="line">delay(<span class="number">500</span>);</span><br><span class="line">digitalWrite(<span class="number">13</span>,LOW);</span><br><span class="line">delay(<span class="number">500</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> Thoughts </tag>
</tags>
</entry>
<entry>
<title>Day7</title>
<link href="/2023/11/30/Day7/"/>
<url>/2023/11/30/Day7/</url>
<content type="html"><![CDATA[<h1 id="关于将GithubPage部署到国内服务器(腾讯-阿里)"><a href="#关于将GithubPage部署到国内服务器(腾讯-阿里)" class="headerlink" title="关于将GithubPage部署到国内服务器(腾讯/阿里)"></a>关于将GithubPage部署到国内服务器(腾讯/阿里)</h1><p>首先附上来自于安知鱼大佬的详细教学过程 </p><p><a href="https://blog.anheyu.com/posts/ce6a.html">https://blog.anheyu.com/posts/ce6a.html</a></p><p>大致内容我不做过多叙述 需要注意的是</p><p>1.<u>你需要一个服务器 可以是轻量服务器也可以是云服务器ECS 如果是国内服务器那么需要做好备案 如果是来自于香港或者新加坡的则不需要了 (Plus:最近阿里云有搞活动学生可免费领取代金卷购买轻量或者云服务器)</u></p><p><u>2.你需要一个域名 可以在阿里云/腾讯云购买都可以</u></p><p><u>3.熟悉一些常用的Linux指令 毕竟服务器是在Linux框架搭建的 常用的:wq!(保存) 进入vim后按i进入insert模式</u> </p><p><u>以及ctrl+c结束这些等等你需要大致掌握</u></p><p>之所以最后还是要把博客放在国内服务器的原因还是因为Github加载过慢很容易抽风,同时素材图片加载除了通过图床外,还有就是用CDN加速,而大部分CDN加速是需要有备案的,那最后我只能先选择放到国内服务器后备案,其次我当时用的SMMS图床+CFCDN把debuff给叠满了 接下来就是等审核吧 问题很简单了</p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> 服务器 </tag>
</tags>
</entry>
<entry>
<title>Day6</title>
<link href="/2023/11/29/Day6/"/>
<url>/2023/11/29/Day6/</url>
<content type="html"><![CDATA[<h1 id="究极体已经完成"><a href="#究极体已经完成" class="headerlink" title="究极体已经完成"></a>究极体已经完成</h1><p> 当我真正去尝试像一个码农一样做前端任务的时候 我发现很多时候并不是我想的那么简单 同时还会因为一些不正确的坐姿对颈椎产生极大的压力 可能这也是为什么程序员身体大部分一堆毛病吧 同时我还真切地感受到了改代码真的是从早到晚 掉头发真不是吹的 不过 无论如何 今天我基本上已经把这个小博客做到了究极体 如果说唯一欠缺的是什么呢 可能就是我没有备案目前 从而导致我不能配置CDN 从而导致我网页里很多图片会加载的很慢或者说加载不出来 这些事情还是等到年后或者工作后再去实现吧</p><p> 接下来的任务就是认真做好我的毕设并如期的在博客上给予反馈 就这样喵~</p><p> 我们下期再见!</p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> Thoughts </tag>
</tags>
</entry>
<entry>
<title>Day5</title>
<link href="/2023/11/28/Day5/"/>
<url>/2023/11/28/Day5/</url>
<content type="html"><![CDATA[<p> 最后还是用回了Butterfly这个主题 其原因还是小博主开发的主题始终功能性不强 且长期不更新等功能导致的</p><p>今天把第一阶段的耗材都给买好了 同时在Day4的文章中更新了详细的清单表 接下来的日子便是以周为单位 对毕设作品进行不断地迭代更新 同时在Blog上做出对每一次任务的完成汇报 目前还需要解决的是 不能正常在帖子内显示的图片的问题 我又在想是否要开始折腾这个小网站了…</p><p>BUT not now at least…</p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> Thoughts </tag>
</tags>
</entry>
<entry>
<title>Day4</title>
<link href="/2023/11/26/Day4/"/>
<url>/2023/11/26/Day4/</url>
<content type="html"><![CDATA[<h1 id="船需要一点点搭建"><a href="#船需要一点点搭建" class="headerlink" title="船需要一点点搭建"></a>船需要一点点搭建</h1><p> 凡是都是从小做到大的 完成一件事情的道路上会有很多的困难和疑惑 但是我相信在现在来看 很多问题都是可以找到答案的 而这一切需要支持的前提是必须有强大的死磕精神</p><p> 这个周开始 我将把毕设作品内容开始以每个板块每个内容来逐个攻克 将不同的模块和代码给实现后最后完成其整个毕设的联调</p><p> 根据进度规划 这个周即按教学周第十一周 所需要完成的事情有</p><p><u>1.采购完目前需要的原材料</u></p><p><u>2.实现对气体传感器的硬件安装并实现代码部分的监测</u></p><p><u>3.通过结合OLED显示屏将监测到的数据反馈到上面</u></p><p><u>4.并且初步在代码部分实现当数据超过国标正常值后在OLED上做出提示.</u></p><h2 id="采购清单"><a href="#采购清单" class="headerlink" title="采购清单"></a>采购清单</h2><table><thead><tr><th align="center">购买元器件</th><th align="center">数量</th><th align="center">单价</th></tr></thead><tbody><tr><td align="center">气体传感器MQ-2</td><td align="center">2</td><td align="center">7.64</td></tr><tr><td align="center">显示屏SPI 0.96寸</td><td align="center">1</td><td align="center">8.7</td></tr><tr><td align="center">杜邦线</td><td align="center">40</td><td align="center">1.7</td></tr><tr><td align="center">ESP8266开发板</td><td align="center">1</td><td align="center">11.40</td></tr><tr><td align="center">蜂鸣器</td><td align="center">1</td><td align="center">1</td></tr><tr><td align="center">塑料盒</td><td align="center">1</td><td align="center">4.3</td></tr><tr><td align="center">面包板</td><td align="center">1</td><td align="center">4.56</td></tr><tr><td align="center"><strong>合计</strong></td><td align="center"></td><td align="center">50.94(4元邮费)</td></tr></tbody></table><p>最后在星期天更新出一周的成果以及附上代码及图片显示。</p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> 毕设 </tag>
</tags>
</entry>
<entry>
<title>Day3</title>
<link href="/2023/11/24/Day3/"/>
<url>/2023/11/24/Day3/</url>
<content type="html"><![CDATA[<h1 id="慢慢来就好-别去担心太多"><a href="#慢慢来就好-别去担心太多" class="headerlink" title="慢慢来就好 别去担心太多"></a>慢慢来就好 别去担心太多</h1><p>最近很多事情加载而来 我忙着写关于毕设的开题大纲 我忙着搬家 我忙着出闲置 我忙着采集毕设材料 一件件事情交杂常常让我难以入眠 如果回到曾经住的那个Studio或许我会整夜录音 </p><p>我开始犯了一些致命的错误 我不能把太多东西压在不可控的未来身上 一些思考让我有了危机感 好 写到这里的时候 屎意来临 我先去一下 结束拉屎 继续码字</p><p>不过我只有仅省的18mins去表达完我想说的话 </p><h2 id="不要在意还没发生的事"><a href="#不要在意还没发生的事" class="headerlink" title="不要在意还没发生的事"></a>不要在意还没发生的事</h2><p>这个东西不仅仅是告诉我不要太过于忧虑 同时还告诉我并不是说未来的一些东西就是已成定局的 要有忧患意识啊 对于签好了三方协议这件事 我总想着会有退路 那么我可以放心大胆的相信未来 但是我是否就应该完全将我的未来放心在一张白纸协议上 现在我觉得错了 未来会有很多变数 如果我突然被辞退fire了 我并不是100%就能完全没有后顾之忧的 所以我必须明确的是 如果这份工作拿到了 还需要在工作上付出精力和时间才能让我的未来有保障 所以说对于接下来剩下的时间里 我还需要的是不断地加强专业类知识 同时对于考研这件事也不能完全的就给放弃开摆</p><h2 id="杀死欲望"><a href="#杀死欲望" class="headerlink" title="杀死欲望"></a>杀死欲望</h2><p>今天看了个帖子 讲到一个贫困生国家贷款欠了好几万 家里经济也很困难的情况下还想要追求昂贵的手机 那时的我处在上帝视角来看待这件事情的时候 大脑里只想着宣泄自己的情绪对她抨击 但是反过来想 自己也很多时候会有这种无止境的欲望(当然我并不处于他这种情况) 只是一味地想消费来填补野心 换句话来说这就是我一直存在的贪念 但是我常常是有这种想法但是并不一点会去实现 这也是我的ID的来源 2vain or thisisvain 都在告诉我 不要太过于追求那虚荣的东西</p><h2 id="极简就是最好"><a href="#极简就是最好" class="headerlink" title="极简就是最好"></a>极简就是最好</h2><p>对于博客现在用的主题 有时候我看到其他人使用的功能一堆 科技感拉满的主题的时候 我又开始犯病 有希望去折腾搞这些花里胡哨的 没太多意义的组件 所以我需要明确一点 博客只是一个我自己发泄想法的地方 我就想纯粹的记录一些东西 可以不用一定给任何人看 就当是给自己的 那他的作用无非就是让我记录文字 记录一些项目 这样就让我可以在任何时候点开这个网址就能找到曾经的一些痕迹 当然 那个avatar我得换一下 那个Minecraft中的钻石并不是我自己画的 没有一点成就感 等后面有机会了我再做一个绿宝石</p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> Thoughts </tag>
</tags>
</entry>
<entry>
<title>Day2</title>
<link href="/2023/11/22/Day2/"/>
<url>/2023/11/22/Day2/</url>
<content type="html"><![CDATA[<h1 id="Best-teacher-is-Interest"><a href="#Best-teacher-is-Interest" class="headerlink" title="Best teacher is Interest"></a>Best teacher is Interest</h1><p>重现建站第二天 依然出现了很多的bug和问题 不过都在我的逐个攻克下解决了 顺便还自己画了个favicon的图标(是这么拼的吗 全靠回忆)模仿了safari的指南针 虽然不是完全百分之百 但是我还是挺喜欢的 毕竟我是像素风的爱好者</p><p><strong>兴趣是最好的老师</strong> 如果不是因为处于对于博客的喜欢 我可能也不会坐在这里 宁愿去修改代码 去不断谷歌来寻找答案 突然想到自己做的音乐 如果那个时候真的喜欢 我应该像劳模般出歌吧 当然一方面是因为我懒… 但是随着时间的推移 我开始没有那么懒了 对待游戏也开始厌倦了 所以说我才能又将心思和兴趣不断扩展 </p><p><strong>不要一味的依赖他人</strong> 这是今晚我收获最大的事情 其实就是一个简单的网站莫名其妙404的原因 我一开始以为是网站没备案导致的 试图寻求大佬(贴) 后面在他的一篇帖子中正好看到了这一句话 突然觉得确实 或许我自己也能解决 生活中哪有那么多可以帮助你的人 都是靠自己琢磨和(百度+谷歌…)出来的</p><p><strong>早睡早起身体好</strong> 我需要调整作息了 接下来的日子 还是早点睡觉好 我还不希望很早就发际线越来越后移(已经有这个倾向)和掉发趋势 痛苦</p><p>END~~</p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> Thoughts </tag>
</tags>
</entry>
<entry>
<title>Day1</title>
<link href="/2023/11/21/Day1/"/>
<url>/2023/11/21/Day1/</url>
<content type="html"><![CDATA[<h1 id="如果巅峰留不住-那就走来时的路"><a href="#如果巅峰留不住-那就走来时的路" class="headerlink" title="如果巅峰留不住 那就走来时的路"></a>如果巅峰留不住 那就走来时的路</h1><p>非常头疼的是一开始我喜欢折腾导致原来的网站404 在我的摆烂和疯狂谷歌+Stack overflow都没有找到解决的方法后 我选择一切从头开始 那么这次我就走极简风格 我就把这个博客很大概率上用来存我的thoughts </p><p>最近发生了很多事情 good or bad 有时候让我措不及防 让我不知道如何应对的时候 我选择戴上耳机 进入另外一个世界 好吧 每次又想写东西的时候我电脑不在身旁 </p><p>不过总的来说 越成长 我开始把钱看的很重要 如果没有钱 我的生活将会很糟糕 虽然说穷有穷的活法 但是我不甘心就那种普通的工资 每当我骑行在厦门的道路上 每块脚下的砖头都值一万 每当我看到别人用的是昂贵的东西 我就会难受 我曾经买得起 但是当我脱离了父母的给予 想要通过自己的努力去获得的时候 显得很渺小 所以这些东西一直激励着我 哪怕会很难 我也不想要放弃 我也想要坚持和克服</p><p>Anyway!good night!</p>]]></content>
<categories>
<category> Dairy </category>
</categories>
<tags>
<tag> Thoughts </tag>
</tags>
</entry>
<entry>
<title>Hello World</title>
<link href="/2023/11/20/hello-world/"/>
<url>/2023/11/20/hello-world/</url>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
</entry>
</search>