摘 要 万物联网成为了这个近几年的热门话题,在智能家居的流行的同时。对于家中一些老式的家用电器如空调、电风扇、电视机等也需要考虑这些电器的联网的问题。本设计为一种基于esp8266芯片的智能遥控器。由接在芯片上具有学习功能的单独的红外模块完成控制指令的发送。通过手机APP远程控制来达到解决老式家用电器联网问题的目的。该遥控器同时系统还搭载了DHT11温湿度一体传感器,可以进行实时的环境温湿度采集得到环境温湿度数据,从而更好的协助用户进行远程的家电控制。整个系统采用SOC方案并于eclipse一体化环境下编写控制固件,借助机智云物联网平台的服务器以及与之配套的服务来实现用户的远程遥控功能。
关键词:物联网;智能遥控器;ESP8266;SOC;机智云
1绪论1.1本文研究背景和意义随着互联网技术、通讯技术、芯片制造技术的以及国民经济的不断发展。在当今这个信息时代,经济的发展推动科学技术的进步从而促进了社会信息化的进程。同时人民的生活水平不断提到使得人们更加注重生活质量,追求方便、舒适、实用、节能、智能的居家生活。因此智能家居就在需求的推动下得到了迅猛发展。
智能家居的主要部分为智能家电,智能家电种类繁多小到保温杯、电饭煲、鱼缸等,大到热水器、电冰箱、空调等一些数不胜数、琳琅满目的电器都已经逐步智能化进入物联网时代。在物联网技术的支持下,多数智能电器都能与移动端通过WIFI、蓝牙等方式进行连接取得相应数据,在连接的情况下移动端可以随时随地监控电器运行同时也可以在移动端控制设备运行状态。
但凡家用电器,向来都离不开控制系统,有的如电饭锅——集成在家电上与家用电器成为一体。有的如壁挂式空调——单独配备了遥控器,具有单独的控制模块。有的两者都有之如落地电风扇。对于老式家电他们的控制方式单一,对于10多年前当时高级的家电如空调、电视、冰箱等。很多在没有完全报废的情况下依然工作在我们的家庭当中,甚至还会出现家电使用时间比该家庭中上大学的儿女的年龄还大的情况。虽然所有的家电设施都趋于智能化,但是在这些在短期内无需更换的家用电器我们也应当考虑他们如何智能化。
2.1开发板介绍
本次设计我选用的是机智云(GizWits)推出的物联网智能硬件开发套件gokit3(s)开发套件。该套件能帮助传统硬件快速接入互联网。完成入网之后,数据可以在产品与云端、制造商与用户之间互联互通,实现智能互联。他具有两种常用开发方案一种是SOC方案另一种是MCU方案。 SOC方案是一种整体式的设计方案。它将 WiFi 模组与外设驱动模块直接连接起来,直接在 WiFi芯片上进行开发,省去了一层通讯过程。同时这种开发方案具有开发难度低、生产成本低的特点,但是受限于 WiFi 芯片的片上资源,应用范围有限。
MCU方案是一种是分体式的设计方案。WiFi芯片模组只负责信息的接收与发送相当于主芯片上的外设,这种方式是通过串口MCU进行通信,因此需要在 MCU 上进行协议解析与外设的开发。这种方案的优点是不受限于 WiFi芯片的片上资源限制可扩展度高。但是是开发难度大、开发周期长、生产成本高。
图2.2 SOC方案
此开发板在使用不同的工作方案时需要将搭载的ESP8266芯片插入对应的插口中才能正常工作。
图2.3 不同工作方式对应的插槽位置
2.3 ESP8266介绍上海乐鑫公司生产的 ESP8266是⼀个完整且⾃成体系的Wi-Fi⽹络解决⽅案,能够独⽴运⾏也可以作为从机搭载于其他主机MCU运⾏。ESP8266在搭载应⽤并作为设备中唯⼀的应⽤处理器时,能够直接从外接 Flash 中启动。内置的⾼速缓冲存储器有利于提⾼系统性能,并减少内存需求。为了使所占的 PCB 空间达到最低让ESP8266芯片拥有极少的外部电路,ESP8266⾼度⽚内集成,包括天线开关,功率放⼤器,低噪声接收放⼤器,射频 balun,滤波器和电源管理模块。
整个配置ESP8266的系统表现出来的特性有: 1、节能在睡眠/唤醒模式之间的快速切换 2、配合低功率操作的⾃适应⽆线电偏置 3、前端信号的处理功能 4、故障排除 5、消除蜂窝/蓝⽛/DDR/LVDS/LCD ⼲扰的⽆线电系统共存特性 ESP8266WiFi芯片支持Soft AP、AirLink、和AP三种模式:
Soft AP模式:设备本身成为一个WiFi热点,手机可以与模块直接通讯。AirLink模式:手机APP端发送WiFi相关信息UDP广播包或者组播包。AP模式:提供无线接入服务,允许其它无线设备接入,提供数据访问。 图2.4 ESP8266WiFi模组内部结构图
ESP8266WiFi模组功能强大外形小巧,有一个用于下载固件的Uart串口,还有一个控制工作和下载模式的拨码开关,以及一个用于复位的复位按钮和一个正常工作时为蓝色的指示灯。 图2.5 WiFi模组实物图
图2.6 WiFi模组原理图
2.3红外模块介绍2.3.1红外遥控器工作原理红外线的特点: 红外线是介于可见光与微波之间的一种电磁波,其波长为 (0.76μm到1000μm) 波谱范围很宽。红外线分为近红外、中红外和远红外三个区,兼具可见光和微波的某些特性。实际上,凡是温度高于几绝对零度(即﹣273℃)的物体, 均会片刻不停地发出红外线, 只是温度越高,其发出的红外线越强[14]。 红外发射原理: 首先需要调制器将我们要发送的信号调制到红外信号中,再由红外发射器发射。这些发射器将会把红外信号以特定的频率发送,我们目测到的就是以红色的光线闪烁。最后红外接收器可以捕捉这些有红外线传递的信息同时可以过滤掉其中的噪声最后将其还原为二进制编码。同时发射电路可以控制其发出的信号尽可能强以使发射的距离更远,更甚之,它可以经受抖动。在一般的消费类电子产品中,这个频率的范围为30KHz到60KHz,通常采用的是38KHz的载波发射频率[15]。 红外信号编码协议: 红外遥控器信号协议有很多种,平时用于生产生活中的有有Sony SIRC 协议、Sharp 协议、NEC 协议、ITT 协议等。本次设计选用NEC协议。因为NEC协议可以直接通过解码器将遥控器中发出的红外信号变成两个字节额数据。而非NEC协议的编码获取以及使用都相对NEC编码较为麻烦同时家用电器的遥控器多为NEC编码,因此只要选用有学习功能的红外模块就可以完成绝大部分家电的控制。
2.3.2 YS-IRTM 发射模块该模块由四个部分组成分别为红外发射头、红外接收头、红外扩展接口、UART单片机串口通讯接口,如下图所示。
图2.7 YS-IRTM模组实物图 1、红外发射头:用于发射红外信号。 2、红外接收头:用于接收 NEC 红外信号并且进行解码。 3、红外头扩展:该接口可以用于连接多个红外发射头,同时使得模块可以安放至不同方位以便达到控制目的控制。 4、UART 单片机串口通信接口:UART接口为单片机串口,该串口是单片机与其他设备传递信息的桥梁,其默认的波特率为9600bps,接口定义如下图所示。 图2.8 YS-IRTM模组UART接口定义
发射指令说明:
YS-IRTM红外发射模组发射指令一共有五位一个地址位一个操作位三个数据位,排列方式如下图所示。 表2.1 YS-IRTM模组发射指令排列方式 地址位:A1为默认地址(可改)。FA 为通用地址(不可改)。 操作位:该位的数据用于代表当前的工作状态。 (1)F1 红外发射状态 (2)F2 进入修改串口通信地址状态 (3)F3 进入修改波特率
数据位:该数据位为对应不同状态的数据内容,对应内容如下图所示。 表2.2 YS-IRTM模组发射指令数据位对应内容 解码信息输出: 首先将红外模块与TTL转串口相连接,再将TTL转串口与电脑相连接,使用串口助手设置好工作模式,即可进行解码操作。图2.11展示的是电脑串口助手的设置方式,图2.12展示的是红外模块如何与TTL相连接。
NEC 红外信号编码由一个命令码一个命令码的反码和一个分为高地8位的16位用户码构成,以“用户码1+用户码2+命令码+命令码反码”方式排列。解码操作只需要将遥控器对准红外接收头,按下要需要解码的按键NEC格式红外遥控器的按键,就可以通过串口调试助手查看到解码,串口结果输出的二进制码的格式为“用户码1+用户码2+命令码”。在发送编码时,发送16位用户码以及命令码即可。 图2.9 电脑串口助手设置方式
图2.10 YS-IRTM模组与TTL转串口连接方式
图2.11 YS-IRTM模组原理图
2.4 DHT11温湿度模块2.4.1 DHT11温湿度模块简介
DHT11模块集成在GoKit3开发板上,它是一款温湿度复合传感器含有已校准数字信号输出。为了能够同时采集到温度信息和湿度信息。在器件内部,有电阻式原件用于测湿,有NTC 用来测温,这些元件内部连接了一个8位单片机,正是有了这些基础,该器件才展现出了卓越的响应速度、抗干扰能力以及极高的性价比,在温湿度检测领域被广泛采用[16]。同时响应速度快响应时间为1/e(63%)、精度高测量的湿度的精度为±5%RH,测量的温度的精度为±2%RH,温度测量范围为0~50℃,温度分辨率为1℃(8位),湿度测量范围为20~90%RH,湿度分辨率为1%RH(8位)。不仅如此而且控制便捷、体积小、功耗低可靠性极高,在正常运行时稳定性强,因此可以适应恶劣的工作环境。DHT11温湿度传感器采用4针单排引脚封装它与控制芯片的连接电路简单,只需要通过一个I/O口即可以单总线方式进行通讯。采集的数据由DHT11的DOUT引脚传输。下图为DHT11的连接图
图2.12 DHT11电路原理图
3软件系统设计3.1机智云系统框架
由于本设计是基于机智云物联网平台提供的资源来设计开发的,因此本设计整体设计框架以及流程都是基于机智云整个框架来进行的。本系统的运行需要确保无线网络的通畅,硬件设备通过WIFI模块接入网络,在局域网内,手机 App 和WIFI可以直接进行通信,而在广域网内,两者之间的通信就需要借助云平台[17]。总的来说分为四大块以及两个循环由图3.1所示。 四大块:硬件设备(产品)、手机控制软件(APP)、局域网(路由器)、机智云服务器(云端)。 两个循环: 小循环:由智能设备产品与手机或不同智能设备之间,通过路由器实现一个局域网内的通信(控制或者查看设备数据) 大循环:由智能设备产品通过路由器接入互联网服务器,再通过手机端访问指定的服务器从而间接的与智能设备通讯(发送控制指令或获取设备数据) 图3.1 机智云平台系统框架原理图
3.2机智云平台的优势目前,国内有很多如阿里云、百度云等优秀的云平台,而本设计选择使用机智云物联网平台是因为他们是国内率先打造智能硬件自助开发以及云服务的平台。早在2010年他们公司就推出了测试版机智云物联网的云服务,经过10年的市场磨炼肯定有他们独到之处,同时也在物流网云服务领域有新的发展。最重要的是机智云平台具有国际化的特点能全球提供云服务而且总体延迟较低。
3.3机智云接入流程机智云平台接入只需要六个步骤分别是:注册开发者、创建产品、软件件开发、产品调试、申请发布、生产产品这六个步骤。
3.3.1注册开发者
在使用机智云平台服务前,需要先注册一个机智云开发者账号。机智云开发者帐号分“个人帐号”与“企业帐号”,如下图所示,如果是企业用户,相对于个人用户拥有更多企业服务需求。
图3.2 机智云平台为开发者提供的服务
3.3.2创建产品
在机智云官方网站的开发者中心点击“创建新产品”后输入产品名称以及选择对应设备接入方案即可完成“新产品”的创建。本设计的名称为“遥控器”该名称对应带手机APP上显示的名称同时选择了“WiFi\移动网络方案”,如下图所示。连网模块包括Wi-Fi、GPRS等主流连网方式,同时机智云平台还支持BLE、GSM、CDMA、Zigbee、LoRa等联网方案接入。
图3.3 机智云平台创建产品界面
创建的产后品需要定义产品的数据点,机智云平台的数据点指的是所创建产品应有的功能的抽象体现,通过不同的数据类型来表达各种抽象的功能。因此明确产品功能是所创建产品智能化的第一步。通过在机智云平台创建对应的数据点来描述硬件要实现的功能,会自动将对应的数据点生成用于嵌入式开发的MCU方案或者SOC方案的协议。
数据点的基本内容可分为显示名称、标识名称、读写类型、数据类型以及备注。具体含义如表3.1所示:
表3.1 机智云平台数据点含义 表3.2 本设计定义的数据点
3.3.3软件开发创建好数据点之后即可从开发者中心下载机智云平台自动生成的通用移植代码,移植代码分为SOC、MCU两种通用代码,本设计选择的是SOC方案因此下载SOC通用代码即可。通过编译器对下载好的通用代码进行二次开发然后编译生成固件。最后只需在使用的智能硬件中烧写入机智云连接协议GAgent的连网模块的固件,即可通过机智云平台实现设备连网及智能化。
开发环境选择: 因为ESP8266 SKD 的开发环境有很多,官方的开发环境配置比较复杂需要用到虚拟机,因此本设计选择安信可的 AiThinker_IDE 。AiThinker_IDE它不需要搭建 linux 和虚拟机,使用方便,在解压后可以直接在 windows 环境下使用。安信可一体化开发环境集成了eclipse等相关的开发插件,它不仅支持 ESP8266 NONOS 和 FreeRTOS 环境开发同时还支持 ESP31B/ESP32 FreeRTOS 环境开发。
代码二次开发: 对于自动生成的代码已经根据用户定义的产品数据点的信息,并针对 MCU、SOC两种方案生成了对应的机智云串口协议层代码,开发者只需要调用相应的 API 接口或添加相应的逻辑处理即可。代码框架如下图所示。 图3.4 机智云移植代码框架
再完成了传感器的驱动开发后即可进行上下行处理。由于机智云官方有相关驱动只需要将.c文件放入app文件夹的driver文件夹中将.h文件放入app文件夹中 include文件中的driver下。
配网处理:配网处理部分包括设备恢复出厂操作以及配置入网,ESP8266WiFi芯片具有三种WiFi配置入的方式(前文硬件部分已做介绍),同时为了方便观察,配置入网操作的同时点亮RGB灯作为指示。官方代码都是以短按key2为Soft AP模式,RGB灯为红色,长按key2为Air Link模式,RGB灯为绿色。因此本设计也沿用官方的习惯。程序处理入口在user_main.c文件中。具体关键程序附录配网处理。
上行处理:上行处理是为了完成传感器的数据的采集,包括红外遥控模块的数据上报和温湿度传感器的数据上报然后在 user 目录下main.c 文件中的 userHandle()函数中实现传感器数据采集,用户只需并将采集到的数值赋值给对应用户区的设备状态结构体。代码见附录上行处理。 下行处理 :下行处理是设置红外模块控制指令NEC编码对应的二进制代码,因此只需要对Gizwits目录下的gizwits_product.c文件中,gizwitsEventProcess()函数稍作修改即可。此处代码的实现详见附录中下行处理代码。
Makefile文件修改:如果不修改主目录下的Makefile文件则无法成功编译,具体修改方式见附录。 固件烧写:
在二次开发完成后对代码进行编译,编译成功后即生成了相应的固件,只需要按照规定的格式烧写固件至智能硬件即可。本设计固件烧写软件使用的是ESPFlashDownloadTool。烧录的固件以及其对应地址分别为: esp_init_data_default.bin 0x3fc000 blank.bin 0x3fe000 boot_v1.6.bin 0x00000 user1.4096.new.6.bin 0x01000 烧录软件按照的串口码率115200同时在对部分选项进行如下设置: CrystalFreq=26M SPI_SPEED=40MHz SPI_MODE=QIO FLASH_SIZE=32Mbit-C1, 其余部分默认设置即可,在硬件进入uart烧录模式后,点击start下载即可。 详细设置方式如下图所示。 图3.5 固件烧录软件设置
3.4产品调试
测试服务器为开发者提供了完整的测试环境以及部分开放功能,调试产品过程中可以通过机智云物联网平台的虚拟设备来进行调试与功能验证。 虚拟设备的应用极大的降低了研发成本同时也缩短了研发周期。
在手机下载相应的测试APP后通过二维码绑定虚拟设备,从而验证之前的设计以及运行时候正常,同时可以在手机APP上进行操控来验证设备的可行性。机智云物联网平台的服务器同时会记录下操作日志以供对设备的稳定性安全性进行评估。下图展示了机智云的虚拟设备调试界面以及手机APP控制界面。
图3.6 设备调试3.5申请发布与正式量产当开发者的设备完成全部开发后需要进行产品发布,发布的产品将部署在机智云正式生产环境服务器上,同时机智云可以为开发者提供独立的云端的运行环境,以此来确保开发者的设备可以24小时全天候的运转,以此来保证客户的需求。如果产品正式发布,开发者还能得到更由机智云提供的增值服务。当产品发布,厂家可以与机智云签署《GDCS协议》即可将正式量产的产品接入机智云物联网云平台,同时量产的产品会有由机智云提供的技术人员进行24小时全天候的监控,确保产品安全、稳定的运行。
3.6硬件配置入网为将设备连接上路由器按照机智云官方建议采用AirLink模式配置入网。首先将硬件上电并长按GOKIT3开发板上的key2按键直至RGB灯颜色为绿色常亮即进入AirLink模式,打开手机对应APP,选择路由器热点名称并输入对应WiFi密码。此时手机会随机向路由器和设备发送包含WiFi密码的数据包,直至设备收到数据并接入路由器。 入网步骤如图3.8所示
图3.7 配置入网3.7手机APP控制硬件组运行结果在配网成功后即可通过手机APP来远程进行控制。温湿度显示如下图所示:
图3.8 温湿度显示
四种温度控制器模式分别为:开关、温度增、温度减、暖脚模式,如下四图所示。 图3.9 开关
图3.10 温度增
图3.11 温度减
图3.12 暖脚模式
4结论与展望4.1设计总结智能家居经过近经过多年的发展相比较曾经只是概念性的实验室产物已经逐步走进了我们的生活,走进了我们的家庭。在生活的各处都能看见智能家居的身影。随着互联网的发展,智能家居在网络的帮助下更是如虎添翼。将曾经的不可能逐步变成可能,在智能家居的帮助下我们的生活变得更加便利、智能、人性化。本设计的设计初衷就是为了帮助曾经老式的具有红外遥控功能的家用电器也能进入物联网时代,将具有红外控制系统的智能硬件通过接入机智云平台的云端并配合智能手机的控制APP来实现远程控制家电的功能。
本设计的总结如下: 1、使用SOC模式以ESP8266芯片为主控芯片,在机智云平台下设计了远程红外遥控系统。 2、采用DHT11温湿度一体传感器,可以将采集到的信息实时上传至机智云云端 3、采用具有解码功能NEC红外控制芯片,可以实现远程控制使用NEC编码的家用电器
4.2设计展望由于个人能力有限,在使用ESP8266为主控芯片的前提下只控制了两个额外模块一个是NEC红外控制模块和DHT11温湿度模块。因此本设计还有很多值得改进的部分以及升级的空间。 1、设备的控制红外信号需要增加一个检验模块判断由智能控制系统发出的红外信号是否被家电接收。 2、本设计只有温度、湿度这两个环境参考指标,可以考虑增加如PM2.5控制质量监控模等其他环境指标监控的模块。
1.配置Makefile文件: BOOT?=new APP?=1 SPI_SPEED?=40 SPI_MODE?=QIO SPI_SIZE_MAP?=6 2.配置处理代码: LOCAL void ICACHE_FLASH_ATTR key2ShortPress(void) { GIZWITS_LOG("#### key2 short press, softap mode \n");
rgbControl(250, 0, 0);//Red LED on
gizwitsSetMode(WIFI_SOFTAP_MODE); }
LOCAL void ICACHE_FLASH_ATTR key2LongPress(void) { GIZWITS_LOG("#### key2 long press,airlink mode\n"); rgbControl(0, 250, 0);//green LED on
gizwitsSetMode(WIFI_AIRLINK_MODE); } 3.上行处理代码: void ICACHE_FLASH_ATTR userHandle(void) { uint8_t curTemperature = 0; uint8_t curHumidity = 0; uint8_t ret = 0; static uint8_t thCtime = 0; thCtime++; if(TH_TIMEOUT < thCtime) { thCtime = 0; ret = dh11Read(&curTemperature, &curHumidity); if(0 == ret) { currentDataPoint.valuetemperature= curTemperature; currentDataPoint.valuehumidity = curHumidity; } else { os_printf("@@@@dh11Read error ! \n"); } } 4.下行处理代码: int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len) { uint8_t command0[]={0XA1,0XF1,0X22,0XDD,0X0C}; //开关键 uint8_t command1[]={0XA1,0XF1,0X22,0XDD,0X07}; //温度加 uint8_t command2[]={0XA1,0XF1,0X22,0XDD,0X0F}; //温度减 uint8_t command3[]={0XA1,0XF1,0X22,0XDD,0X16}; //暖脚模式
uint8_t i = 0; dataPoint_t * dataPointPtr = (dataPoint_t *)data; moduleStatusInfo_t * wifiData = (moduleStatusInfo_t *)data;
if((NULL == info) || (NULL == data)) { GIZWITS_LOG("!!!gizwitsEventProcess Error \n"); return -1; }
for(i = 0; i < info->num; i++) { switch(info->event) { case EVENT_temp_control: currentDataPoint.valuetemp_control = dataPointPtr->valuetemp_control; GIZWITS_LOG("Evt:EVENT_temp_control %d\n", currentDataPoint.valuetemp_control); switch(currentDataPoint.valuetemp_control) { case temp_control_VALUE0: //user handle uart0_sendIFR(command0); break; case temp_control_VALUE1: //user handle uart0_sendIFR(command1); break; case temp_control_VALUE2: //user handle uart0_sendIFR(command2); break; case temp_control_VALUE3: //user handle uart0_sendIFR(command3); break; default: break; } break; case WIFI_SOFTAP: break; case WIFI_AIRLINK: break; case WIFI_STATION: break; case WIFI_CON_ROUTER: GIZWITS_LOG("@@@@connected router\n"); break; case WIFI_DISCON_ROUTER: GIZWITS_LOG("@@@@disconnected router\n"); break; case WIFI_CON_M2M: GIZWITS_LOG("@@@@connected m2m\n"); setConnectM2MStatus(0x01); break; case WIFI_DISCON_M2M: GIZWITS_LOG("@@@@disconnected m2m\n"); setConnectM2MStatus(0x00); break; case WIFI_RSSI: GIZWITS_LOG("@@@@RSSI %d\n",wifiData->rssi); break; case TRANSPARENT_DATA: GIZWITS_LOG("TRANSPARENT_DATA\n"); //user handle, Fetch data from [data] , size is [len] break; case MODULE_INFO: GIZWITS_LOG("MODULEINFO ...\n"); break; default: break; } } system_os_post(USER_TASK_PRIO_2, SIG_UPGRADE_DATA, 0); return 0;
}
|