项目介绍
1.项目起源
其实拥有一套完整的智能家居是许多新青年的梦想,而我就是其中一位,但作为刚刚毕业不久,还在为了工作和生活努力打拼的我来说没有一个自由的环境(属于自己的房子)供你去实现自己梦想中的设计方案,打造属于自己的贾维斯之家。但是我就是做物联网行业的,所以为何不能通过自己的专业知识来改造升级一下出租屋内的家居环境呢?
2.硬件环境
1)开发板介绍
按照国际惯例,首先介绍一下我们本次的主角Renesas CPK-RA6M4开发板,先附一张官方的示图:
![](https://oss-club.rt-thread.org/uploads/20220728/4d811142eac82e9bc15f4001ebe759a9.webp)
从示意图上我们可以看到,除了物联网中常用的RJ45网口、232、285等接口没有单独引出之外,其他给出的扩展接口还是挺丰富的,引脚足够多,串口足够多,对于做一个智能家居的主控可以说绰绰有余了,下面我们再看一下手册中对于此开发版资源的描述:
![](https://oss-club.rt-thread.org/uploads/20220728/ad55b5f848e6e3c614eb2558e4ffdd91.png.webp)
其实按照我本人的规划,除了本次已经完成了模块之外,后续还会增加屏幕、红外以及摄像头和数据上云等,不过介于工作时间和本次活动的时间考虑,剩下的部分安排在后续慢慢升级了。不过这个片子丰富的资源也为后续的升级和二次开发提供了保障。
2)模块连接介绍
首先先给大家上个示意图,我相信看完这张图就已经很明白了:
![](https://oss-club.rt-thread.org/uploads/20220728/1ebd6f03cbcd1690c27d7ffd2fab9c42.png.webp)
下面介绍一下每个硬件模块在此系统中担任的角色:
CPK-RA6M4开发板:主要负责处理输入输出的数据,处理逻辑业务,协调其他模块做出正确的相应。
ASR01语音模块:主要负责语音输入输出功能,通过语音获取用户的第一指令,通过串口传输给RA6M4。并将串口接收到RA6M4的数据通过语音输出反馈给用户。是本项目最重要的交互单元。
ESP8266-01S wifi模块:主要负责无线通信功能,将RA6M4处理完的指令通过wifi传输给其他的控制单元,并且还担任连接管理功能,通过UDP连接传输数据。并将接收到的指令执行结果再返回给RA6M4。
氛围灯模块:主要负责电脑桌周围的灯光控制。毕竟RGB有信仰加成嘛,多来点氛围灯感觉电脑都变快了,有木有。
DHT11温湿度传感器模块:主要负责检测当前室内的温度和空气湿度,当前主要为主动查询获取,后续如果有了红外和空调伴侣,可以通过设置温度阈值来控制空调和风扇等设备的联动,进而达到控制室内温度理想化的一个效果。
有源蜂鸣器模块:主要负责定时闹钟功能。这个模块增加的意义非常重要,我是一个时间观念淡薄的人,经常会忘事,比如说:一会洗衣服,一会洗头,一会起来做运动等都经常拖拉,其实也可以说“懒”,嘿嘿,不过这个模块就可以做到定时提醒,做不做的先另说,起码提醒了再不做就会有负罪感,也是想改变自己生活习惯的方法吧。
换气扇模块:主要负责室内做饭时的吸烟,已经外面比室内凉快时的快速空气交换,更新室内空气的同时,还能起到降低温度的作用。我相信很多人都遇到过一件事,炎热的夏天的傍晚,命名室外非常凉爽,回到室内却极其闷热,这里就是我想安装换气扇的目的,现在很多新房中是有新风系统的,不过苦逼租房的我还没有这条件,只能先DIY一个换气扇来使用。
电风扇模块:主要负责不开空调下的制冷工作。这个风扇是带架子的,可以夹在床头晚上睡觉时后半夜用,毕竟租房的独立电表太贵了(8毛5一度电),普通25℃开一天差不多十几块,所以风扇还是必须的,不然这个夏天可没法过了,加班挣得钱都捐赠给国家电网了。
G90舵机开关模块:主要负责开关房间内的大灯。相信大家多多少少的看到过有人做过用舵机来实现简易改装控制灯的开关面板的,这里就是这种理念,还是因为租房的问题,不能拆开来安装wifi继电器,所以这样的方案就是最简洁的,而且还方便拆卸带走。
其实,除了上述的几个大的模块之外,在这个项目中还有两个比较重要的硬件,他们就是:
太阳能供电模块:主要负责给RA6M4主控及LED和G90舵机开关模块长期供电,避免了长期使用所产生的供电损耗问题,接入太阳能给18650电池充电,这样就不用考虑模块放置位置是否有供电插座等问题了,而且太阳能还是清洁能源,也契合了当今社会的主流环境。实现了白天我上班他在家充电,晚上我回家他开始工作。
实际连接如下图所示:
![](https://oss-club.rt-thread.org/uploads/20220728/45d8627355d238161f390641c10cd2cc.png.webp)
接线示意图简单说一下:
![](https://oss-club.rt-thread.org/uploads/20220728/8d8bf60c84fbf3d7250efdb13af7cfdd.png.webp)
1、先将太阳能板接入5v稳压输出模块,这样便于给锂电池充电,5v稳压模块输出介入到锂电池充电保护板,然后保护板再将输出接入锂电池正负极完成充电过程;放电过程是通过一个usb转TTL给esp8266进行3.3V供电(这里本来想的是用这个模块一块把esp8266的烧录坐上来,突然发现手里还有排母,就用排母接esp8266了)。
2、而主控的太阳能板主要是先通过5V稳压模块输出给锂电池,然后锂电池直接给开发板供电。
注:这里线路连接并不是很专业,因为主要做软件,硬件不熟,差不多当个大电容在用,有过有问题还请在评论区留言指正,或者有更好的方式也可以。
wifi继电器模块:主要负责控制风扇、换气扇的开光。这里自己diy了一个开关模块,通过降压模块使220V降压到5v给wifi继电器供电,wifi继电器再通过esp8266控制闭合开关,多个esp8266之间通过UDP进行通信,从而实现无线远程控制。
实际接线如下图所示:
![](https://oss-club.rt-thread.org/uploads/20220728/27014d199e28319040808de82ff53fd2.png.webp)
上图比较乱,下面通过示意图来说明一下:
![](https://oss-club.rt-thread.org/uploads/20220728/4873fd5237cc4bf0dd7f9f6b0268d269.png.webp)
1、先将220v的正负极都分出一根线来,也就相当于此时总共拥有两根正极,两根负极,其中一组是正常连接原来的设备的,另一组正负极是流出来给WiFi继电器用的。
2、此时将剩下那另一组正负极接220v-5v的降压模块,降压模块的输出接wifi继电器的正负极供电端子,完成220v降压到5v给wifi继电器模块的供电。
3、下面就是用继电器控制线路通断了,选择另一组的正极或负极剪断(我这里选的是正极),一般继电器都是三个接线端子,中间的是输入,一个on是常开,另一个nc是常闭,我这里接的的输入和常闭,这样上电后是不通电的,这个根据实际应用情况来。
这里单独说一下为什么选用wifi作为无线传输介质,首先是之前听闻esp8266的大名太久了,而工作中主要接触工业相关的东西,暂时没用过,比较好奇,其次就是它可以通过后续更改支持小艾同学、HomeKit还有鸿蒙,并且可以自联网,个人感觉相比于蓝牙、ZB等具有可玩性优势。
OK,我们的硬件环境就介绍到此吧,所有的东西都是可以在网上买到的,大家有好奇的也可以试一下。
3.软件设计
此项目的RA6M4开发全部在RT-Thread Studio平台进行,其实这个平台在19年的时候就接触过了,不过那时候很多都不晚上,主要还是ENV+keil的模式开发,本次接触下来感觉还是挺好用的,希望RTT以后大力推广一下,慢慢的完善起来。其次ASR的语音模块主要是在天问Block上进行开发,他的图形化开发对于专业人员不友好,对于新手可能还行,所以本次都是代码模式编辑的。另外esp8266全都是在Arduino上开发的,并没有用安信可提供的AT固件,其实用也不是不行,主要还是想多学习一下。
其实不管是这三种环境的哪一种,基本都还是以C为基础,所以说C语言YYDS,嘿嘿。
1)目录结构介绍
此项目前期目录结构的设计主要是参考了论坛中上次这个开发板模块评测任务中的目录结构,而且我也发现很多瑞萨的项目全都是src下新建自己的应用目录进行开发,所以不约而然的我也选择了同一种方式。
![](//file.elecfans.com/web2/M00/59/7D/pYYBAGLnRZKAUjRQAACPiuANtls226.png)
而且这种方式也挺好管理,不用再新建一个根目录,但是自己新建的子目录下需要增加一个SConscript文件,防止RT-Thread Studio在重新构建的时候没有包含你的文件,这里我们已wdt目录为例,看一下脚本内容:
![](//file.elecfans.com/web2/M00/58/DF/poYBAGLnRZKAW7p8AACIyueh2xU036.png)
整体的结构划分主要从模块话,美观化的角度考虑的,其中将每个硬件模块都包含在一个子文件夹中,然后创建一个共用usr_gpio.h文件来存放公用的宏及结构体、头文件、各种声明等,方便统一管理。
2)线程设计介绍
下面列一下线程的设计:
![](//file.elecfans.com/web2/M00/58/DF/poYBAGLnRZKAUQ_zAABsVl_ol58473.png)
从上面的线程分布可以看出,其实最主要的逻辑主要集中在esp8266_thread_entry和voice_thread_entry两个线程中,这也刚好是我们逻辑交互的输入输出,非常合理。
其中dht11温度值的获取通过voice线程调用接口cat_dhtxx实现了,个人觉得没必要创建两个线程一直获取温度值和湿度值,目前来看是有点浪费资源了。
关于其他的设计如下:
1、线程间通信:主要使用了消息队列,当前资源还比较赋予,没用邮箱。
2、外设通信接口:主要使用了UART、IO、PWM、WDG、RTC、LED。原本想用usb和语音模块通信来,但是usb-h没时间调了,暂时飞线使用串口。
(这里说一下,这个语音模块很坑,只预留了TX,RX用来烧录,想用RX只能飞线和烧录共用一个)
这里简要说一下关于esp8266_thread_entry和voice_thread_entry两个线程的逻辑;
esp8266_thread_entry
1、创建软件定时器:用于实现UART超时接收,原本串口只能单字节接收,这里可通过修改超时时间接收任意长度的字节,当前默认100ms。
2、uart9初始化:当前还是使用的终端的形式进行接收的。
3、esp8266引脚使能:esp8266-01s有RST和EN引脚必须拉高才可以正常工作。
4、等待esp8266初始化完成:这里esp8266自身需要初始化,等待接收到他打印自身IP认为初始化完成。
5、等待节点连接:这里说一下,wifi分为ap和sta两种模式,ap是相当于路由的身份,sta相当于节点的身份,这里等待有sta正常连接了才让LED常亮,表示这时候可以正常发送指令控制接入的设备了。
6、循环读取接收和发送消息队列:这里把接收和发送消息队列的读取放在一个线程了,主要是控制指令一般单次只执行一个,所以分两个线程意义不大。读到数据后会在做出相关处理后再响应。
voice_thread_entry
1、创建软件定时器:用于实现UART超时接收,原本串口只能单字节接收,这里可通过修改超时时间接收任意长度的字节,当前默认100ms。
2、uart6初始化:当前还是使用的终端的形式进行接收的。
3、循环读取接收和发送消息队列:同样这里接收和发送也是在一个线程,它主要是拿到数据后发送给esp8266线程进行透传,或者收到回复后,通过串口传给语音模块。
总结
1、项目感受
这次的项目是第一次真正的使用RT-Thread Studio进行完整的开发,总体上我觉得还是很好用的,对于从keil或者VSCode转过来的开发者来说都是可以很快适应的,不过最新版有一些软件包找不到,这一点希望修复一下,总体使用感受非常满意。
瑞萨这款芯片是第一次接触,工作中也接触过瑞萨的其他片子,感觉开发资源还是挺丰富的,网上有很多关于他的开源资料,很多文档也都有中文的,对于了解起来非常方便,希望以后和RTT多搞些这样的活动,接触的开发者多了,生态就会更好嘛。
原作者:胡图图