语音助手-智能家居

 

 

  • 文章结构:
  •  项目概述
  • 成品预览
  • 项目框架
  • 文档,代码
  • 项目槽点

 

-项目概述-

寝室里,我离门最远,寝室的大学牲小朋友们却总是早早的爬上了床,要我去开门关灯,这很烦!

技术宅需要解放生产力。要不,弄一个语音助手吧!

 目的:

  • 语音控制所有接入接口的开关器件
  • PWM分级控制模拟量器件(如灯的亮度)
  • 多种电平兼容
  • 场景分离控制(如主卧的灯,次卧的灯)
  • 自定义APP(可选择WiFi连接)
  • 屏幕显示接入设备,设备在线显示,离线警告,电压显示,温度显示,时显
  • 可在断网情况下手动控制

-项目预览-

 

-项目框架-

主要思路:小爱同学接入点灯科技,点灯科技留出接口供ESP8266使用,ESP8266与51串口通讯,51控制所有硬件外设。

项目框架如下:

 

 

-项目代码-

主框架代码很简单,如下:

  1 #define BLINKER_WIFI
  2 #define BLINKER_MIOT_LIGHT 
  3 #include <Blinker.h>
  4 
  5 #define LED   2  
  6 char auth[] = "077eb2b1e5a6"; // blinker 秘钥
  7 char ssid[] = "PotatoWorld";  // wifi 名字
  8 char pswd[] = "jrj827508";    // wifi 密码
  9 
 10 bool wsState;
 11 
 12 uint8_t wsMode = BLINKER_CMD_MIOT_DAY;
 13 // 新建组件对象
 14 BlinkerButton Button1("btn-abc");//注意:要和APP组件’数据键名’一致
 15  
 16 // 按下BlinkerAPP按键即会执行该函数
 17 void button1_callback(const String & state) {
 18  BLINKER_LOG("get button state: ", state);
 19  digitalWrite(D3, !digitalRead(D3));
 20  digitalWrite(LED, !digitalRead(LED)); 
 21  Blinker.vibrate();
 22 }
 23  
 24 //小爱电源类操作的回调函数:
 25 //当小爱同学向设备发起控制, 设备端需要有对应控制处理函数 
 26 void miotPowerState(const String & state)
 27 {
 28     BLINKER_LOG("need set power state: ", state);
 29 
 30     if (state == BLINKER_CMD_ON) {
 31         //digitalWrite(LED_BUILTIN, LOW);
 32         digitalWrite(D3, HIGH);
 33         BlinkerMIOT.powerState("on");
 34         BlinkerMIOT.print();
 35     }
 36     else if (state == BLINKER_CMD_OFF) {
 37         //digitalWrite(LED_BUILTIN, HIGH);
 38         digitalWrite(D3, LOW);
 39         BlinkerMIOT.powerState("off");
 40         BlinkerMIOT.print();
 41     }
 42 }
 43 
 44 void miotMode(uint8_t mode)
 45 {
 46     BLINKER_LOG("need set mode: ", mode);
 47 
 48     if (mode == BLINKER_CMD_MIOT_DAY) {
 49         
 50     }
 51     else if (mode == BLINKER_CMD_MIOT_NIGHT) {
 52         
 53     }
 54     else if (mode == BLINKER_CMD_MIOT_COLOR) {
 55        
 56     }
 57     else if (mode == BLINKER_CMD_MIOT_WARMTH) {
 58       
 59     }
 60     else if (mode == BLINKER_CMD_MIOT_TV) {
 61        
 62     }
 63     else if (mode == BLINKER_CMD_MIOT_READING) {
 64         // 床上灯光
 65         digitalWrite(D1, HIGH); 
 66     }
 67     else if (mode == BLINKER_CMD_MIOT_COMPUTER) {
 68         
 69         digitalWrite(D1, LOW);
 70     }
 71 
 72     wsMode = mode;
 73 
 74     BlinkerMIOT.mode(mode);
 75     BlinkerMIOT.print();
 76 }
 77 
 78 void setup() {
 79  // 初始化串口,并开启调试信息,调试用可以删除
 80  Serial.begin(115200); 
 81  pinMode(D1, OUTPUT);
 82  digitalWrite(D1, LOW);
 83  
 84  BLINKER_DEBUG.stream(Serial);
 85  // 初始化IO
 86  pinMode(LED, OUTPUT); 
 87  pinMode(D1, OUTPUT);
 88  pinMode(D3, OUTPUT);
 89  
 90  digitalWrite(LED, HIGH); // 初始化 led 高电平 ,则灯熄灭状态
 91  digitalWrite(D3, LOW);
 92  digitalWrite(D1, LOW);
 93  
 94  
 95  // 初始化blinker
 96  Blinker.begin(auth, ssid, pswd);
 97  Button1.attach(button1_callback);
 98  
 99  //小爱同学务必在回调函数中反馈该控制状态 
100  BlinkerMIOT.attachPowerState(miotPowerState);//注册回调函数
101  BlinkerMIOT.attachMode(miotMode);
102 }
103 
104 
105 void loop() {
106  Blinker.run();
107 }

 

  • 点灯科技的开发文档:http://diandeng.tech/doc
  • 点灯科技接入ESP8266详细教程:http://www.bilibili.com/video/BV1jg4y1q7mQ/
  • 点灯科技接入米家:http://zhuanlan.zhihu.com/p/128643917

 

-项目槽点-

 

本文转载于网络 如有侵权请联系删除

相关文章

  • 第六届“蓝帽杯”全国大学生网络安全技能大赛

    Miscdomainhacker公司安全部门,在流量设备中发现了疑似黑客入侵的痕迹,用户似乎获取了机器的hash,你能通过分析流量,找到机器的hash吗?flag格式:flag{hash_of_machine} 附件下载提取码(GAME)备用下载提取rar在流量中找到base64解码得到密码:SecretsPassw0rds最后得到机器的hash电子取证【电子取证部分场景加密附件,密码比赛当天给出】计算机取证.zip下载:https://pan.baidu.com/s/1Unu92jvwT-AFXI0WIra84g提取码:GAMEmd5值:7cbd6324eacbedf177fee722983abff4;手机取证.zip下载:https://pan.baidu.com/s/1xnylfPDP1sw1nzze2V2s7A提取码:GAMEmd5值:911d5f9572ec7d991a0531400f522011手机取证_1现对一个苹果手机进行取证,请您对以下问题进行分析解答。 627604C2-C586-48C1-AA16-FF33C3022159.PNG图片的分辨率是?(答案参考格式:1

  • 倒计时1天|今年,我们想和你谈谈“数实融合”

    这次大会我们将向您展示更多的硬核技术创新成果这次大会我们将与客户共同讲述产业数字化那些最佳实践   这次大会我们将携手伙伴,为你展示更多“开放”的力量

  • 统计学学术速递[7.8]

    stat统计学,共计42篇【1】RobustVariableSelectionandEstimationViaAdaptiveElasticNetS-EstimatorsforLinearRegression 标题:基于自适应弹性网S-估计的线性回归稳健变量选择与估计 作者:DavidKepplinger 机构:DepartmentofStatistics,SchoolofComputing,GeorgeMasonUniversity 链接:https://arxiv.org/abs/2107.03325 摘要:重尾误差分布和具有异常值的预测因子在高维回归问题中普遍存在,如果处理不当,会严重影响统计分析的有效性。为了在这些不利条件下得到更可靠的估计,我们提出了一种新的鲁棒正则化估计,用于同时进行变量选择和系数估计。这种估计器称为自适应PENSE,它具有oracle性质,没有残差尺度的先验知识,也没有误差分布的任何矩条件。所提出的估计器即使在非常重尾误差分布和预测因子或残差的异常污染情况下也能给出可靠的结果。重要的是,即使在这些具有挑战性的设置变量选择自适应彭斯保持稳定。对模拟数据集和真

  • 「HTML+CSS」--自定义加载动画【038】

    前言Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ 哈哈自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,有幸拿过国奖、省奖等,已保研。目前正在学习C++/Linux(真的真的太难了~) 学习经验:扎实基础+多做笔记+多敲代码+多思考+学好英语! 日常分享:微信公众号【海轰Pro】记录生活、学习点滴,分享一些源代码或者学习资料,欢迎关注~效果展示Demo代码HTML<!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <metahttp-equiv="X-UA-Compatible"content="IE=edge"> <metaname="viewport"content="width=device-width,initial-scale=1.0&qu

  • 数字人民币落地最后一公里,大数据和 AI 将如何改变金融

    这个五一假期,你用上数字人民币红包了吗?还在试点中的数字人民币已然强势来袭,不但落地北京、上海、深圳、成都、长沙、海南等十几个城市,除了线下支付,还对接了美团、京东、滴滴和B站等十几个第三方平台。过去的五年间,支付宝和微信代表的移动支付开启了“无现金时代”,颠覆了整个社会对于货币的认知。而如今,带有国家属性的数字人民币杀入支付市场,或许将颠覆目前的移动支付格局。数字人民币的全称是DCEP(DigitalCurrencyElectronicPayment),即数字货币电子支付,是中国人民银行发行的数字形式的法定货币。简单来说,就是纸质人民币的数字化,功能和属性同纸质人民币完全一样,每张数字人民币也有唯一编号。区别于比特币这样私人发行的虚拟货币,央行发行的数字货币是法币,具有国家信用、法偿性,其效力和安全性也最高。单从这一点来说,它与支付宝微信这类第三方支付手段都不构成竞争关系,因为这两者就不在同一个维度上。以后的商家可以说不接受微信、支付宝,但是说拒绝数字人民币则是违法的。由此可见,数字货币带来的不只是一种新的支付方式,更是可能颠覆现有支付行业的格局。据悉,目前工、农、中、建、交、邮储等

  • pytorch报错RuntimeError: DataLoader worker (pid(s) xxx) exited unexpectedly

    报错pytorch报错RuntimeError: DataLoaderworker(pid(s)...exitedunexpectedly解决因为torch.utils.data.DataLoader中设置了num_works=4,也就是多线程读取。根据其他方法,我设置num_works=1或者num_works=0都不行。最后重装了pytorch,就可以了。pipinstalltorch==1.5.1+cu101torchvision==0.6.1+cu101-fhttps://download.pytorch.org/whl/torch_stable.html复制原因分析过程中显示下面内容,所以,可能是因为有些包用pipinstall的时候没装上吧。Thefollowingpackageswillbedownloaded: package|build ---------------------------|----------------- certifi-2020.6.20|py36_0160KBhttps://mirrors.tuna.tsinghua.edu.cn/anac

  • Redis入坟(五)持久化

    Redis速度快,很大一部分原因是因为它所有的数据都存储在内存中。如果断电或者宕机,都会导致内存中的数据丢失。为了实现重启后数据不丢失,Redis提供了两种持久化的方案,一种是RDB快照(RedisDataBase),一种是AOF(AppendOnlyFile)。RDBRDB是Redis默认的持久化方案。当满足一定条件的时候,会把当前内存中的数据写入磁盘,生成一个快照文件dump.rdb。Redis重启会通过加载dump.rdb文件恢复数据。什么时候写入rdb文件?RDB触发自动触发 a)配置规则触发。 redis.conf,SNAPSHOTTING,其中定义了触发把数据保存到磁盘的触发频率。如果不需要RDB方案,注释save或者配置成空字符串""。save9001#900秒内至少有一个key被修改(包括添加) save30010#400秒内至少有10个key被修改 save6010000#60秒内至少有10000个key被修改复制注意上面的配置是不冲突的,只要满足任意一个都会触发。 RDB文件位置和目录:#文件路径, dir./ #文件名称 dbfilenamed

  • 【剑指offer】用两个栈实现队列

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/weixin_42449444/article/details/90109214题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。解题思路:入栈时直接把元素推入stack1,出栈时需要借助stack2来实现像队列一样“先进先出”。当stack2不为空时,先将stack2中的元素一一取出;当stack2为空时,把stack1中的元素全部推入stack2,这样stack1的栈底元素就会出现在stack2的栈顶,stack1的栈顶元素就会出现在stack2的栈底。最后将stack2的元素一一取出,这样就能通过俩个栈来实现像队列一样“先进先出”的操作。AC代码:classSolution { public: voidpush(intnode) { stack1.push(node); } intpop() { if(stack2.empty()) { while(!stack1.empty()) { s

  • Docker 常用操作命令

    文章首发于微信公众号《程序员果果》地址:https://mp.weixin.qq.com/s/S9VkzSJx_JOY8zDiC_nuEg1.启动容器dockerrunIMAGE[COMMAND][ARG...]复制IMAGE是指启动容器所使用的操作系统镜像COMMAND指的是容器启动后运行的命令及其参数2.启动交互式容器#启动交互式容器 dockerrun-i-tIMAGE/bin/bash #退出交互式容器的bash,这样容器就会在后台运行 Ctrl+P+Q复制在run命令中增加了两个参数-i-t,并在容器启动时运行bash命令i--interactive=true|fasle默认是falseundefined用来告诉docker守护进程为容器始终打开标准输入-t--tty=true|false默认是falseundefined告诉docker要为创建的容器分配一个--tty终端,这样新创建的容器才能提供一个交互式的shell3.启动守护式容器dockerrun-d镜像名[COMMAND][ARG...]复制-d是指以后台的形式运行命令4.查看运行的容器dockerps[-a][

  • AJAX开发教程之$.ajax常用方法详解

    AJAX是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分。接下来通过本文给大家介绍ajax一些常用方法,大家有需要可以一起学习。1.url:要求为String类型的参数,(默认为当前页地址)发送请求的地址。2.type:要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持。3.timeout:要求为Number类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设置。4.async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为false。注意,同步请求将锁住浏览器,用户其他操作必须等待请求完成才可以执行。5.cache:要求为Boolean类型的参数,默认为true(当dataType为script时,默认为false),设置为false将不会从浏览器缓存中加载请求信息。6.data:要求为Object或String类型的参数,发送到服务器的数据。如果已经不是字

  • 腾讯云AI临床助手产品概述

    AI临床助手((AIClinicalAssistant,ACA),基于大数据、语义分析、病历结构化等AI技术,打造集“临床辅助决策、合理用药管理、智能前置审方、智能处方点评”于一体的临床解决方案,覆盖病历质控、用药安全、继续教育等多个应用场景,为临床工作提供智慧支持,为广大基层医院、医联体、综合医院等医疗机构提供智能服务,协助提升医疗服务效率,推动医疗服务标准化。 产品优势精准疾病预测基于病历信息,结合疾病医学图谱与AI算法,精准预测550+种常见病,泛化预测覆盖3000+种疾病,TOP5推荐诊断准确率95.78%。 丰富医学知识库由人民卫生出版社定制化生产,提供临床指南、药品说明书、药品规则库、中药百科、教学视频、医学计算器等丰富的医学知识,满足医生/药师查询了解、学习及提升的需求。 AI技术能力提供病历结果话、语义理解、医学实体提取、术语标准化等技术能力,打造百人医学数据专家团队进行产品研发和迭代,为产品提供夯实的技术能力支持。 丰富审查规则提供病历内涵质控能力和20+维度的用药审查能力,覆盖病历质控、用药安全审核等应用场景,全方位提升医疗服务质量。 灵活部署模式产品支持私有化部署

  • CSPNet论文详解

    摘要 1,介绍 2,相关工作 3,改进方法 3.1,CrossStagePartialNetwork 3.2,ExactFusionModel 4,实验 4.1,实验细节 4.2,消融实验 4.3,实验总结 5,结论 6,代码解读 参考资料 摘要 CSPNet是作者Chien-YaoWang于2019发表的论文CSPNET:ANEWBACKBONETHATCANENHANCELEARNINGCAPABILITYOFCNN。也是对DenseNet网络推理效率低的改进版本。 作者认为网络推理成本过高的问题是由于网络优化中的梯度信息重复导致的。CSPNet通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。CSP(CrossStagePartialNetwork,简称CSPNet)方法可以减少模型计算量和提高运行速度的同时,还不降低模型的精度,是一种更高效的网络设计方法,同时还能和Resnet、Densenet、Darknet等backbone结合在一起。 1,介绍 虽然已经出现了MobileNetv1/v2/v3和ShuffleNetv1/v2

  • ECS训练营Day1—基于阿里云ECS、VuePress搭建静态网站

    一、概述 VuePress是2018年由尤雨溪发布的一个全新的基于Vue的静态网站生成器,它是一个非常轻量级的静态网站生成器。VuePress主要用于生成技术文档,其类似于Gitbook,我们可以用于博客或文档说明,并且我们不仅可以直接访问网页,还可以将其快速的部署在GitHub上。 为什么我们要选取VuePress平台?很多的技术人员包括程序员和开发人员都会写博客或技术文档,以此用于梳理总结技术中出现的关键点等重要信息,同时经互联网公开发布的博客或技术文档也能为别人带来新的对所学技术新的理解。VuePress具有界面简洁优雅、容易上手、兼容Markdown语法等特点,因此VuePress在构建项目是非常简单的,对于Markdown为中心的项目结构,可以做到最简化的配置,从而帮助我们更加专注于技术文档的编写,他可以为每个页面生成预渲染的静态HTML。 二、开通云服务器 步骤导引:   ①计费方式   包年包⽉可以理解为是预付费产品,我们得先购买⼀个⽉或者⼏个⽉⼏年ECS产品才能使⽤ECS,适合于长期稳定使⽤服务器的场景,⽐如说做⽹站。⽽按量付费可以理解为是后付费

  • 系统中没有邮件客户端设置autoLink=email会挂掉的问题

      TextView的autoLink属性为我们提供了很大的便利性,当文本中有网址,邮箱或电话的时候可以让我们方便地执行打电话发邮件等动作,不过也有一些问题,比如说设置autoLink包含email属性,当文本中有邮件地址时只要点击就可以调用邮件客户端来发邮件,但是如果当前系统中没有邮件客户端可供调用,程序会直接挂掉。   通过看Log可以发现,系统抛出了ActivityNotFoundException异常,并且Exception的getMessage中包含"mailto:xxxx@xxx.xxx"字样,当时第一反应是设置Thread.uncaughtExceptionHandler,判断如果异常的类型是ActivityNotFoundException并且ErrorMessage中有"mailto"字样直接让uncaughtException函数返回,试了一下,程序确实没挂掉,窃喜中,但是接下来点击了一下屏幕,5秒钟后ANR了,好吧这个方法不行。   又想到当点击链接后会调用邮件客户端发邮件,肯定有startActivity的调用,于是重载Activity的startActivit

  • Android Studio通过JNI调用NDK程序

         NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;另外就是为了效率更加高些,安全性更高。 如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin,然后需要编译生成,相当的蛋疼。要么是直接用Eclipse开发,但是前期配置也是一堆;真心蛋疼。但是现在在AS上Eclipse能做到的这边都OK。 (一)通过jniaes案例说明调用NDK层配置过程 而我们通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。 首先去官网下载一个最新的NDK,随便放到哪都行,像我放在D:\Dev\Android\android-ndk-r10d. (1)新建一个项目:名称JniAes 首先在java类中添加native接口,注意写好native接口和System.loadLibrary()即可。代码如下: 1publicsynchronizedstaticnativeStringgetFromNativeIv(); 2p

  • 技术?

    世界与技术? 社会的本质?人?人与人间的本质?利益?情感? 利益的本质?价值? 情感的本质?繁衍? 那这下来?这些东西?本质是?苍白?虚无?枯燥?冷漠? 嗷,忘了,技术的本质?产生价值? 那一切的本质?自我。 我,是我。 然而,我还在被作业,任务,拖延束缚...可笑.....哈哈哈哈哈

  • nodejs 安装

      1、使用 #debianubuntu curl-sLhttps://deb.nodesource.com/setup_7.x|sudo-Ebash- sudoapt-getinstall-ynodejs #centos curl--silent--locationhttps://rpm.nodesource.com/setup_7.x|bash-复制   2、源码安装 gitclonegit://github.com/ry/node.git cdnode ./configure make sudomakeinstall复制   3、nvm安装   curl-o-https://raw.githubusercontent.com/creationix/nvm/master/install.sh|bash 或 wget-qO-https://raw.githubusercontent.com/creationix/nvm/master/install.sh|bash #加入这三行到.bashrc或.bash_profile文件 ex

  • 关于supervisor无法监控golang代码的解决方法

    之前一直都是使用如下方式运行go代码 #goruntest.go 复制 这种运行方式是直接编译运行go代码,虽然在调试的时候没出什么问题,但是在使用supervisor监控的时候,会提示如下错误:(behavior为processname) behavior:ERROR(abnormaltermination) 复制 最坑的是错误日志是一片空白…… 经查找资料,解决方式是先将go代码编译成可执行文件 #gobuild 复制 然后直接运行,并更新supervisorprocess配置文件behavior.ini,重启supervisor #sudoservicesupervisordrestart 复制 世界明亮了……

  • 关于CopyOnWriteArrayList

    概述    看这个类名CopyOnWriteArrayList继承ArrayList,通过查看类声明CopyOnWriteArrayList和ArrayList不存在继承关系。两个类的特点:1)都继承List接口,是List接口实现类。2)底层存储数据都采用数组3)添加元素操作且ArrayList.size>数组长度时,以数组的1.5倍进行扩容;CopyOnWriteArrayList的扩容方式与ArrayList完全不一样。加一个元素copy一个新数组,老元素迁移动新数组中。然后,新增元素赋给新数组中。4)ArrayList是非线程安全的,CopyOnWriteArrayList是线程安全的。5)ArrayList会预占内存,CopyOnWriteArrayList使用多少申请多少内存。   类图 存储结构    之前讲过,CopyOnWriteArrayList存储结构是数组。array变量数组元素类型使用Object类型,transient元素不能序列化,volatile修饰线程可见性 /**Thea

  • 使用ClickHouse表函数将MySQL数据导入到ClickHouse

    #clickhouse-client :createdatabasedw; :usedw; --导入数据: CREATETABLEOrdersENGINE=MergeTreeORDERBYOrderIDASSELECT*FROMmysql('10.42.134.136:4000','dw','Orders','root','xyz'); CREATETABLEOrders ENGINE=MergeTree ORDERBYOrderIDAS SELECT* FROMmysql('10.42.134.136:4000','dw','FactSaleOrders','root','xyz') Ok. 0rowsinset.Elapsed:1832.114sec.Processed85.71millionrows,65.27GB(46.78thousandrows/s.,35.62MB/s.) 解释:导入数据8571万行,耗时1832.114,总大小65.27GB最后一次每秒4.678万行导入,每秒导入35.62MB的数据。 前提条件: MySQL的主键必须为notnull 10.4

  • python的str.format方法

    被用于字符串的格式化输出 1print('{0}+{1}={2}'.format(1,2,1+2))#in 21+2=3#out复制 ViewCode 大括号里对应参数 若省略数字: print('{}+{}={}'.format(1,2,1+2))#in复制 可以得到同样的输出结果。但是替换顺序默认按照[0],[1],[2]...进行。   若替换{0}和{1}: print('{1}+{0}={2}'.format(1,2,1+2))#in复制 2+1=3#out复制   输出字符串: print('{0}am{1}'.format('i','alex'))复制 iamalex#out复制   输出参数的值: 1length=4 2name='alex' 3print('thelengthof{0}is{1}'.format(name,length))复制 thelengthofalexis4复制   精度控制: print('{0:.3}'.format(1/3))复制 0.333复制  

相关推荐

推荐阅读