【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示

这篇具有很好参考价值的文章主要介绍了【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🐱作者:一只大喵咪1201
🐱专栏:《智能家居项目》
🔥格言:你只管努力,剩下的交给时间!
【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言

🥞网卡设备接入输入子系统

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
网络子系统实现了,在我们整个项目框架中,网络子系统也输入子系统中输入设备的之一,所以现在要做的就是网络子系统接入到输入子系统中。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示,在输入子系统中增加网卡输入设备,在头文件net_input.h中提供了增加网卡输入设备的函数声明,在input_system.c中的增加输入设备函数中再增加一个网卡输入设备,此时在宏观层面上已经将网卡输入子系统作为输入设备接入到输入子系统中了。

但是网卡设备作为输入子系统的输入设备还需要去实现:

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言

如上图源文件中代码所示,创建了一个全局的网卡输入设备并进行了初始化,还实现了添加网卡输入设备的函数。

在初始化网卡输入设备的时候,用ESP8266NetInputInit函数作为该设备的初始化方法,在该函数中仅做了注册输入数据处理回调函数的工作,只有在这里注册好了,接收中断发生后才会调用这个函数来处理数据。

输入数据处理回调函数的实现需要单独讲解一下:

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图代码是输入数据处理的回调函数,同样也是使用状态机模型,有三个状态,前面AT层中详细讲解过,这里类似,不同之处在于对有效数据的处理。

当有效数据读取完毕以后,要构造输入事件,也就是给InputEvent类型变量event赋值,包括事件发生事件,事件类型,并且将有效数据拷贝到事件的str成员数组中去,最后要在数据末尾赋值'\0',因为这是一个字符串。

都事件构造好以后,需要将事件上报给业务子系统,也就是将输入事件放入到输入事件的环形缓冲区中,最后将状态机恢复到初始状态以便下一次数据处理。

此时网卡就作为输入设备接入到输入子系统中了,这个过程中的核心工作就是该UART3中断函数注册回调函数,下面来看测试代码。

🍔测试

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图代码所示,在上篇文章网络子系统的测试代码中增加了部分内容,如蓝色框所示。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示,将程序烧带到开发板并且上电以后,准备工作完成,远端发送数据后,ESP8266模块接收到网络数据,并构造成为输入事件InputEvent类型,可以看到,事件类型type=2,并且显示了有效数据。

按键按下时也会产生输入事件,可以看到输入事件类型type=0。无论什么类型的事件,都会构造一个InputEvent类型变量放入输入子系统的环形缓冲区中,只需要不断读取环形缓冲区即可。

🥞业务子系统

现在所有的子系统都实现了,接下来就是要用这些子系统共同构成业务子系统,来看下整个业务子系统有什么功能:

  1. 使用按键控制LED
  • K1控制红灯:松开后改变LED状态
  • K2控制绿灯:松开后改变LED状态
  1. 通过网络控制LED、风扇

PC端的sscom或者用微信小程序给MCU板子发送网络数据,控制板子上的设备:

  • 控制灯:LEDDevice设为:lamp1、lamp2、lamp3,一共三个LED等。

控制命令如下:

状态 命令
{“dev”:“lamp1”,“status”:“1”}
{“dev”:“lamp1”,“status”:“0”}
反转 {“dev”:“lamp1”,“status”:“2”}
  • 控制风扇

控制命令如下:

状态 命令
顺时针旋转 {“dev”:“fan”,“status”:“1”}
逆时针旋转 {“dev”:“fan”,“status”:“-1”}
停止 {“dev”:“fan”,“status”:“0”}
  • 离家&回家模式:离家时将3个LED灯和1个风扇都关闭,回家时将3个LED灯和1个风扇都打开。

控制命令如下:

状态 命令
回家 {“dev”:“home”,“status”:“0”}
离家 {“dev”:“home”,“status”:“1”}

上面的控制命令采用Json格式,以“名称 ":"值”对的方式存储数据,名称和值之间是以冒号间隔,例如"Name":"A-Big-MiaoMi"

Json数据由花括号括起来,可以包含多个“名称":"值”对,以逗号隔开,例如{"Name":"A-Big-MiaoMi","Sex":"Male","Age":"24"},此时就存在三对数据。


  • 底层由按键、网卡发出InputEvent输入事件。
  • 最上层用来控制设备。

根据底层发来的参数控制设备,要屏蔽底层设备细节及它发来的数据,上层不关心底下的是按键、遥控器还是小程序,只需要告诉上层要做什么。

所以要使用Json数据来统一的参数格式,比如{"dev":"lamp1","status":"1"},此时上层就知道要让设备lamp1的状态变成1,它根本不用管这个数据是怎么来的。

无论是按键产生的输入事件函数网络产生的输入事件,都要以Json数据格式交付给上层。

  • 需要一个中间层:将各类方式产生的InputEvent输入事件转为为Json格式的参数。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示,业务子系统要实现这个中间层message.c,然后再在smarthome.c中根据参数控制设备。

🍔输入事件转换为统一参数

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图代码所示,当输入事件产生以后,就调用该函数ConvertInputEventToJson来转换为Json格式。

首先判断是什么类型的输入事件,如果是网络输入事件,则将网络数据直接作为Json数据,因为发送网络数据就是按照Json格式发送的,相当于是远端和MCU之间的约定。

  • 使用sscom发送数据时必须按照这个Json格式发送。
  • 使用小程序时,点下按键以后,后台会自动处理为Json格式并发送。

如果是按键输入事件,先要判断按键是否松开,如果没有松开则之间返回-1,上层不处理LED灯状态。如果松开,则再判断是哪个键按下,将对应设备名和状态构造成Json格式供上层去处理LED灯状态。

🍔根据参数控制设备

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言

  • 初始化各类设备
  • 连接WIFI
  • 在OLED上显示IP、端口
  • 读取InputEvent
  • 转换为Json格式的参数
  • 控制设备

按照上诉步骤来编写代码:

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示代码,先初始化所有设备和子系统,再显示启动信息,表明业务系统正在启动,再显示正在连接信息,连接WIFI,连接好之后显示ESP8266的IP地址和端口号,做好所有准备以后,在循环中检测输入事件,并转换为Json格式。

  • 本喵将WIFI名称和账号使用define内嵌到了程序中,可以根据具体WIFI情况作修改。

各个步骤都是用一个函数实现的,接下来就讲解一下这些函数的实现:

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示代码,在初始化设备和子系统函数中,初始化了LED设备,风扇,显示设备,字库子系统,所有输入子系统,网络子系统,每一部分初始化都按照前面各个单元测试时的步骤来。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言

如上图所示代码,前两个函数只是用来表明业务子系统正在启动或者正在连接WIFI,都是通过OLED设备显示的。在连接WIFI的时候,放在一个循环中连接,直到连接成功。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示代码,WIFI连接成功以后,将ESP8266的IP地址和端口号以及作者信息显示到OLED屏幕上。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示代码是业务子系统根据Json数据来控制设备的,首先要解析Json数据格式,获取设备名称,以及设备状态,都是使用的C库函数strstr来查找字串。

获取到的设备状态有大于0小于0以及等于0三种情况,如果是小于0则状态部分有两个字节,第一个字节是-说明是一个负数,否则就是大于等于0的数。

  • ASCII码数字字符 - 0得到的就是整形数字。
  • 负的数字字符需要单独处理-和字符两个字节。

然后根据设备名字,使用C库函数strncmp来判断是哪个设备,如果是LED设备,则把状态值status给它的Control方法来改变LED灯状态,风扇也是同样的道理。

如果设备名是回家,则将所有LED和风扇都打开,如果是离家则都关闭。

  • 使用for循环打开3个LED灯这里不太完美,如果三个LED等的编号不是0,1,2则不能这样。

🍔定时器按键消抖

按键输入设备中,需要给按键消抖:

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示,理想情况下,每按一次按键,产生一次按键中断,也就是按键所在引脚的电平由高电平直接变成低电平,记录一次数据。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图,但是实际情况是,按下按键以后,由于按键金属片的机械振动,会导致引脚电平发生反复变化,就会发生多次中断,假设发生了五次,难道这五次需要都记录吗?肯定不是,我们只按下一次,所以在程序理也需要只记录一次。

所以就要消除这个机械抖动,通常有三种方式:

  • 硬件消抖

就是在机械结构或者电路中设计一些消抖结构或者消抖电路,对于我们写软件的人来说,这种方式不必考虑。

  • 延时消抖

在前面的图中可以看到,虽然电平会因为抖动而反复变化,但最终还是会稳定到低电平,可以让程序在机械抖动这个过程中停止不动,也就是延时,待抖动停止后再读取这个数据,这就是延时消抖。

但是在使用HAL库的HAL_Delay()函数在按键中断中消抖时会出现问题,HAL_Delay是使用SysTick计时的,它也会产生中断。

但是默认情况下,SysTick中断的优先级是最低的,而我们一般设置的中断优先级都是比较高的,所以在我们的中断函数中调用HAL_Delay时,SysTick的中断就无法打断我们的中断,就无法执行延时函数。

而我们的中断函数中,它在等SysTick中断函数执行完毕才会继续向下执行,此时就会导致程序卡死了,不再动了。

  • 我们自己的中断函数中不能调用HAL_Dealy延时函数,否则会卡死不动。
  • 定时器消抖

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图,同样是延时消抖的思想,假设我们给它设置了10ms延时,也就是一个timer,每发生一次中断,就延时一个timer,直到不再抖动稳定下来才记录。

这种方式中,每发生一次中断,延时就推后一个timer,也就是从头开始计时一个timer

  • 按键中断这里采用的是上升和下降沿都触发。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示代码,在按键设备中的头文件gpio_key.h中增加获取按键的定时时间(延时多久了),设置按键的定时器事件(要延时多久),以及一个对按键定时器处理的函数。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言

如上图对应gpio_key.c中的源文件,创建一个timers数组,大小为2,因为只有两个按键,这个数组中存放的是对应按键要延时的时间值。

获取按键定时器时间就是获得这个数组中的值,表示按键会延时多久,设置定时器事件就是给这个数组设置值,表示按键要要是多久。

对于按键定时器的处理中,对两个定时器都要判断,首先要判断定时器的值不是0,说明该按键在延时,同时再判断当前系统的时间值是否大于这个定时的值,如果小于说明定时没到,大于则说明到了。

定时到了之后,要构建输入事件InputEvent,并且放入到输入事件的环形缓冲区中,上报给上层,任何将定时器值赋值为0,表示该定时器现在不用了。

  • 上报输入事件的工作在这里干了,不用在按键中断函数中上报了!!!

那么是谁来设置这个定时器时间呢?按键中断函数:

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言

如上图所示按键中断函数的回调函数中,每发生一次按键中断,就给对应按键的定时器timers[i]在当前时间基础上增加20作为新的定时时间。

  • 此时中断函数不再负责上报输入事件了,只负责设置定时器事件。
  • 当抖动时,中断会产生多次,定时时间也会不断推后,每次推后20。

现在定时器已经设置好了,处理定时器的方法也有了,那么是谁去处理定时器并上报事件呢?SysTick处理函数:

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示,在SysTick_Handler函数中调用按键定时器处理函数,相当于在让系统调用这个处理函数,因为这个SysTick_Handler属于裸机内核的函数。

🥞整体效果展示

将串口调试助手打开,程序烧录到开发板中并且上电:

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示,此时串口助手会打印很多调试信息,之后最后出现OK等字眼,说明程序启动成功。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图,此时在OLED屏幕上会显示ESP8266模块的IP地址端口号,以及项目作者。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示,在微信小程序上搜索“百问网嵌入式物联网”,使用百问网已经做好的配套小程序,将OLED屏幕上显示的IP地址和端口号填进去,然后提交。

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示,在小程序中点击3种颜色的灯,通过串口调试助手的调试信息可以看到:

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图,可以看到受到了3个灯的Json格式数据,程序中会解析这几个数据并且控制相应的设备:

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图,此时三个灯就都亮了,同样可以使用两个按键控制白灯和蓝灯。

风扇也可以通过小程序界面去控制,还有离家模式和回家模式,本喵就不一一展示了。


【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示,智能家居项目,智能家居,网络,stm32,c语言
如上图所示,也可以通过远端软件sscom发送Json格式的数据,如绿色框中所示,但是切记不要加回车换行,此时远端就会将数据发送给ESP8266,然后通过串口调试助手打印接收到的信息,MCU会解析数据,进而控制风扇设备反转。

  • 使用sscom发送的数据必须是Json格式的,而且设备名也必须是文章开头提到的,因为这是我们和MCU之间的约定。
  • 在点下小程序的某个控制块后,它也会在后台发送对应的Json数据给ESP8266,只是我们在手机上看不到,但是可以通过串口调试助手看到。

🥞项目总结

至此智能家居的项目裸机版本就实现了,整个项目中最重要的就是在传递:

  • 面向对象的编程思想和方法
  • 分层的思想和编程架构

无论使用哪种设备,哪种子系统,在业务子系统层面都不用关心它们的底层实现,只需要调用提供的结构就行,都是按照这样的顺序来用:

  • 创建设备对象
  • 添加所有设备
  • 获取需要的设备并进行初始化
  • 调用设备的操作方法。

几乎都是按照这样的顺序去使用,如果需要配合其他系统则添加相应的系统并初始化就可以了。

🥞源码

完整裸机版智能家居项目源码。文章来源地址https://www.toymoban.com/news/detail-712823.html

到了这里,关于【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【智能家居项目】FreeRTOS版本——将裸机程序改造成FreeRTOS程序 | DHT11温湿度传感器

    🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言: 你只管努力,剩下的交给时间! 如上图所示是裸机版本的智能家居项目总体框架结构,这篇文章开始,本喵要带着大家逐渐将智能家居项目从逻辑版本改为FreeRTOS版本,并且要增加温湿度显示和网络时间获取两个

    2024年02月05日
    浏览(33)
  • 【智能家居项目】FreeRTOS版本——多任务系统中使用DHT11 | 获取SNTP服务器时间 | 重新设计功能框架

    🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言: 你只管努力,剩下的交给时间! 在上篇文章中,本喵仅进行了单任务的DHT11温湿度传感器使用,相当于裸机使用。 根据上面时序图计算接收一次数据(5个字节)的耗时,不考虑主机发送起始信号的耗时: 最小时间

    2024年02月05日
    浏览(34)
  • 【智能家居项目】RT-Thread版本——DHT11获取温湿度 | MQTT上传到服务器 | 服务器控制外设

    🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言: 你只管努力,剩下的交给时间! 这篇文章中,本喵将使用 RT-Thread Studio 来实现这个智能家居的项目,最终效果和前面的裸机版本以及 FreeRTOS 版本一样。在这里本喵将让大家体验到 RT-Thread Studio 的便利。 首先打开

    2024年04月17日
    浏览(39)
  • 鸿蒙生态构建:适配智能家居、车联网等多种设备

    鸿蒙系统是一个面向未来、支持多种设备、多种场景的分布式操作系统。其架构允许开发者在不同的设备上运行相同的代码和应用,大大提高了开发效率和用户体验。鸿蒙系统的生态构建是其适配多种设备的关键。下面,我们将重点讲解鸿蒙系统如何适配智能家居和车联网设

    2024年02月12日
    浏览(32)
  • 智能家居设备的安全与隐私:保护您的家庭

    随着智能家居技术的发展,我们的生活变得越来越便利。智能家居设备可以让我们轻松地控制家庭环境、安全和娱乐等方面的设备,提高了我们的生活质量。然而,与其他技术一样,智能家居设备也面临着安全和隐私问题。这篇文章将讨论智能家居设备的安全和隐私问题,以

    2024年02月20日
    浏览(38)
  • 智能家居中可自行收集能量的无电池的无线设备

    此图片来源于网络 ZigBee是一种基于IEEE 802.15.4标准的低速短距离无线通信技术,用于创建个人区域网络。其名称来源于蜜蜂的八字舞,因为蜜蜂通过这种舞蹈来与同伴传递花粉的所在方位信息,从而构成了群体中的通信网络。ZigBee技术具有近距离、低复杂度、自组织、低功耗

    2024年02月20日
    浏览(26)
  • Linux MQTT智能家居项目(智能家居界面布局)

    1.选择工程名称和项目保存路径 2.选择QWidget 3.添加保存图片的资源文件: 在工程目录下添加Icon文件夹保存图片: 将文件放入目录中: 将图片添加进入资源文件中: 这里我们一共显示4个界面:LED控制界面,温度湿度显示界面,光照强度显示界面,摄像头监测界面。 所以这里

    2024年02月13日
    浏览(41)
  • 【OpenHarmony-鸿蒙】 华为智能家居IoT设备开发-环境搭建篇 一键部署开发环境

    轻量与小型系统入门概述 简介 OpenHarmony轻量和小型系统适用于内存较小的IOT设备(参考内存≥128KiB)。通过本文,开发者可以快速熟悉OpenHarmony轻量和小型系统的环境搭建、编译、烧录、调测以及运行“Hello World”等。 开发环境 开发者通常习惯采用Windows+Ubuntu环境进行OpenHa

    2024年02月12日
    浏览(36)
  • 如何搭建远程控制家中设备的Home Assistant智能家居系统【内网穿透】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 Home Assistant(以下简称HA)是个开源的智能家居平台,也叫家庭助手,就像一个软件,比如我们的QQ软件,微信软件。 Home Assistant把家中的智能家居设备整合到HA中,它

    2024年02月07日
    浏览(36)
  • 【OrangePi Zero2 智能家居】智能家居项目的软件实现

    一、项目整体设计 二、项目代码的前期准备 三、实现语音监听接口 四、实现socket监听接口 五、实现烟雾报警监听接口 六、实现设备节点代码 七、实现接收消息处理接口 整体的软件框架大致如下: 整个项目开启4个监听线程, 分别是: 语音监听线程:用于监听语音指令,

    2024年02月22日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包