基于智能家居项目 实现DHT11驱动源代码
DHT11 温湿度传感器的数据读取一般分为 四个步骤,下面详细介绍每个步骤的具体内容:
步骤一:主机发送起始信号
-
主机(如 MCU)主动向 DHT11 发送开始信号,方式为:
-
将数据线拉低 至少 18ms(确保 DHT11 能够识别这是一个起始信号);
-
然后拉高数据线 20~40μs;
-
-
这个动作通知 DHT11 准备发送数据。
步骤二:DHT11 发出响应信号
-
接收到主机的起始信号后,DHT11 做出响应:
-
首先将数据线拉低 80μs;
-
然后拉高数据线 80μs;
-
-
表示 DHT11 已准备好传输数据。
步骤三:DHT11 传输40位数据
-
DHT11 按顺序传送 40 位数据(高位先传),格式如下:
-
8位湿度整数 + 8位湿度小数 + 8位温度整数 + 8位温度小数 + 8位校验和
-
每一位的传输方式:
-
逻辑“0”:拉高约 26~28μs;
-
逻辑“1”:拉高约 70μs。
-
起始位:先拉低数据线约 50μs;
-
数据位:
-
步骤四:主机校验数据完整性
-
主机接收完 40 位数据后,将前四个字节相加(无进位):
-
校验 = 湿度整数 + 湿度小数 + 温度整数 + 温度小数
-
与第五字节(校验和)进行比较,验证数据是否正确;
-
若相符,说明读取成功。
在DHT11.c文件中
#include "DHT11.h"
#include "delay.h"
//初始化DHT11_Data引脚
void DHT11_Init()
{
///因为PB3是不可用的,所以我们先解除把不可用
//打开GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_PinRemapConfig (GPIO_Remap_SWJ_JTAGDisable , ENABLE);
//初始化GPIO口为开漏输出
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init (GPIOA, &GPIO_InitStruct);//打开GPIOA时钟
DHT11_H; //初始化为高电平
delay_ms(1000); //进行一个延时,目的越过模块不稳定期
}
//主机发送起始信号
void Start()
{
DHT11_L;
delay_ms(20);
DHT11_H // 释放总线,等待从机响应
}
//响应函数,就是主机读取IO口,是否为在指定电平,判断响应完成
//比如返回0,表示响应成功
u8 Respond()
{
u8 time_out = 0;
while(DHT11_R == 1)// 等待主机响应
{
time_out++;
delay_us(1);
if(time_out > 50) //说明等待时间超长,没有等到应答信号
{
return 1;
}
}
time_out =0;
while(DHT11_R == 0) // 开始响应
{
time_out++;
if(time_out > 100) //等待时间>100
{
return 2;
}
}
if(time_out < 50) //响应时间过短
{
return 3;
}
while(DHT11_R == 1) //从机等待主机准备
return 0;
}
//读取DHT1140位数据
void DHT11_Read(u8 *pData)
{
u8 i,j;
for(i = 0 ; i<5;i++)
{
for(j = 0;j<8;j++)
{
while(DHT11_R == 0);
delay_us(50);
pData[i] <<= 1;
if(DHT11_R == 1)
{
pData[i] |= 1;
while(DHT11_R == 1);
}
}
}
}
//获取温湿度数据
u8 DHT11_Get(u8 *shi,u8 * temp)
{
u8 ret;
u8 datas[5];
Start();
ret = Respond();
if(ret ==1)
{
return 1; //相应失败
}
DHT11_Read(datas);
if( (datas[0]+ datas[1] + datas[2] + datas[3]) != datas[4])
{
return 2 ;// 接收数据错误
}
*shi = datas[0] + datas[1]/10;
if(datas[3] & 0x80) //判断温度为负数
{
*temp = (datas[2] + (datas[3]& 0x0F) / 10 )* -1;
}
else{
*temp = datas[2] + datas[3]/10;
}
return 0;
}
重点讲一下,DHT11获取函数和DHT11读取函数
一、读取 DHT11 的 40 位数据:DHT11_Read(u8 *pData)
一、读取 DHT11 的 40 位数据:
DHT11_Read(u8 *pData)
void DHT11_Read(u8 *pData)
{
u8 i, j;
for(i = 0; i < 5; i++) // 总共要读取 5 个字节(8 位 * 5 = 40 位)
{
for(j = 0; j < 8; j++) // 每个字节 8 位
{
while(DHT11_R == 0); // 等待 DHT11 拉高,表示开始发送这一位的高电平部分
delay_us(50); // 延时 50us,用于判断当前是 0 还是 1
pData[i] <<= 1; // 左移一位,为当前位腾出位置
if(DHT11_R == 1) // 如果此时仍然为高电平,则是“1”
{
pData[i] |= 1; // 将当前最低位置 1
while(DHT11_R == 1); // 等待高电平结束
}
// 如果延时后是低电平,就什么都不做,当前位默认是 0
}
}
}
🔍 核心原理解释:
DHT11 发送每一位数据时,先是一个固定的低电平(约 50μs),然后是一个高电平:
高电平持续 26~28μs 代表 0;
高电平持续 70μs 代表 1;
所以主机延时 50μs 后读取数据线状态,来判断是 0 还是 1。
二、获取温湿度数据:
DHT11_Get(u8 *shi,u8 *temp)
u8 DHT11_Get(u8 *shi, u8 *temp)
{
u8 ret;
u8 datas[5];
Start(); // 主机发送起始信号
ret = Respond(); // 等待 DHT11 响应
if(ret == 1)
{
return 1; // 响应失败
}
DHT11_Read(datas); // 读取 40 位数据到 datas[0] ~ datas[4]
// 校验和验证数据完整性
if ((datas[0] + datas[1] + datas[2] + datas[3]) != datas[4])
{
return 2; // 校验失败,数据错误
}
// 获取湿度,datas[0]是整数部分,datas[1]是小数部分
*shi = datas[0] + datas[1] / 10;
// 获取温度,datas[2]是整数部分,datas[3]是小数部分
if(datas[3] & 0x80) // 判断是否为负温(DHT11 其实不支持负温度,但兼容设计)
{
*temp = (datas[2] + (datas[3] & 0x0F) / 10) * -1;
}
else
{
*temp = datas[2] + datas[3] / 10;
}
return 0; // 读取成功
}
🔍 注意点:
Start() 和
Respond() 是发送起始信号和等待响应,属于步骤 1 和 2;
校验和确保数据的可靠性;
DHT11 实际只返回 整数值,小数部分一般为
0,设计保留是为了与 DHT22 等更高精度传感器兼容;
datas[3] & 0x80 判负值是为兼容 DHT12 或 DHT22 数据格式,DHT11 实际温度是非负的,所以这段代码更具有通用性。
在DHT11.h文件
#ifndef _DHT11_H_
#define _DHT11_H_
#include "stm32f10x.h"
#define DHT11_H GPIO_SetBits (GPIOB,GPIO_Pin_3);
#define DHT11_L GPIO_ResetBits (GPIOB, GPIO_Pin_3)
#define DHT11_R GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_3)
void DHT11_Init();
u8 DHT11_Get(u8 *shi,u8 * temp);
#endif
相关文章:
基于智能家居项目 实现DHT11驱动源代码
DHT11 温湿度传感器的数据读取一般分为 四个步骤,下面详细介绍每个步骤的具体内容: 步骤一:主机发送起始信号 主机(如 MCU)主动向 DHT11 发送开始信号,方式为: 将数据线拉低 至少 18ms&…...
小程序的内置组件
一、Text文本组件 1.Text组件解析 Text组件用于显示文本, 类似于span标签, 是行内元素 user-select属性决定文本内容是否可以让用户选中 space有三个取值(了解) decode是否解码(了解) decode可以解析的有 < > & '    二、Butto…...
T-BOX硬件方案深度解析:STM32与SD NAND Flash存储的完美搭配
在智能网联汽车快速发展的当下,车载 T-BOX(Telematics Box)作为车辆与云端互联的核心枢纽,其性能和可靠性直接决定了用户体验的上限。米客方德(MK)推出的基于 STM32H7RX 主控芯片与 MKDV4GIL-AST࿰…...
hadoop3.x单机部署
jdk hadoop3.x需要jdk8以上的版本 hadoop3.x 从官网下载对应的tar.gz文件 配置环境变量 vim /etc/profile# 需要替换为自己的安装地址!!! export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-amd64 export PATH$PATH:$JAVA_HOME/bin expo…...
Hadoop的目录结构和组成
Hadoop 目录结构 bin 目录:包含了 Hadoop 的各种命令行工具,如hadoop、hdfs等,用于启动和管理 Hadoop 集群,以及执行各种数据处理任务。etc 目录:存放 Hadoop 的配置文件,包括core-site.xml、hdfs-site.xm…...
深度剖析 RTX 4090 GPU 算力租赁:从技术优势到生态价值的全维度解析
一、引言:当算力成为数字经济的 "新石油" 在 AI 大模型训练成本突破千万美元大关、元宇宙场景渲染需求呈指数级增长的 2025 年,算力已然成为驱动技术创新的核心生产要素。NVIDIA RTX 4090 显卡作为消费级 GPU 的性能天花板,正通…...
基于MATLAB的生物量数据拟合模型研究
一、研究背景 在现代科学研究与工程实践的广泛领域中,数据拟合扮演着举足轻重的角色。从物理学中对复杂物理现象的建模,到生物学里对生物生长规律的探究,数据拟合已成为揭示数据内在规律、构建有效数学模型的关键技术手段。其核心要义在于&am…...
VSCode设置SSH免密登录
引言 2025年05月13日20:21:14 原来一直用的PyCharn来完成代码在远程服务器上的运行,但是PyCharm时不时同步代码会有问题。因此,尝试用VSCode来完成代码SSH远程运行。由于VSCode每次进行SSH连接的时候都要手动输入密码,为了解决这个问题在本…...
微信小程序的开发及问题解决
HttpClient 测试例子 SpringBootTest public class HttpClientTest {/*** 测试通过httpclient发送get方式的请求*/Testpublic void testGET() throws IOException {//创建httpclient对象CloseableHttpClient httpClient HttpClients.createDefault();//创建请求对象HttpGet ht…...
vscode百宝箱工具插件(devtools)
vscode百宝箱插件是一款结合JSON格式化, 正则表达式测试等工具为一体的插件, 直接嵌入到vscode里面, 省去了上网去找相应的工具 一、插件名称:devtools(TraesureBox) 目前插件上传到vscode插件市场, 搜索 devtools 看…...
3.5 统计初步
本章系统阐述统计推断理论基础,涵盖大数定律、抽样分布、参数估计与假设检验等核心内容。以下从六个核心考点系统梳理知识体系: 考点一:大数定律与中心极限定理 1. 大数定律 切比雪夫不等式: 设随机变量 X X X 的数学期望 E (…...
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡 在当今万物互联的时代,物联网设备的稳定运行已成为企业数字化转型的基石。优雅草星云智控系统作为新一代智能监控平台,其设备告警管理模块集成了先进的监控逻辑与人性…...
讯联云库项目开发日志(一)
1、设计数据库 2、写基本框架 entity、controller、service、exception、utils、mapper mapper层: 生成了一系列的CRUD方法 工具类:线程安全的日期工具类、 参数校验工具类 线程安全的日期工具类:主要用于 日期格式化&…...
UE5通过C++实现TcpSocket连接
在 Unreal Engine 5 的 C 项目中,实现一个具备消息监听、心跳检测和断线重连功能的 TCP 客户端,可以参考以下完整示例。 准备工作 1、模块依赖 在 YourModule.Build.cs 文件中,添加对 Sockets 和 Networking 模块的依赖: Publ…...
Spark的缓存
RDD缓存 Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或缓存多个数据集。当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出的RDD进行的其他动作中重用。这使得后续的动作变得更加迅速。…...
Vue 3.5 :新特性全解析与开发实践指南
2025 年初,Vue 官方正式发布了 Vue 3.5 版本,为开发者带来了诸多令人期待的新特性和性能优化。本文将全面解析 Vue 3.5 的核心更新内容,帮助你快速上手并应用于实际项目中。 🌟 1. 服务器端渲染(SSR)增强 L…...
电能质量扰动信号信号通过hilbert变换得到瞬时频率
利用Hilbert变换从电能质量扰动信号中提取瞬时频率、瞬时幅值、Hilbert谱和边际谱的详细步骤及MATLAB代码实现。该流程适用于电压暂降、暂升、谐波、闪变等扰动分析。 1. Hilbert变换与特征提取流程 1.1 基本步骤 信号预处理:滤波去噪(如小波去噪&…...
跨境电商数据被入侵后的应急与防护策略
随着跨境电商的全球化发展,数据安全已成为企业运营的核心挑战。一旦数据被入侵,不仅会导致经济损失,还可能引发法律纠纷和品牌声誉危机。本文将从应急响应、技术防护、合规管理三个维度,结合实际案例,提供系统性解决方…...
日拱一卒 | RNA-seq质控分析(2)
之前对这些软件的认识通常是云里雾里的。知道要用哪个软件,从网上抄一些代码,然后改改,就直接用了,对软件的原理不甚了解。此为急需改变的现状。这个过程也许需要重复重复的进行,但是我庆幸自己在实践的过程中了。 1.…...
org.slf4j.MDC介绍-笔记
1. 功能简介 MDC(Mapped Diagnostic Context)是 SLF4J 提供的一个接口,用于在多线程环境中为每个线程存储上下文信息。这些信息通常用于日志记录,帮助开发者快速定位问题。MDC 是基于 ThreadLocal 实现的,这意味着每个…...
推荐几个常用免费的文本转语音工具
推荐几个常用免费的文本转语音工具 在数字内容创作的时代,文本转语音(TTS)技术已经成为内容创作者的得力助手。无论是制作视频配音、有声读物、还是为网站增加语音功能,这些工具都能大幅提高创作效率。今天,我将为大家推荐几款优质的免费文本…...
大白话解释联邦学习
数据孤岛:为何发生?有何危害?如何解决? 什么是数据孤岛? 企业或组织内部,数据因存储分散、标准不一、系统或部门壁垒,导致数据像一座座孤立的岛屿,无法自由流通与整合,…...
Jsp技术入门指南【十三】基于 JSTL SQL 标签库实现 MySQL 数据库连接与数据分页展示
Jsp技术入门指南【十三】基于 JSTL SQL 标签库实现 MySQL 数据库连接与数据分页展示 前言一、回顾SQL标签的内容1. 什么是JSTL SQL标签?2.为什么要用SQL标签?3.第一步:引入SQL标签库4. SQL标签的核心功能:连接数据库标签常用属性&…...
SQL、Oracle 和 SQL Server 的比较与分析
SQL、Oracle 和 SQL Server 的比较与分析 一、基础概念 1. SQL (Structured Query Language) 定义:结构化查询语言,用于管理关系型数据库的标准语言类型: DDL (数据定义语言):CREATE, ALTER, DROPDML (数据操作语言)࿱…...
Java大师成长计划之第21天:Spring Boot快速入门
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在现代Java开发中,Sprin…...
python_竞态条件
好的,我们通过一个具体的例子来说明在多线程环境中,可变对象和不可变对象的行为差异,以及不可变对象如何避免竞态条件(race condition)。 1. 竞态条件(Race Condition) 竞态条件是指在多线程环…...
【HBase整合Hive】HBase-1.4.8整合Hive-2.3.3过程
HBase-1.4.8整合Hive-2.3.3过程 一、摘要二、整合过程三、注意事项 一、摘要 HBase集成Hive,由Hive来编写SQL语句操作HBase有以下好处: 简化操作:Hive提供了类SQL的查询语言HiveQL,对于熟悉SQL的用户来说,无需学习HBas…...
AI智能分析网关V4助力工厂/工地/车间/能源矿山场景玩手机行为精准检测与安全生产智能化监管
一、方案概述 在数字化时代,智能手机的广泛使用给特定场景带来诸多管理挑战。在工业生产、教育教学、危化品作业等场所,人员玩手机易引发安全隐患。AI智能分析网关V4凭借先进的AI视频分析技术与强大的边缘计算能力,精准识别玩手机行为&…...
云手机服务器搭建
云手机服务器搭建的核心要点及实施指南: 一、硬件与网络基础要求 服务器硬件 需配置至少2核4GB内存的云服务器(推荐华为云、雨云等支持KVM虚拟化的服务商) 必须支持KVM虚拟化技术(需通过CPU虚拟化检测) 建议选择大…...
软考 系统架构设计师系列知识点之杂项集萃(58)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(57) 第95题 RIPv2对RIPv1协议的改进之一为路由器必须有选择地将路由表中的信息发送给邻居,而不是发送整个路由表。具体地说,一条路由信息不会被发送给该信息的…...
【Pandas】pandas DataFrame cumprod
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...
Vue.js---分支切换与cleanup
4.2 分支切换与cleanup 1、分支切换 01 const data { ok: true, text: hello world } 02 const obj new Proxy(data, { /* ... */ }) 03 04 effect(function effectFn() { 05 document.body.innerText obj.ok ? obj.text : not 06 })什么是分支切换?就是 d…...
数据集-目标检测系列- 杨桃 数据集 Starfruit>> DataBall
数据集-目标检测系列- 杨桃 数据集 Starfruit>> DataBall * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2)数据集训练、推理相关项目:GitH…...
专题三:穷举vs暴搜vs深搜vs回溯vs剪枝(全排列)决策树与递归实现详解
题目分析: 给一个数组,列出它的全排列 算法原理分析: 这里就是一个穷举/枚举的原理,就是罗列所有的可能情况 第一步:画决策树(越详细越好) 就是你如何暴力穷举每一种情况,把你的…...
1.3 不确定性分析
3.1 盈亏平衡分析 3.1.1 盈亏平衡分析的概念和分类 1.概念 销售收入总成本总成本固定成本可变成本(单位可变成本、单位税金及附加) 2.分类 线性盈亏平衡分析、非线性盈亏平衡分析通常只求线性盈亏平衡分析 3.1.2 线性盈亏平衡分析 1.前提条件 产量等于销售量、当年生产…...
端侧智能重构智能监控新路径 | 2025 高通边缘智能创新应用大赛第三场公开课来袭!
2025 高通边缘智能创新应用大赛初赛激战正酣,系列公开课持续输出硬核干货! 5月20日晚8点,第三场重磅课程《端侧智能如何重构下一代智能监控》将准时开启,广翼智联高级产品市场经理伍理化将聚焦智能监控领域的技术变革与产业落地&…...
SAP-12-1
1.描述列事务码的作用: su01:修改密码 se11:创建数据元素,数据表,域 se14:删除数据库的所有数据 se16:数据库查询,插入 se16n:数据删除 se21:创建包 se38:创建程序 se80:对象管理 2.解释下述ABAP基本数据类型的存储数据 I:整型 F:…...
【认知思维】过度自信效应:高估自我能力的认知偏差
什么是过度自信效应 过度自信效应(Overconfidence Effect)是指人们对自己的知识、能力和判断准确性的信心程度系统性地高于实际表现的心理现象。这种认知偏差表现为人们倾向于高估自己的知识水平、预测能力、决策质量和控制感,而低估任务难度…...
【图像处理基石】如何入门AI计算机视觉?
入门AI计算机视觉需要从基础理论、工具方法和实战项目三个维度逐步推进,以下是系统化的学习路径和建议: 一、夯实基础:核心知识储备 1. 数学基础(必备) 线性代数:矩阵运算、特征值分解、奇异值分解&…...
FFmpeg3.4 libavcodec协议框架增加新的decode协议
查看ffmepg下面的configure文件发现,config.h文件;解码协议的配置是通过libavcodec/allcodecs.c文件,通过查找DEC关键字生成的。 1、在libavcodec/allcodecs.c 新增REGISTER_ENCODER(MYCODE, mycode); REGISTER_ENCODER(VP8_VAAPI, vp8_vaapi); …...
C++中的各式类型转换
隐式转换: 基本类型的隐式转换: 当函数参数类型非精确匹配,但是可以转换的时候发生 如: void func1(double x){cout << x << endl; }void func2(char c){cout << c << endl; }int main(){func1(2);//…...
转发多台px4仿真UDP数据到地面站
转发脚本的任务需求 仿真采用UDP通信方式,在 wsl 中仿真三台飞机,项目需要将一台电脑中的三台飞机的数据打包发送到另一台飞机的地面站,但地面站是无法直接访问另一台主机的 wsl 中的端口的,wsl 中的端口需要本机才能访问&#x…...
polarctf-web-[简单rce]
考点: (1)RCE(eval函数) (2)执行函数(passthru函数) (3)/顶级(根)目录查看 (4)sort排序查看函数 题目来源:Polarctf-web-[简单rce] 解题: 代码审计 <?php/*PolarD&N CTF*/highlight_file(__FILE__);function no($txt){ # …...
Deno、Bun、Node.js 性能对比与选型指南
Deno、Bun、Node.js 性能对比与选型指南 一、背景介绍 在现代 JavaScript/TypeScript 开发中,运行时(Runtime)已经不仅仅是 Node.js 一家独大。随着 Deno 和 Bun 的崛起,开发者拥有了更多选择。那么这三者在性能、兼容性、生态和…...
如何优化MCU中断响应时间
目录 1、硬件层优化策略 1.1、中断控制器配置优化 1.2、DMA协同中断优化 1.3、中断向量表重映射技术 2、软件层优化技术 2.1、中断服务程序优化准则 2.2、编译器优化策略 3、系统架构级优化 中断响应时间由硬件延迟和软件延迟共同构成。硬件延迟包括中断信号传输时间、…...
当java进程内存使用超过jvm设置大小会发生什么?
当 Java 进程的内存使用超过 JVM 设置的最大内存限制时,具体会发生以下情况,取决于内存溢出的区域和配置: 1. 堆内存溢出(Heap Memory Exhaustion) 触发条件:对象分配请求超过 -Xmx(最大堆内存…...
FFmpeg多路节目流复用为一路包含多个节目的输出流
在音视频处理领域,将多个独立的节目流(如不同频道的音视频内容)合并为一个包含多个节目的输出流是常见需求。FFmpeg 作为功能强大的多媒体处理工具,提供了灵活的流复用能力,本文将通过具体案例解析如何使用 FFmpeg 实现…...
MongoDB与PostgreSQL两个数据库的特点详细对比
MongoDB 和 PostgreSQL 是两种不同类型的数据库,分别属于 NoSQL(文档型) 和 关系型(SQL) 数据库。它们在数据模型、查询语言、扩展性、事务支持等方面有显著差异。以下是详细对比: 1. …...
IDEA查看类结构视图窗口,接口的所有的实现类图
在IntelliJ(idea)中,可以通过以下步骤查看类结构窗口: 打开IntelliJ IDEA,并打开你的项目。在顶部菜单栏中,选择"View"(视图)选项。在下拉菜单中,选择"To…...
一文辨析Java基本数据类型与包装类
Java 基本数据类型与包装类深度解析 前言一、Java 基本数据类型详解1.1 数值型1.1.1 整型1.1.2 浮点型 1.2 字符型1.3 布尔型 二、Java 包装类详解2.1 包装类与基本数据类型的对应关系2.2 包装类的常用方法 三、基本数据类型与包装类的转换3.1 装箱(Boxingÿ…...