【1】08业务系统_需求和思路

创建时间:2022/3/1 16:19
更新时间:2022/5/5 14:07
作者:gi51wa2j
标签:bingo, RTOS训练营, 基于HAL的智能家居, 正文

1.业务系统_需求和思路

1.1 业务需求


1.1.1 使用按键控制LED

  • K1控制红灯:松开后改变LED状态

  • K2控制绿灯:松开后改变LED状态

1.1.2 通过网络控制LED、风扇

PC或者微信小程序可以给板子发送网络数据,控制板上设备。

  • 控制灯:

    • dev可设为: lamp1、lamp2、lamp3

    • 命令如下


状态
命令
{"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":"1"}
离家
{"dev":"home","status":"0"}


1.2 设计思路

  • 底层由按键、网卡发出InputEvent

  • 最上层用来控制设备

    • 根据底层发来的参数控制设备

    • 应该屏蔽底层设备细节及它发来的数据:我关心底下的是按键、遥控器还是网络数据,告诉我做什么就可以

    • 使用统一的参数:使用Json格式的参数,比如:

      {"dev":"lamp1","status":"1"}
    • 网络数据也是使用Json格式的数据

  • 由于不想由于底层设备的添加而更改最上层程序的控制逻辑,就需要对中间数据进行处理转换为统一的参数,然后使用统一的参数在最上层的控制逻辑程序中进行处理。

  • 因此需要中间层:把各类InputEvent转换为Json格式的参数




1.3 附录: Json格式

JSON是以“名称 : 值”对的方式存储数据,名称和值之间是以冒号间隔:

"Name":"weidongshan"

JSON数据由花括号括起来,可以包含多个“名称:值”对,以逗号隔开

{"Name":"weidongshan","Sex":"Male","Age":"40"}


2.业务系统_编写代码

本节源码:在GIT仓库中

rtos_doc_source\RTOS培训资料\ 01_项目1_基于HAL库实现智能家居\ 05_项目1_基于HAL库的智能家居\1_项目源码\ 10_27_smarthome_not_tested

2.1 程序层次


2.2 编写message.c

把InputEvent转换为Json格式的参数。


2.3 编写smarthome.c

  • 初始化各类设备

  • 连接WIFI

  • 在OLED上显示IP、端口

  • 读取InputEvent

  • 转换为Json格式的参数

  • 控制设备


3.业务系统_测试

本节源码:在GIT仓库中

rtos_doc_source\RTOS培训资料\ 01_项目1_基于HAL库实现智能家居\ 05_项目1_基于HAL库的智能家居\1_项目源码\ 10_27_smarthome_not_tested 10_28_smarthome_ok

3.1 修改的地方

使用"Beyond Compare"比较工具比较这2个程序:10_27_smarthome_not_tested和10_28_smarthome_ok。

修改了这些地方:

  • 使用定时器消除按键抖动

1. 移植源码: 10_6_input_unittest_debouncing 2. 涉及文件: Core\Src\stm32f1xx_it.c ModuleDrivers\driver_key.c smartdevice\input\gpio_key.c
  • 增加风扇设备

1. 移植源码: 10_12_device_fan 2. 涉及文件: smartdevice\device\fan_device.c smartdevice\kal\kal_fan_device.c smartdevice\cal\cal_fan_device.c ModuleDrivers\driver_fan.c
  • 修改LED设备,增加反转状态的功能

1. 涉及文件: smartdevice\device\led_device.h smartdevice\device\led_device.c ModuleDrivers\driver_led.c
  • 输入系统扩大缓冲区: 网络数据比较大

文件:smartdevice\input\input_system.h 修改:把INTPU_BUF_LEN从20改为了50
  • 修改文本系统的BUG

1.现象:所显示的文字中间有缺失 2.涉及文件:smartdevice\text\show_text.c
  • 在头文件里把WIFI热点信息用宏表示

涉及文件:smartdevice\smarthome\smarthome.h
  • 修改编译错误:编译、修改反复进行


3.2 上机实验

3.2.1 确定WIFI热点的名称、密码

去修改smartdevice\smarthome\smarthome.h,比如:

/* 你做实验时需要修改这2项: WIFI热点的名称和密码 */ #define SSID        "Programmers" #define PASSWORD    "100asktech"


3.2.2 启动开发板

观察OLED屏幕信息,确定IP、Port。


3.2.3 启动微信小程序

  • 使用微信小程序:搜"百问网嵌入式物联网"

  • 使用微信小程序:扫码

3.2.4 在PC上操作

除了微信小程序,

还可以在PC上使用sscom5.13.1给板子发送信息,一样可以控制设备。

  • 控制灯:

    • dev可设为: lamp1、lamp2、lamp3

    • 命令如下


状态
命令
{"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"}


4. 为什么要引入RTOS

我们这个程序写得已经比较漂亮了,但是我来看看他有什么缺点,得必须引入rtos。
  1. 增加一个功能:检测WIFI连接情况,断开就重连
  2. 增加一个功能:玩游戏
这个游戏,有很耗时间的话:前面智能家居的功能就会受到影响。
这就是传统的单片机程序的缺点:
while (1) {   A;   B;   C; }
ABC互相影响,你得有强大的统筹能力。
使用纯粹裸机,能够实现复杂功能的工程师: 水平真不一般。
上面问题的关键在于: ABC,是按照顺序,依次执行。
如果,我们能够让ABC同时执行,我就不需要去管别人对我的影响。

没有rtos时, 我们怎么写复杂的程序?实际上我们已经体现出来了:
使用中断,我们使用中断来处理了按键、处理了网络数据。
另外一种常规的做法是:使用中断来修改状态机。
main里面,根据状态机来执行不同的事情。

没有rtos的时候,我们要去精心协调各个任务。
在rtos里,ABC看起来可以同时运行,实际上他们还是依次运行。
只不过运行的机制是这样:
A运行一毫秒
B运行一毫秒
C运行一毫秒
A运行一毫秒
我们人类很没那么快,感觉他们好像同时运行。

这就可以解决很多问题:
A: 游戏
B: 智能家居
在同一个单片机上,A、B同时运行,程序反而更容易写出来。
这作为后天课程的引言,后天我们开始讲FreeRTOS快速入门。

最后,贴一个图,把我们的程序结构,都写清楚了:

5. 程序改进