整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

开源的硬件和软件平台-Arduino

开源的硬件和软件平台-Arduino

rduino是一种开源的硬件和软件平台,用于制作各种创意和交互式项目。Arduino的核心是一块带有微控制器的电路板,可以通过编程来控制各种传感器和执行器,实现各种功能。Arduino还提供了一个集成开发环境(IDE),可以用来编写和上传代码到电路板上。

Arduino的特点有以下几个:

-易于使用:Arduino的电路板和软件都设计得非常简单易用,适合初学者和专家。Arduino的电路板可以通过USB或者电池来供电,不需要其他复杂的外设。Arduino的软件可以在Windows、Mac OS X和Linux等操作系统上运行,提供了丰富的库和示例代码,方便用户快速入门和开发。

- 开源:Arduino的硬件和软件都是开源的,用户可以自由地修改和定制。Arduino的硬件设计文件和软件源代码都可以在官网或者GitHub上下载,用户可以根据自己的需要来改进或者扩展。

- 多样:Arduino有很多种不同的电路板,适应不同的应用场景和需求。例如,有些电路板体积小巧,适合便携式项目;有些电路板功能强大,适合复杂项目;有些电路板支持无线通信,适合物联网项目等等。Arduino还有很多种兼容或者衍生的电路板,由其他厂商或者社区提供12。

- 灵活:Arduino可以与各种传感器、执行器、显示器、模块等外部设备相连,实现各种功能。Arduino还可以与其他平台或者技术相结合,例如Python、JavaScript、MicroPython、人工智能等,实现更加智能化和创新的应用12。

Arduino的应用领域非常广泛:

- 教育:Arduino可以用于教授编程、电子、机器人等方面的知识和技能,激发学生的兴趣和创造力。Arduino还可以用于制作各种教育用的项目,例如科学实验、游戏、艺术等。

- 艺术:Arduino可以用于制作各种艺术作品,例如互动装置、灯光雕塑、音乐乐器等。Arduino还可以用于制作各种表演用的道具,例如服装、面具、道具等。

- 娱乐:Arduino可以用于制作各种娱乐用的项目,例如玩具、游戏机、无人机等。Arduino还可以用于制作各种个性化的项目,例如时钟、灯具、首饰等。

- 生活:Arduino可以用于制作各种生活用的项目,例如智能家居设备、安防系统、健康监测设备等。Arduino还可以用于制作各种实用的项目,例如温度计、湿度计、遥控器等。

- 工业:Arduino可以用于制作各种工业用的项目,例如工厂自动化系统、仓储管理系统、物流管理系统等。Arduino还可以用于制作各种测试和测量用的项目,例如示波器、电源、数字万用表等。


序一

这里我们使用Arduino Ethernet建立一个简单网页服务器,当Arduino服务器接收到浏览器访问请求时,即会发送响应消息,浏览器接收到响应消息,会将其中包含的HTML文本转换为网页显示出来。
这样就可以将传感器获取到的信息显示到网页上,每个在该网络范围内的计算机或其他移动设备,无论什么平台都可以通过网页浏览器了解到各传感器的数据。

/*
OpenJumper WebServer Example
建立一个显示传感器信息的Arduino服务器
http://www.openjumper.com/]http://www.openjumper.com/
http://x.openjumper.com/ethernet/]http://x.openjumper.com/ethernet/
*/
#include <SPI.h>
#include <Ethernet.h>
// 设定MAC地址、IP地址
// IP地址需要参考你的本地网络设置
byte mac[]={
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
// 初始化Ethernet库
// HTTP默认端口为80
EthernetServer server(80);
void setup() {
// 初始化串口通信
Serial.begin(9600);
// 开始ethernet连接,并作为服务器初始化
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
// 监听客户端传来的数据
EthernetClient client=server.available();
if (client) {
Serial.println("new client");
// 一个Http请求结尾必须带有回车换行
boolean currentLineIsBlank=true;
while (client.connected()) {
if (client.available()) {
char c=client.read();
Serial.write(c);
// 如果收到空白行,说明http请求结束,并发送响应消息
if (c=='\n' && currentLineIsBlank) {
// 发送标准的HTTP响应
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// 添加一个meta刷新标签, 浏览器会每5秒刷新一次
// 如果此处刷新频率设置过高,可能会出现网页的卡死的状况
client.println("<meta http-equiv=\"refresh\" content=\"5\">");
// 输出每个模拟口读到的值
for (int analogChannel=0; analogChannel < 6; analogChannel++) {
int sensorReading=analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("<br />");
}
client.println("</html>");
break;
}
if (c=='\n') {
// 已经开始一个新行
currentLineIsBlank=true;
}
else if (c !='\r') {
// 在当前行已经得到一个字符
currentLineIsBlank=false;
}
}
}
// 等待浏览器接收数据
delay(1);
// 断开连接
client.stop();
Serial.println("client disonnected");
}
}

下载程序后,通过浏览器,访问Arduino Ethernet所在的IP地址(如程序中设定的IP地址为192.168.1.177),即可看到网页了。

在网页中显示了A0至A5所读出的模拟值,你也可以通过修改以上程序,显示其他类型的数据。

以上程序修改自Arduino IDE自带的Web Server例程,它是通过不断刷新网页来获取Arduino反馈来完成的。实际上,在当今web开发上,我们几乎都是通过ajax不刷新网页,来与服务器通信的。这里我写了一个ajax+arduino web server的示例。

程序二

要制作这个项目,首先我们需要准备一个网页。


该网页HTML部分如下:

<!--例程网页控制Arduino -->
<!--奈何col  2014.12.24 v3.0 -->
<!--学了半小时js,求别吐槽 -->
<html>
<head>
<meta charset="UTF-8">
<title>OpenJumper!Arduino Web Server</title>
<script type="text/javascript">
function send2arduino(){
        var xmlhttp;
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
  
        element=document.getElementById("light");
        if (element.innerHTML.match("Turn on"))
          { 
                  element.innerHTML="Turn off"; 
                  xmlhttp.open("GET","?on",true);
          }
        else
          { 
                  element.innerHTML="Turn on";
                  xmlhttp.open("GET","?off",true); 
          }
        xmlhttp.send();        
}
function getBrightness(){
        var xmlhttp;
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function()
    {
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                    document.getElementById("brightness").innerHTML=xmlhttp.responseText;
            }
    }
        xmlhttp.open("GET","?getBrightness",true); 
        xmlhttp.send();        
}
window.setInterval(getBrightness,5000); 
</script>
</head>
<body>
<div align="center">
<h1>Arduino Web Server</h1>
<div>brightness:</div>
<div id="brightness">??</div>
<button id="light" type="button">Turn on</button>
<button type="button">About</button>
</div>
</body>
</html>

在该网页中,第一个id为light的button标签,用于控制开关灯。点击后,会调用send2arduino()函数,浏览器会以AJAX的方式向Arduino服务器发送含有”?on”或”?off”的GET请求。Arduino服务器通过判断请求中的内容,做出开关灯动作。
而getBrightness()函数通过一个定时操作,每秒钟运行一次,每次都以AJAX的方式向Arduino服务器发送含有”?getBrightness”的GET请求,Arduino接收到该请求后,就会读取传感器数据并返回给浏览器。同时getBrightness()函数会将id为brightness的div标签中的内容更新为返回的数据。

此外我们将A0引脚连接光敏模块,用于采集室内光线;D2引脚连接LED模块。
示例程序代码如下:

/*
OpenJumper WebServer Example
http://www.openjumper.com/ethernet/]http://www.openjumper.com/ethernet/
  
显示室内照度+开关灯控制
通过手机、平板、计算机等设备访问
Arduino Server,就看到当前室内光线照度
在A0引脚连接光敏模块,用于采集室内光线;在2号引脚连接LED模块。
  
奈何col 2014.12.25
*/
  
#include <SPI.h>
#include <Ethernet.h>
  
byte mac[]={ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
EthernetServer server(80);
EthernetClient client;
String readString=""; 
int Light=2;
int Sensor=A0;
  
void setup() {
  Serial.begin(9600);
  //初始化Ethernet通信
  Ethernet.begin(mac, ip);
  server.begin();
  pinMode(Light,OUTPUT);
  Serial.print("Server is at ");
  Serial.println(Ethernet.localIP());
}
  
void loop() {
  // 监听连入的客户端
  client=server.available();
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank=false;
    while (client.connected()) {
      if (client.available()) {
        char c=client.read();
        readString +=c;
        if (c=='\n') {
          Serial.println(readString);
          //检查收到的信息中是否有”on”,有则开灯
          if(readString.indexOf("?on") >0) {
            digitalWrite(Light, HIGH);
            Serial.println("Led On");
            break;
          }
          //检查收到的信息中是否有”off”,有则关灯
          if(readString.indexOf("?off") >0) {
            digitalWrite(Light, LOW);
            Serial.println("Led Off");
            break;
          }
          //检查收到的信息中是否有”getBrightness”,有则读取光敏模拟值,并返回给浏览器
          if(readString.indexOf("?getBrightness") >0) {
            client.println(analogRead(Sensor));
            break;
          }
          //发送HTML文本
          SendHTML();
          break;
        }        
      }
    }
    delay(1);
    client.stop();
    Serial.println("client disonnected");
    readString=""; 
  }
}
  
// 用于输出HTML文本的函数
void SendHTML()
{
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE HTML>");
  client.println("<html><head><meta charset=\"UTF-8\"><title>OpenJumper!Arduino Web Server</title><script type=\"text/javascript\">");
  client.println("function send2arduino(){var xmlhttp;if (window.XMLHttpRequest)xmlhttp=new XMLHttpRequest();else xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");element=document.getElementById(\"light\");if (element.innerHTML.match(\"Turn on\")){element.innerHTML=\"Turn off\"; xmlhttp.open(\"GET\",\"?on\",true);}else{ element.innerHTML=\"Turn on\";xmlhttp.open(\"GET\",\"?off\",true); }xmlhttp.send();}");
  client.println("function getBrightness(){var xmlhttp;if (window.XMLHttpRequest)xmlhttp=new XMLHttpRequest();else xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");xmlhttp.onreadystatechange=function(){if (xmlhttp.readyState==4 && xmlhttp.status==200)document.getElementById(\"brightness\").innerHTML=xmlhttp.responseText;};xmlhttp.open(\"GET\",\"?getBrightness\",true); xmlhttp.send();}window.setInterval(getBrightness,1000);</script>");
  client.println("</head><body><div align=\"center\"><h1>Arduino Web Server</h1><div>brightness:</div><div id=\"brightness\">");  
  client.println(analogRead(Sensor));
  client.println("</div><button id=\"light\" type=\"button\" onclick=\"send2arduino()\">Turn on</button><button type=\"button\" onclick=\"alert('OpenJumper Web Server')\">About</button></div></body></html>");
}

下载程序,并将你的Arduino接入到局域网中。现在你就可以通过浏览器访问你的Arduino了。页面的中的亮度数据,每秒回更新一次,还可以通过“Turn on”、“Turn off”按钮控制LED的开关。

需要注意的是Arduino本身的存储空间有限,存放和输出网页信息会消耗掉很多空间,因此在以上示例程序中,尽量将client.println()输出的文本行数减少,可以节省一定的存储空间。
在Arduino Ethernet控制器及扩展板上通常都带有SD卡槽,也可以尝试将网页数据放置在SD卡上,然后分段读取,并通过Ethernet输出,从而达到节省存储空间的目的。

: 通过对Arduino开发板的研究,将声控技术引入到智能系统的设计当中,实现了一套基于Arduino的语音控制系统。本文首先确定了各硬件模块的选型,并在拟定了各模块之间的通信接口后对Arduino引脚资源进行整合、分配,搭建了系统的硬件平台。在软件设计部分,编写了监控程序、功能实现程序、中断服务程序,最终实现了对机械手的语音控制以及语音播报的功能。此外,系统还增设了登录口令验证和错误识别吸收功能,从安全、效率两个方面改进系统的性能。实际应用测试表明,在低噪或无噪条件下,该系统识别精度高,稳定性好,达到了预期要求。

0 引言

随着自动化控制技术和智能化技术的飞速发展,人们开始追求轻松、有序、高效的智能化生活方式,智能家居也应运而生。然而,触屏控制、鼠标控制等传统的控制方式,它们繁复的按键操作和菜单操作不符合智能化导向,并不适用于智能系统的设计。近年来,人们的焦点开始转移到语音技术及其应用上面,国内外企业积极地拓展语音市场。智能语音产业是通过语音识别技术和语音合成技术为使用者提供各种服务的产业。语音合成技术和语音识别技术实现了简单易行的人机接口,代表了更好的用户体验度,充分体现了人性化的产品设计理念[1]。本文主要采用意大利开源Arduino Uno开发板设计了一套声控智能系统,能完成针对非特定人、小词汇量语音识别。声控技术的引入摆脱了用双手控制机械的模式,实现了真正意义上的智能,设计成果可应用于智能家居系统,这一研究可帮助和简化人们的生活,有助于开拓智能家居的新市场。

1 语音识别工作原理

语音识别技术是让机器通过识别和理解过程,把人类的语音信号转变为相应的文本或命令的技术,属于多维模式识别和智能计算机接口的范畴。模式匹配原理被目前大多数语音识别系统所采用,它将未知语音进行特征提取并与参考模式库中已知语音参考模式逐一地进行模式匹配,其中最佳匹配的参考模式被选为识别结果[2-3]。

当前语音识别技术的主流算法,主要有基于动态时间规整(DTW)方法、基于非参数模型矢量量化(VQ)方法、基于参数模型的隐马尔可夫模型(HMM)方法和基于人工神经网络(ANN)等[4]。语音识别技术可以被划分为特定人语音识别和非特定人语音识别,根据所针对的发音人的不同,特定人语音识别技术只能识别某几个人的语音,后者则可用于任何人,技术实现相对复杂但更加符合实际需要。

本系统设计选用了中文语音识别芯片LD3320,通过将待识别的内容设置成关键词列表,能实现不需要用户事先录音和训练的非特定人语音识别[5]。

2 系统设计

2.1 系统硬件平台搭建

本文设计的基于Arduino的语音识别及控制系统,是一个建立在语音识别技术基础上,并在Arduino核心处理器的控制下对输入的语音命令做出特定输出响应的系统[6]。系统包括四个部分:MCU模块、语音识别模块、语音合成模块、机械手模块。语音识别模块作为该系统的人机交互接口,用户的语音命令由此输入,其语音识别正确率决定了系统的运行质量;语音合成模块和机械手模块作为系统对外输出部分,在MCU的控制下,做出对语音输入的响应[7-8]:语音合成模块播报提示音提示系统当前状态,提供了更好的用户体验度,机械手模块则进行与命令对应的二维抓取运动。图1为系统硬件结构框图。

2.1.1 Arduino开发板

系统由源自意大利的开源、便捷灵活的开源电子原型平台Arduino Uno作为主控系统。Arduino Uno提供了丰富的引脚资源,包括14个数字I/O(DIGITAL 0~13),其中6个数字口,可提供PWM输出用于控制舵机,6个模拟I/O口(ANALOG 0~5)。其简单的开发方式利于缩短开发的周期,适合用于交互产品开发[9-10]。

2.1.2 语音识别模块

无线语音模块选用开源硬件厂商DFRobot生产的中文语音识别板DFR0177。DFR0177与Arduino之间通过同步串行外设接口(Serial Peripheral Interface,SPI)进行通信。模块的核心是LD3320中文语音识别芯片,当麦克风采集到语音信号时,LD3320发送低电平请求中断,MCU执行ASR识别流程序[11],其识别过程如图2。

2.1.3 语音合成模块

语音合成模块使用SYN6288芯片实现提示音合成,芯片提供一组全双工的异步串行通信(UART)接口实现与Arduino的数据传输。Arduino控制板将待合成语音的信息以命令帧的形式通过串口发送至SYN6288。芯片输出信号经过功率放大器和扬声器后完成语音合成[12]。

2.1.4 机械手模块

机械手由两个舵机和金属夹持器组装而成,每个舵机能控制机械手在一个维度上的运动,Arduino通过综合控制两个舵的旋转角度便能令机械手进行二自由度的活动,舵机的控制由PWM信号驱动实现[13-14]。由于舵机工作时可产生1~2 A电流,考虑到安全性和稳定性,机械手模块由外部5 V电源单独供电。

2.2 系统功能设计

本文设计了一套小型智能家居系统:基于Arduino的声控机械手,用户使用语音识别这一人机交互界面,对系统下达指令,机械手依据语音命令执行不同的操作,同时,系统能进行人性化的语音提示,播报系统当前运行的相关信息。除了实现基本的声控功能外,考虑到安全、识别正确率等因素,增加登录口令和垃圾错误吸收。

2.2.1 登录口令

为了保障系统的安全,防止授权用户以外人员的非法使用,须对系统设置相应的使用权限,如设置一条登录口令“芝麻开门”。任何使用者在进入系统前,须对系统的麦克风说出登录口令作为触发口令。若系统识别并确认了口令的正确性,则播报欢迎使用的提示音,并等待识别用户的操作命令;否则,则将该用户判定为非授权用户,进行下一轮的登录口令识别。

2.2.2 吸收错误识别

语音识别芯片的工作原理是把关键词列表中得分最高的关键词作为识别结果输出,如果用户说的关键词不在列表内必然会引起误识别,因此,可在设定好要识别的关键词列表中再添加一些额外的词汇用来吸收错误识别,从而进一步降低错误识别率。把这些待吸收的关键词语称之为“垃圾关键词语”,它的设置可以提高用户的主观使用体验。“垃圾关键词语”最好选择一些字数与关键词语相同的高频口语词,用来吸收可能发生的错误识别,比如“啊”,“哦”等。

2.3 系统软件设计

系统软件设计基于Arduino IDE软件开发环境,使用C/C++编程语言。Arduino有丰富的库文件以供使用,利用库文件简化了程序开发工作。软件设计时把整个系统程序分为三个模块:监控主程序、中断服务(ASR识别)子程序和功能实现子程序,对每个模块分别进行独立设计、编程,最后将各模块构建一个完整的工程。

2.3.1 主监控程序

监控程序作为程序的核心,主要负责芯片的初始启动工作以及调度其他程序模块,图3为系统主程序流程图。

识别芯片在正式进入识别流程前,必须先进行初始化工作,包括完成软复位、时钟频率设定、模式设定和激活内部数据处理模块,同时还须将关键字列表写入LD3320芯片的内部寄存器。这些工作均在监控程序完成。

若芯片启动失败达到一定的次数,提示启动失败并无法进行后续操作;若启动成功,系统将开始循环等待,期间如有用户下达语音命令,则进入中断并执行中断服务程序。监控程序依据中断服务程序的执行结果判断是否调度功能实现程序。

2.3.2 中断服务程序

中断服务程序在麦克风采集信号产生低电平中断后执行,主要实现一次ASR识别流,可调用LD3320库文件实现相关寄存器操作。最后将该统计学意义上最优的关键字作为最终识别结果输出,中断程序执行完后,回到中断点,继续执行监控程序[15]。

2.3.3 功能实现程序

功能实现程序用于完成一些实质性的功能,即在语音识别成功后控制舵机转动和语音播报。在中断服务程序得到正确的识别结果后,监控程序将会调用功能实现程序。功能实现程序的主体是基于switch选择语句,程序依据语音识别结果,执行不同的程序段,如发送PWM信号控制舵机转向以实现机械手左右转、张开、夹持动作,或向SYN6288发送带合成文字的GB2312编码。若识别的是垃圾关键词,系统将执行程序预设的default缺省操作。

3 实验结果及分析

搭建硬件平台并将编写的声控程序编译、烧写至开发板。对系统进行声控测试:进入系统前,若对系统的麦克风正确说出预先设置的登录口令,如“芝麻开门”,系统识别并确认了口令后播报“欢迎使用智能声控系统”的提示音,并等待识别用户后续的操作命令;如果给出错误的登录口令,系统将继续等待口令而不被触发。进入系统后,对系统分别使用“左转”、“右转”、“张开”、“夹持”、“复位”等语音命令进行多次测试,系统的识别率接近90%,各硬件模块在Arduino程序的控制下协同工作,其中机械手和语音合成模块作为系统的输出模块,也做出了预期的响应,实现了对机械手的控制以及语音播报的功能。

测试表明,该系统在无噪或低噪环境下运行良好,识别精度较高,能实现智能声控的要求。

4 结论

本文主要对基于Arduino的智能语音控制系统的设计与实现进行阐述。系统的设计工作主要包括系统硬件平台搭建以及依据功能对程序结构进行制定,编写了监控程序、中断服务程序、功能实现程序。最后经过测试,该系统运行状况良好。

在本次设计中,除了实现基本的智能声控功能外,还从安全、效率、器材选型三个方面做出创新,提高了系统的性能:(1)考虑到安全因素增设了触发口令;(2)设计垃圾关键词语达到降低误识别率的目的;(3)设计选用了当前热门的Arduino开放源代码平台作为系统的核心,Arduino以其开放性、易用性、丰富的第三方资源等优势得到了广泛注目。同时,本声控系统不需要用户事先训练和录音,属于可被任何人使用的非特定人语音识别系统,更加符合实际需要。

本智能声控系统具有体积小、功耗低和通用性好的特点,可应用于智能家居系统的设计,引入声控作为人机交互界面方便了用户的使用,实现了真正意义上的智能,具有一定的实用价值。

参考文献

[1] 刘露.智能语音时代来临[J].课外语文,2014(5):11-12,17.

[2] 詹新明,黄南山,杨灿.语音识别技术研究进展[J].现代计算机(专业版),2008(9):43-45.

[3] 王敏妲.语音识别技术的研究与发展[J].微型机与应用,2009,28(23):1-2,6.

[4] 马志欣,王宏,李鑫.语音识别技术综述[J].昌吉学院学报,2006(3):93-97.

[5] 洪家平.LD3320的嵌入式语音识别系统的应用[J].单片机与嵌入式系统应用,2012,12(2):47-53.

[6] 杨继志,郭敬.Arduino的互动产品平台创新设计[J].单片机与嵌入式系统应用,2012,12(4):39-41.

[7] 程晨.Arduino开发实战指南[M].北京:机械工业出版社,2012.

[8] 孙俊荣,吴明展,卢聪勇.Arduino一试就上手[M].北京:科学出版社,2012.

[9] ICRouter.LD332x数据手册[EB/OL].(2010-10-11)[2015-04-02]http://www.icroute.com/web_cn/DownLoad.html#LD332X-DataSheet.

[10] 语音天下.SYN6288中文语音合成芯片数据手册[EB/OL].(2011-09-06)[2015-04-27]http://www.tts168.com.cn/bao/SYN6288--Manual.pdf.

[11] 蔡睿妍.基于Arduino的舵机控制系统设计[J].电脑知识与技术,2012,8(15):3719-3721.

[12] 孙兵.基于单片机的机械手声控系统设计[J].机械工程与自动化,2007(6):113-114,117.

[13] ADRIANSYAH A, DANI A W. Design of small smart home system based on Arduino[J]. Electrical Power, Electronics, Communications, Controls and Informatics Seminar (EECCIS), 2014(10):121-125.

[14] KANG B, LIU F, YUN Z, et al. Design of an Internet of Things-based smart home system[C]. Harbin: Lligent Control and Information Processing(ICICIP), 2011:921-924.

[15] 金鑫,田犇,阙大顺.基于LD3320的语音控制系统设计实现[J].电脑与信息技术,2011,19(6):22-25.


上一篇:css实现网格布局
下一篇:「jQuery-6」 ajax