arduino 语音音箱 :语音控制、MP3播放、报时、回复温湿度情况
arduino 语音音箱 :语音控制、MP3播放、报时、回复温湿度情况
效果图
线路图
包装后的效果
功能
需要材料
- arduino板
- MP3播放模块及喇叭
- 时钟模块
- 温湿度模块
- 语音识别模块
- 面包板及其他线材、电阻
- TF卡(用于储存音频)
原理
- 通过语音识别模块对使用者的语音指令进行与设置的指令匹配,匹配成功调用MP3模块播放对应音乐。
- 因为MP3播放需要一定的delay,但是由于系统自带的delay会阻塞arduino的操作,因此需要将大的延迟拆分成许多小块,每执行一个小块,就调用一次语音识别模块,使其能在有指令后能快速反应。
- 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支持库)的二次封装。
传统开发方式中,你需要厘清每个寄存器的意义及之间的关系,然后通过配置多个寄存器来达到目的。
代码
//引入依赖
#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();
}
参考链接
【4】LD3320 Board
【6】MP3音乐播放器模块 示例教程 适用于Arduino平台
arduino 语音音箱 :语音控制、MP3播放、报时、回复温湿度情况的更多相关文章
- 客服小妹是如何泡到手的——C#定时提醒·语音录制·语音播放·文件转录Demo源码——倾情奉献!
一.需求提出 客服小妹跟我说,每天要统计新加好友数,得先记下昨天的数目,然后查看今天的数目,还要相减,打字,记录——好麻烦! 又说,客户多的时候,忙起这头忘了那头,文字记录备忘又太费劲! 我说,赐你一 ...
- 从零开始学习PYTHON3讲义(十四)写一个mp3播放器
<从零开始PYTHON3>第十四讲 通常来说,Python解释执行,运行速度慢,并不适合完整的开发游戏.随着电脑速度的快速提高,这种情况有所好转,但开发游戏仍然不是Python的重点工作. ...
- android之MP3播放器(1)
该播放器只是对本地的MP3文件进行简单的播放 布局文件 布局文件中设置了三个按钮分别来进行播放.暂停和继续播放 <?xml version="1.0" encoding=&q ...
- 你用java的swing可以做出这么炫的mp3播放器吗?
这个mp3播放器是基于java的swing编写的,我认为界面还是可以拿出来和大家看一看评一评. 先说说创作的初衷,由于前段时间工作不是很忙,与其闲着,还不如找一些东西来给自己捣腾捣腾,在 之前写的 j ...
- Android讯飞语音云语音听写学习
讯飞语音云语音听写学习 这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...
- Android中通过耳机按键控制音乐播放的实现
今天在研究Android中实现Android 4.2.2源码中的Music应用的源码,关于通过耳机按键控制音乐播放的实现,有点好奇,就仔细分析了一下源码, 主要由 MediaButtonIntentR ...
- 一个MP3播放的插件jPlayer
Jplayer小样 最近应公司要求需要一个MP3播放的插件,网上找了很多插件,看来看去还是jPlayer用着最舒服也最容易扩展.所以就找了个资料研究了下,简单做了个小DEMO.支持实时控制列表,常 ...
- 基于Stm32的MP3播放器设计与实现
原创博文,转载请注明出处 这是我高级电子技术试验课做的作业,拿来共享一下.项目在安福莱例程基础之上进行的功能完善,里面的部分内容可参考安福莱mp3例程.当然用的板子也是安福莱的板子,因为算起来总共做了 ...
- web简易MP3播放插件 Aplayer篇章一
效果如图所示: 写入初始代码,定义一个id唯一的div player1 <!DOCTYPE html> <html> <head> <meta charset ...
随机推荐
- postgis 赋予postgresql空间数据库的能力
安装: Windows:postgresql的bin目录下:运行stackbuilder,一步一步按照提示来就行了 Ubuntu: apt-get install postgresql-9.3-pos ...
- Gym 101047M Removing coins in Kem Kadrãn
给定一个序列,只能拿走D,隔壁的会翻转,问能否全部拿走. 注意到如果能拿走的话,拿D的顺序是没关系的.模拟即可 #include <cstdio> #include <cstdlib ...
- POI 博客总结.....
主键类: HSSFRow row1= sheet.createRow(1); row.createCell(0).setCellValue("学生编号"); row.createC ...
- 【踩坑】vue 无法让后台保存 session
今天在调试 iblog 客户端时,发现登录后进行增加.删除.更新操作时都提示还没有登录. 此问题曾经在用 ajax 调试时出现过,解决办法是,在请求时带上 creditials: true ,即让发出 ...
- Java基础反射-调用类
Student类 package com.test.wang; import java.lang.reflect.Constructor; import java.lang.reflect.Field ...
- 微信小程序时间处理问题
环境: 开发环境: 1. Mac OS 10.12.5 2. 微信Web开发者工具 v0.18.182200 测试环境: 1. iPhone 7 2. iOS 10.3.2 3. 微信 6.5.9 问 ...
- Apache activiti5.13工作流框架的表结构详解
1.结构设计 1.1. 逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的 ...
- centos yum 安装mysql5.7 以及 默认root密码查看
1. 首先更新rpm 从MySQL Yum仓库下载最新的rpm文件:http://dev.mysql.com/downloads/repo/yum/ (需要Oracle帐号以及填写一些使用信息,才能 ...
- java网络编程—TCP(1)
演示tcp的传输的客户端和服务端的互访. 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1,建立socket服务.指定要连接主机和端口. 2,获取socket流中的输出流. ...
- [转]c语言宏定义#define的理解与资料整理
原文地址:http://www.cnblogs.com/haore147/p/3646934.html 1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也 ...