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

news2024/11/16 13:22:41

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

引言

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

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

解决方案

我们利用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.coloradmin.cn/o/2076363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

帆软BI怎么制作不等宽柱状图

帆软BI怎么制作不等宽柱状图 文章目录 帆软BI怎么制作不等宽柱状图不等宽柱状图起源一、怎么做不等宽柱状图准备二、操作步骤1.展示效果2.操作步骤-3.操作步骤 -图形属性4.操作步骤 -组件样式5.操作步骤 -横轴和纵轴6.完成7.不等宽柱状图与传统等宽柱状图对比 总结 不等宽柱状图…

【深度学习】嘿马深度学习笔记第5篇:神经网络与tf.keras,学习目标【附代码文档】

本教程的知识点为&#xff1a;深度学习介绍 1.1 深度学习与机器学习的区别 TensorFlow介绍 2.4 张量 2.4.1 张量(Tensor) 2.4.1.1 张量的类型 TensorFlow介绍 1.2 神经网络基础 1.2.1 Logistic回归 1.2.1.1 Logistic回归 TensorFlow介绍 总结 每日作业 神经网络与tf.keras 1.3 …

介绍云计算在医疗领域的应用实例

云计算在医疗领域的应用日益广泛&#xff0c;为医疗行业带来了诸多便利和创新。以下是几个典型的应用实例&#xff1a; 电子病历管理系统&#xff1a; 基于云计算技术的电子病历管理系统&#xff0c;通过互联网实现对病历数据的存储、管理、维护和查询等功能。这类系统能够自动…

关于助记词,词库的讨论

我有个想法&#xff0c;既然私钥碰撞的难度大。 -seed-&#xff08;pathmasterkey&#xff09;-privatekey-publickey-address 通过反推的难度大&#xff0c;那我可以尝试使用助记词碰撞 就例如&#xff0c;我生成1000个eth地址 1000个地址的助记词全部拿到&#xff0c;然后…

C++学习笔记——打印ASCII码

一、题目描述 二、代码 #include <iostream> using namespace std; int main() {char a_char;int a_int;cin >> a_char;a_int a_char;cout << a_int;return 0; }

【数据结构】关于TreeMap与TreeSet的使用你了解多少???

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解TreeMap与Set的相关知识&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/K1moi &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 目录 &am…

开源模型应用落地-LangChain实用小技巧-使用各种Loader高效解析不同数据源(七)

一、前言 在 LangChain框架中&#xff0c;提供了Loader机制&#xff0c;以统一的方式来从各种数据源获取数据&#xff0c;使得开发人员可以方便地集成不同类型的数据源&#xff0c;而无需为每种数据源编写特定的加载代码。它可以将不同格式的数据转换为 LangChain 可以处理的统…

如何使用ssm实现新锐台球厅管理系统的设计与实现+vue

TOC ssm221新锐台球厅管理系统的设计与实现vue 系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等…

Python(R)均方根误差平均绝对误差导图

&#x1f3af;要点 回归模型评估指标评估薪水预测模型评估员工倦怠率模型评估大气分析生成式对抗模型目标对象缺失下&#xff0c;性能估算法追踪模型误差指标降尺度大气学模拟模型准确性评估蛋白染色质相互作用模型评估 Python回归误差指标 平均绝对误差表示数据集中实际值和…

Manim实现目标的移动和出现速度控制

一&#xff0c;介绍 缓动函数 自定义参数随时间变化的速率。 现实生活中&#xff0c;物体并不是突然启动或者停止&#xff0c; 当然也不可能一直保持匀速移动。就像我们 打开抽屉的过程那样&#xff0c;刚开始拉的那一下动作很快&#xff0c; 但是当抽屉被拉出来之后我们会不自…

TCP协议中断开连接机制

目录 客户端与服务端四次挥手 关于TIME_WAIT状态 为什么TIME_WAIT状态等待的时间是2MSL&#xff1f; 客户端与服务端四次挥手 基于TCP协议通信的客户端与服务端断开连接就要进行四次挥手&#xff0c;如下图&#xff1a; 四次挥手过程中客户端与服务端状态转化&#xff1a; …

Rocm-Programming with HIP 内存分配

1. 主机内存&#xff08;Host Memory&#xff09; hipHostMalloc 是 HIP API 中的一个函数&#xff0c;它用于在主机上分配特殊的内存&#xff0c;这种内存被称为 "pinned" 或 "page-locked" 内存。这种内存有以下特点和用途&#xff1a; GPU 地址空间映射…

SD6201 同步增压DC/DC调节器芯片IC

一般描述 SD6201是高效率同步、PWM升压型DC/DC转换器&#xff0c;专为中型功率系统提供高效率解决方案而优化。该器件在0.9 V至4.4V的输入电压下工作&#xff0c;开关频率为1.4 MHz。这些功能允许使用微小、低剖面的电感和陶瓷电容器&#xff0c;从而最大限度地减少了整…

LivePortrait模型构建指南

一、介绍 快手可灵大模型团队开源了名为 LivePortrait 的可控人像视频生成框架&#xff0c;能够准确、实时地将驱动视频的表情、姿态迁移到静态或动态人像视频上&#xff0c;生成极具表现力的视频结果。该项目的模型产生了定性肖像动画&#xff0c;只要输入一张静态的肖像图像…

多线程面试常问

一、创建线程的几种方式 1、继承Thread类并重写run()方法。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("通过集成 Thread 类实现线程"); } } // 如何使用 new MyThread().start() 2、实现Runnable接口并重写run()方法…

deepin(深度)社区亮相2024 RISC-V中国峰会,全力推动RISC-V生态发展

8月21日—23日&#xff0c;全球三大RISC-V专业展会之一、国内最大的RISC-V年度盛会——2024 RISC-V中国峰会于浙江杭州盛大召开&#xff01;deepin&#xff08;深度&#xff09;社区携手合作伙伴出席峰会&#xff0c;与国内外业界专家、企业代表、研究机构及社区伙伴&#xff0…

python如何通过Json路径返回Json响应对应的值例子解析

在Python中&#xff0c;处理JSON数据通常使用标准库中的json模块来解析和操作JSON格式的数据。如果你想要通过JSON路径来获取JSON响应中的值&#xff0c;你可以使用第三方库&#xff0c;如jsonpath-ng&#xff0c;它允许你使用类似XPath的语法来查询JSON对象。 首先&#xff0…

mysql读写分离(mysql路由)

mysql路由 1. server4路由主机操作 rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm # 安装路由工具 cd /etc/mysqlrouter/ vim mysqlrouter.conf # 配置文件# 均摊 [routing:ro] bind_address 0.0.0.0 bind_port 7001 destinations 192.168.228.11:3306,192.168…

LLM自对齐技术最新研究分享(一):对齐 Pipeline 数据合成(上)

欢迎关注 OpenMMLab 公众号获取一手技术干货 当我们向 ChatGPT 提问时&#xff0c;我们希望他能准确地回答我们的问题。当我们向他提出不合理的要求&#xff0c;比如询问如何制作炸弹或者如何考试作弊&#xff0c;我们希望他能拒绝回答并及时纠正我们的错误。AI 对齐&#xff0…

GAMES104:09高级动画技术:动画树、IK和表情动画-学习笔记

文章目录 一&#xff0c;动画混合1.1 数学混合&#xff1a;线性插值1.2 混合空间Blend Space1.2.1 1D Blend Space1.2.2 2D Blend Space1.2.3 Skeleton Masked Blending骨骼遮罩混合1.2.4 Addictive Blending 二&#xff0c;动画状态机Animation State Machine&#xff08;ASM&…