我是靠谱客的博主 贪玩玫瑰,这篇文章主要介绍arduino 语音音箱 :语音控制、MP3播放、报时、回复温湿度情况arduino 语音音箱 :语音控制、MP3播放、报时、回复温湿度情况 ,现在分享给大家,希望可以做个参考。

arduino 语音音箱 :语音控制、MP3播放、报时、回复温湿度情况

效果图

线路图

包装后的效果

功能

需要材料

  1. arduino板
  2. MP3播放模块及喇叭
  3. 时钟模块
  4. 温湿度模块
  5. 语音识别模块
  6. 面包板及其他线材、电阻
  7. TF卡(用于储存音频)

原理

  1. 通过语音识别模块对使用者的语音指令进行与设置的指令匹配,匹配成功调用MP3模块播放对应音乐。
  2. 因为MP3播放需要一定的delay,但是由于系统自带的delay会阻塞arduino的操作,因此需要将大的延迟拆分成许多小块,每执行一个小块,就调用一次语音识别模块,使其能在有指令后能快速反应。
  3. MP3模块的使用需要按指定格式,例如文件名需要按照指定格式命名。中间有部分音频做为音箱的人机交互的对话。

理论知识

Arduino是一个基于开放原始码的软硬件平台,可用来开发独立运作、并具互动性的电子产品,也可以开发与PC相连的周边装置,同时能在运行时与PC上的软件进行交互。为了测量正弦波电压有效值,首先我们设计了单电源供电的半波整流电路,并进行整流滤波输出,然后选择了通过Arduino设计了读取电压有效值的程序,并实现使用此最小系统来测量和显示电压有效值。在频率和直流电压幅度限定在小范围的情況下,最小系统的示数基本和毫伏表测量的值相同。根据交流电压有效值的定义,运用集成运放和设计的Arduino最小系统的结合,实现了运用少量元器件对交流电压有效值的测量。

实验目的

在很多人眼里依旧是新潮玩意的智能音箱,往往具备智能家居声控中心和个人助理两大核心功能。通过智能音箱可以实现对家居中的智能电器进行联网和语音控制,同样也可完成日常安排、订餐厅、叫车、阅读、翻译、通话等类似个人助理的功能。智能音箱的优势在于其能够通过语音实现“隔空操作”,在人们不方便使用手机或其他电子设备时提供帮助。

智能音箱首先承载的功能是音乐播放,其次是联网智能,因此,音乐娱乐市场的繁荣程度是音箱普及的前提条件。

通过智能音箱可以控制智能灯泡、窗帘、安全监控等智能家居产品,因此未来智能音箱的普及将大大提升家庭语音交互的使用频率,从而带动智能家居行业进入实质性发展阶段。

主要功能

1、开机语音:欢迎使用语音音箱;

2、询问温湿度情况:她会及时做出反应,播报当前温度和湿度;

3、命令随机:会随机播放任何一首音乐,TF里共存储20首音乐;

4、命令暂停:暂停当前正在放的音乐;

5、命令继续,继续播放已暂停的歌;

6、加大/降低音量:在播放过程中,可以用语音控制加大或者调低音量;

7、上一首/下一首:切换前一首或下一首歌曲。

前期准备知识

C语言

Arduino使用C/C++编写程序,虽然C++兼容C语言,但这是两种语言,C语言是一种面向过程的编程语言,C++是一种面向对象的编程语言。早期的Arduino核心库使用C语言编写,后来引进了面向对象的思想,目前最新的Arduino核心库采用C与C++混合编写而成。

通常我们说的Arduino语言,是指Arduino核心库文件提供的各种应用程序编程接口(Application Programming Interface,简称API)的集合。这些API是对更底层的单片机支持库进行二次封装所形成的。例如,使用AVR单片机的Arduino的核心库是对AVR-Libc(基于GCC的AVR支持库)的二次封装。

传统开发方式中,你需要厘清每个寄存器的意义及之间的关系,然后通过配置多个寄存器来达到目的。

代码

复制代码
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
//引入依赖 #include <LiquidCrystal.h> #include <ld3320.h> #include <stdlib.h> #include <SoftwareSerial.h> //软串口头文件名 #include <DFPlayer_Mini_Mp3.h> //MP3头文件名 #include <Wire.h> #include <RTClib.h> #include <DHT.h> #include <DHT_U.h> #define DHTPIN 14 #define DHTTYPE DHT11 #define Led A1 #define MP3GO A3 void showTimeAndDHT(); void play(); void defa(); int recoderRun(); int myDelay(int t); int random_play(); int getRandom(); RTC_DS1307 RTC; VoiceRecognition Voice; DHT dht(DHTPIN, DHTTYPE); byte heart[8] = {0b00100, 0b01000, 0b11000, 0b11111, 0b00011, 0b00010, 0b00100, 0b00000}; int theVo = 25; // 初始化针脚 const int rs = 3, en = 5, d4 = 6, d5 = 7, d6 = 8, d7 = 10; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); int myDelay(int t) { int c = 0; c = t / 100; for (int i = 0; i < c; i++) { delay(100); if (!recoderRun()) return 0; } return 1; } int getRandom() { int i = 30; randomSeed(RTC.now().second()); i = random(53); while ((i >= 0 && i <= 10) || (i >= 21 && i <= 29)) { i = random(53); } return i; } int random_play() { int i = 30; i = getRandom(); mp3_play(i); // if (!myDelay(300000)) // return 0; delay(5000); while(1) { if(!myDelay(1500)) return 0; if(digitalRead(MP3GO) == HIGH) { i = getRandom(); mp3_play(i); } } return 1; } void setup() { // 设定LCD 的行列数目(2 x 16) pinMode(MP3GO, INPUT); lcd.begin(16, 2); Serial.begin(9600); Wire.begin(); RTC.begin(); RTC.adjust(DateTime(__DATE__, __TIME__)); lcd.createChar(1, heart); lcd.write(1); //Serial.println(F("DHTxx test!")); dht.begin(); Serial.begin(9600); //串口波特率,9600 mp3_set_serial(Serial); //定义MP3串口为Arduino串口。 mp3_set_volume(theVo); //设置音量。 Voice.init(); //初始化VoiceRecognition模块 Voice.addCommand("kai deng", 0); //添加指令,参数(指令内容,指令标签(可重复)) Voice.addCommand("guan deng", 1); //添加指令,参数(指令内容,指令标签(可重复)) Voice.addCommand("xia yi shou", 2); Voice.addCommand("shang yi shou", 3); Voice.addCommand("zhan ting", 4); Voice.addCommand("ji xu", 5); Voice.addCommand("ting zhi", 6); Voice.addCommand("sui ji yin yue", 7); Voice.addCommand("xian zai shi jian", 8); Voice.addCommand("wen shi du qing kuang", 9); Voice.addCommand("xian zai wen shi du", 10); Voice.addCommand("jia da yin liang", 11); Voice.addCommand("jiang di yin liang", 12); Voice.addCommand("bo fang yin yue ba", 13); Voice.addCommand("guan ji",14); Voice.start(); //开始识别 pinMode(Led, OUTPUT); //初始化LED引脚为输出模式 digitalWrite(Led, LOW); //LED引脚低电平 //showTimeAndDHT(); defa(); play(); } void showTimeAndDHT() { lcd.setCursor(0, 0); lcd.write(1); float h = dht.readHumidity(); float t = dht.readTemperature(); float hic = dht.computeHeatIndex(t, h, false); lcd.print('T'); lcd.print(':'); lcd.print(hic); lcd.print(' '); lcd.print('H'); lcd.print(':'); lcd.print(h); lcd.print(' '); lcd.setCursor(0, 1); DateTime now = RTC.now(); lcd.print(now.year()); lcd.print('/'); lcd.print(now.month()); lcd.print('/'); lcd.print(now.day()); lcd.print(' '); lcd.print(now.hour()); lcd.print(':'); lcd.print(now.minute()); } void play() { mp3_play(23); delay(2000); } int whatTH() { int h = 0, m = 0, hic = 0, t = 0; if (!myDelay(1000)) return 0; mp3_stop(); showTimeAndDHT(); t = dht.readTemperature(); h = (int)dht.readHumidity(); hic = (int)dht.computeHeatIndex(t, h, false); mp3_stop(); mp3_play(26); if (!myDelay(2000)) return 0; if (t / 10 > 0) { mp3_play(t / 10); if (!myDelay(600)) return 0; mp3_play(10); if (!myDelay(600)) return 0; } if (t % 10 != 0) { mp3_play(t % 10); if (!myDelay(600)) return 0; } if (t == 0) { mp3_play(2); if (!myDelay(600)) return 0; mp3_play(10); if (!myDelay(600)) return 0; mp3_play(4); if (!myDelay(600)) return 0; } if (!myDelay(1000)) return 0; mp3_play(24); myDelay(800); if (h / 10 > 0) { mp3_play(h / 10); if (!myDelay(600)) return 0; mp3_play(10); if (!myDelay(600)) return 0; } if (h % 10 != 0) { mp3_play(h % 10); if (!myDelay(600)) return 0; } mp3_stop(); defa(); Voice.read(); return 1; }; int whatTime() { int h = 0, m = 0, hic = 0, t = 0; showTimeAndDHT(); mp3_stop(); if (!myDelay(1000)) return 0; mp3_play(25); if (!myDelay(2000)) return 0; h = (int)RTC.now().hour(); if (h / 10 > 0) { mp3_play(h / 10); if (!myDelay(600)) return 0; mp3_play(10); if (!myDelay(600)) return 0; } if (h % 10 != 0) { mp3_play(h % 10); if (!myDelay(600)) return 0; } if (h == 0) { mp3_play(2); if (!myDelay(600)) return 0; mp3_play(10); if (!myDelay(600)) return 0; mp3_play(4); if (!myDelay(600)) return 0; } mp3_play(21); if (!myDelay(600)) return 0; m = (int)RTC.now().minute(); if (m / 10 > 0) { mp3_play(m / 10); if (!myDelay(600)) return 0; mp3_play(10); if (!myDelay(600)) return 0; } if (m % 10 != 0) { mp3_play(m % 10); if (!myDelay(600)) return 0; } if (m != 0) { mp3_play(22); if (!myDelay(600)) return 0; } mp3_stop(); defa(); Voice.read(); return 1; } int recoderRun() { int h = 0, m = 0, hic = 0, t = 0; switch (Voice.read()) //判断识别 { case 0: //若是指令“kai deng” //digitalWrite(Led, HIGH); //点亮LED break; case 1: //若是指令“guan deng” //digitalWrite(Led, LOW); //熄灭LED break; case 2: //mp3_stop (); mp3_play(28); delay(2500); Voice.read(); if (!random_play()) return 0; break; case 3: //mp3_stop (); mp3_prev(); break; case 4: mp3_pause(); break; case 5: mp3_play(); //mp3_random_play(); break; case 6: mp3_stop(); break; case 13: case 7: mp3_play(29); delay(2500); Voice.read(); if (!random_play()) return 0; break; case 8: whatTime(); defa(); break; case 9: case 10: whatTH(); defa(); break; case 11: theVo += 2; mp3_set_volume(theVo); break; case 12: theVo -= 2; mp3_set_volume(theVo); break; case 14: Voice.reset(); default: return 1; break; } delay(100); return 0; } void defa() { lcd.clear(); lcd.setCursor(0, 0); lcd.write(1); lcd.print("Intellgent MP3"); lcd.setCursor(0, 1); lcd.print("la la la ~"); } void loop() { recoderRun(); }

参考链接

【1】Arduino连接LCD1602显示屏

【2】Arduino使用蓝牙通信模块

【3】使用Arduino Uno输出自定义频率的PWM

【4】LD3320 Board

【5】Arduino系列教程十:语音识别模块 LD3320

【6】MP3音乐播放器模块 示例教程 适用于Arduino平台

【7】DFPlayer Mini模块

转载于:https://www.cnblogs.com/boxker/p/10820152.html

最后

以上就是贪玩玫瑰最近收集整理的关于arduino 语音音箱 :语音控制、MP3播放、报时、回复温湿度情况arduino 语音音箱 :语音控制、MP3播放、报时、回复温湿度情况 的全部内容,更多相关arduino内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部