饮水机复杂交互功能联网调试

2024-08-27 00:28

本文主要是介绍饮水机复杂交互功能联网调试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

饮水机复杂交互功能联网调试

引言

饮水机我们从最开始的放水和加热, 逐渐拓展到保温功能, 童锁功能, 红外检测功能, 对于这些复杂的交互功能, 我们如果通过按键进行调试, 会极大的增加我们的开发时间和成本, 如果我们频繁的进行烧录, 则如果涉及到一些中间变量, 则无法进行调试.

大家会想到串口, 串口也是可以的, 但是串口发送接受, 太频繁的话, 则会眼花缭乱, 如果我们能够成为上帝, 在程序运行的时候修改并查看变量, 之间的交互状态, 则会方便我们的开发.

解决方案

我们利用Onenet, 创建饮水机产品, 把能够上传的变量, 全部上传, 并且设置成可修改的变量, 我们把要上传的变量上传, 并且可以在服务器下发变量, 并让单片机读取到后, 赋值本地变量.

这样我们就可以取代按键和OLED, 观察交互现象了, 极大的提供了程序开发效率和可视化.

示例工程调试需求

我们通过分析我们之前饮水机的示例, 查看当时我们是怎么手动进行调试的, 我们从而抽取出我们需要远程上传, 远程控制的变量. 从而探索他们之间的交互逻辑.

加热系统达温即停和保温功能调试

对于饮水机的加热功能, 这个是日常生活所必须的, 并且其设计逻辑必须严密, 所以我们要进行逻辑清晰的系统设计, 多重保障, 如果只是通过简单的数据测试, 是不行的. 所以我们就需要频繁的给与初始数据和中间数据, 来测试他们之间的交互性。

比如我们加热水温, 我们不仅仅要调试水温阈值, 还要调试水温, 之前我们调试, 都是通过直接赋予水温初始值, 那么这只能调试一次, 并且调试不了他们之间的模式切换。

所以, 我们如果能快速控制水温, 快速控制水温阈值, 让饮水机自带的逻辑, 去判断,我们通过观察交互现象, 来测试我们的程序是否具有健壮性。

达温即停和保温功能手动调试

跳转查看详细博客

需要调试的变量

通过观看我们的博客

在加热模式下, 我们调试的是水温 water_temp 和加热阈值 heat_temp_th

在保温模式下,我们调试的是水温water_temp和保温阈值 KeepWarm_th

模式切换方面, 我们调试的是 控制模式切换的变量 heat_mode

image-20240826163334910

加热系统模式交互测试

image-20240826164054278

通过观察博客, 我们知道, 加热模式, 我们用户切换到加热模式, 然后设置完加热阈值后, 饮水机把水加热到阈值后, 就会切换为关闭模式.

这个就是我们 加热模式的交互功能.

image-20240826164151057

我们的调试思路就是, 通过先设置水温和加热阈值(水温 < 加热阈值), 然后把模式切换为加热模式, 查看, 是否会触发加热, 就是红色小灯是否会亮。

从而观察现象, 得出在加热模式下, 当水温 < 加热阈值, 是否会触发加热, 饮水机加热是否正常运行

接下来调试的是,加热模式下, 当加热系统把水温加热到所需阈值后, 是否会触发自动关闭加热.

我们的调试方法就是,在上一个模式的基础上 直接修改水温(充当上帝), 这样程序就会把水温读取到 加热处理函数, 我们查看是否会切换模式,

并且, 系统是否把加热小灯关掉.

从而得出结论:

在加热模式下, 当水温 >= 水温阈值, 是否能够触发自动关闭加热功能

保温系统可用性测试

相对于加热系统, 我们保温系统, 需要一直保温, 一直保温就代表着我们一旦 水温 < 保温阈值, 我们就要加热, 我们要测试的 就是

水温 < 保温阈值 : 饮水机能否加热

水温 >= 保温阈值 : 饮水机能否关闭加热

我们要重复的进行测试, 从而测试系统可用性.

1 测试功能: 在水温失温后, 加热到保温阈值的保温功能

测试方法: 我们把调整水温 和 保温阈值(水温 < 保温阈值), 然后把模式设置成 保温模式,

观察现象:查看是否会触发红灯加热

得出结论: 保温系统, 是否能够正常的加热保温

2 测试功能: 加热到保温阈值后的关闭加热功能.

测试方法: 在上一个功能调试的基础上, 调整水温 >= 保温阈值

观察现象:查看小灯是否会熄灭

得出结论: 保温系统, 能否保证达温即停

童锁功能交互

童锁功能, 是为了家庭避免儿童误触而开发的, 所以当童锁开启的时候, 饮水机是不能开水的, 所以我们在童锁打开的情况下, 不能开启水龙头

跳转童锁加入步骤

所以我们设置 童锁的状态 child_lock_info.Status

童锁锁住时

child_lock_info.Status = lock_child

童锁解开时

child_lock_info.Status = Unlock_child

童锁功能调试需要用到的变量

童锁变量分析

水龙头控制

童锁控制的是开关水龙头, 所以所有关于开水的设置, 我们都要考虑在内。

在没有加任何安全措施的时候, 我们只是通过 直接控制io口, 进行开关水龙头的, 后来我们为了检测水龙头的状态,避免重复开关水龙头, 所以加了放水的状态控制变量 out_water_info.State .

开水

out_water_ON	 1

关水

out_water_OFF	 0
红外检测变量

红外检测

后来为了防误触, 加了红外检测, 所以我们又加入了红外检测到杯子遮挡后, 触发中断, 我们把杯子状态设置成

 Cup_placement  1	//杯子放置

如果没有触发中断, 则杯子状态是不存在

Cup_disappears 0	//杯子未检测到

所以我们加入了杯子状态变量 cup_place_info.Status

变量交互分析图

当保护措施过多的时候, 我们就很难分析他们之间的交互关系了, 但是我们转换一个思路来想, 他们都是为了开水安全, 也就是说, 当我发送开水指令的时候, 他们会千方百计的给我提条件, 当满足他们说的安全条件时, 才放行开水. 所以我们在 放水的函数里面做工作, 以不变应万变.

image-20240826175716062

对应的底层开水状态控制代码

void OUT_water_Set(_Bool status)
{if( status == out_water_ON && out_water_info.Status != out_water_ON && child_lock_info.Status == Unlock_child &&cup_place_info.Status == Cup_placement){GPIO_SetBits(GPIOA, GPIO_Pin_7);out_water_info.Status = out_water_ON;	}else if((status == out_water_OFF && out_water_info.Status != out_water_OFF) ||child_lock_info.Status == lock_child 	||cup_place_info.Status == Cup_disappears){GPIO_ResetBits(GPIOA, GPIO_Pin_7);out_water_info.Status = out_water_OFF;}	
}
童锁功能测试

1 测试目的: 测试童锁对水龙头的保护作用

测试方法:

我们开启童锁

设置童锁

out_water_info.State = lock_child;

然后让其他两个条件全部满足, 测试是否可以开水.

cup_place_info.Status = Cup_placement;//杯子放置
out_water_info.Status != out_water_ON;//水龙头未开

然后控制开水, 测试

OUT_water_Set(out_water_ON);

测试现象: 观察, 如果不能控制水龙头的io对应的小灯不亮, 则代表童锁起到了保护作用.

2 测试目的: 测试关闭童锁后, 满足其他两个条件后, 是否可以正常接水

我们解开童锁

设置童锁状态

out_water_info.State = Unlock_child;

然后让其他两个条件全部满足, 测试是否可以开水.

cup_place_info.Status = Cup_placement;//杯子放置
out_water_info.Status != out_water_ON;//水龙头未开

然后控制开水, 测试

OUT_water_Set(out_water_ON);

测试现象:观察, 如果不能控制水龙头的io对应的小灯亮起, 则用户可以正常关闭童锁, 然后正常接水 .

联网调试变量交互分析

加热系统

需要上传

//水温
water_temp
//加热阈值
heat_temp_th
//保温阈值
KeepWarm_th
//加热模式
heat_mode

image-20240826163334910

饮水系统

我们根据饮水机的童锁和红外的交互功能, 来判断, 是否可以控制底层开启水龙头

image-20240826175716062

image-20240826215853205

上图, 描述了他们之间的关系, 代码中也体现了出来, 所以我们上传的变量分别是

//童锁状态
child_lock_info.Status
//杯子是否放置cup_place_info.Status
//水龙头出水状态    out_water_info.Status   

这篇关于饮水机复杂交互功能联网调试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110115

相关文章

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk