【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块

目录

一、温度传感器模块

(1)资源介绍

        🔅原理图

        🔅STS30-DIS-B

        🌙引脚分配

        🌙通信

        🌙时钟拉伸(Clock Stretching)

        🌙单次触发模式

        🌙温度数据转换

(2)STM32CubeMX 软件配置

(3)代码编写

(4)实验现象

二、温度采集接口函数封装

三、踩坑日记

(1)引脚配置问题

(2)底层驱动延时问题

(3)ALERT引脚


一、温度传感器模块

(1)资源介绍

        🔅原理图

        蓝桥杯物联网竞赛实训平台提供了一个拓展接口 CN2,所有拓展模块均可直接安装在 Lora 终端上使用;

图1        拓展接口

        温度传感器模块电路原理图如下所示:

图2        温度传感器模块电路原理图

        通过两张电路图连接可知,引脚资源配置情况为:

表1 引脚资源配置情况
TemperatureMCU
SCLPB6
SDAPB7
ALEPB0

        🔅STS30-DIS-B

        (以下资料来源于STS30-DIS-B数据手册)

        STS3x-DIS是盛思锐最新的高精度数字温度传感器。它依赖于业界成熟的CMOSens®技术,与其前身相比,提供更高的智能,可靠性和更高的精度规格。其功能包括增强的信号处理,两个独特的用户可选择的I2C地址和高达1 MHz的通信速度。DFN封装的占地面积为2.5 x 2.5 mm2,同时保持0.9 mm的高度。这允许将STS3x-DIS集成到各种各样的应用中。此外,2.15 V至5.5 V的宽电源电压范围保证了广泛应用的兼容性。总而言之,STS3x-DIS融合了盛思锐超过15年的数字传感器专业知识。

图3        STS30-DIS 功能框图
        🌙引脚分配
表2 STS30-DIS-B引脚分配
PinNameComments
1SDA串行数据;输入/输出
2ADDR

地址引脚;输入;连接到逻辑高或低,不要浮空

3ALERT指示警告状态;输出;如果不使用,必须保持浮空
4SCL串行时钟;输入/输出
5VDD电源电压;输入
6nRESET复位引脚,低电平有效;输入;如果不使用,建议保持浮空状态;可通过串联电阻R≥2kΩ与VDD连接
7R无电气功能;连接到VSS
8VSS接地
        🌙通信

        向传感器发送命令后,在传感器接收另一条命令之前,需要最小的等待时间为1ms

        所有STS30-DIS-B命令和数据都映射到16位地址空间。此外,数据和命令受到CRC校验和的保护。这提高了通信的可靠性。对传感器的16位命令已经包括3位CRC校验和。传感器发送和接收的数据总是经过一个8位的CRC校验。

  • 在写方向上,必须传输校验和因为STS30-DIS-B只接受后面跟着正确校验和的数据
  • 在读方向上,它留给主机来读取和处理校验和;
        🌙时钟拉伸Clock Stretching
  • 当没有时钟拉伸的命令发出时,如果没有数据存在,传感器响应一个带有不确认(NACK)的读报头;
  • 当发出带有时钟拉伸的命令时,传感器响应一个带有ACK的读报头,然后拉下SCL线。将SCL线拉下,直到测量完成。一旦测量完成,传感器释放SCL线并发送测量结果;
        🌙单次触发模式
图4        单次触发模式下的命令

由图4的流程图可知,单次触发模式的数据获取流程如下:

        1. 第一部分

图5        发送流程第一部分

🟠️伪代码如下:

I2C开始;
发送7位I2C地址+写命令位;
等待传感器发送ACK;
发送高8位命令;
等待传感器发送ACK;
发送低8位命令;
等待传感器发送ACK;
I2C结束;

        2. 第二部分

图6        发送流程第二部分

🟠️伪代码如下:

/* 时钟拉伸不使能 */
释放时钟线;(传感器测量中)
I2C开始;
发送7位I2C地址+读命令位;
等待传感器发送NACK;
I2C结束;
释放时钟线;(传感器测量中->传感器测量完成)
I2C开始;
发送7位I2C地址+读命令位;
等待传感器发送ACK;/* 时钟拉伸使能 */
释放时钟线;(传感器测量中)
I2C开始;
发送7位I2C地址+读命令位;
等待传感器发送ACK;
(传感器将时钟线拉低)

        3. 第三部分

图7        发送流程第三部分

🟠️伪代码如下:

接收高8位温度数据;
发送ACK;
接收低8位温度数据;
发送ACK;
接收CRC校验和;
发送NACK;
I2C结束;
        🌙温度数据转换

T\left [ ^{\circ}C \right ]=-45+175\cdot \frac{S_{T}}{2^{16}-1}

T\left [ ^{\circ}F \right ]=-49+315\cdot \frac{S_{T}}{2^{16}-1}

(2)STM32CubeMX 软件配置


🔅“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️

【蓝桥杯——物联网设计与开发】基础模块1- GPIO输出icon-default.png?t=O83Ahttps://blog.csdn.net/m0_63116406/article/details/135604705?spm=1001.2014.3001.5502

1️⃣点击引脚 PB6 → 选择 GPIO_Output 模式(此处默认为推挽输出);

     点击引脚 PB7 → 选择 GPIO_Output 模式(此处配置为开漏输出);

图8        引脚配置



2️⃣初始化 OLED;(配置步骤在下文中有讲解,这里不再赘述);

【蓝桥杯——物联网设计与开发】基础模块6 - OLED_蓝桥杯物联网oled-CSDN博客


3️⃣生成代码即可;

(3)代码编写

🟢️main 函数

/* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV */
uint8_t H_VALUE, L_VALUE, CRC_VALUE;    // 高8位数据、低8位数据、CRC校验数据
float temp;                            // 温度数据
uint16_t ui_dat_temp;                    // 显示数据
uint8_t puc_oled[17];                    // OLED显示存储区
/* USER CODE END PV */
/*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C3_Init();/* USER CODE BEGIN 2 */OLED_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* 第一部分 */I2CStart2();I2CSendByte2(0x94);I2CWaitAck2();I2CSendByte2(0x24);I2CWaitAck2();I2CSendByte2(0x0B);I2CWaitAck2();I2CStop2();/* 第二部分 */HAL_Delay(2);I2CStart2();I2CSendByte2(0x95);I2CWaitAck2();I2CStop2();HAL_Delay(2);I2CStart2();I2CSendByte2(0x95);I2CWaitAck2();/* 第三部分 */H_VALUE = I2CReceiveByte2();I2CSendAck2();L_VALUE = I2CReceiveByte2();I2CSendAck2();CRC_VALUE = I2CReceiveByte2();I2CSendNotAck2();I2CStop2();if(CRC_VALUE){;}temp = ((H_VALUE << 8) | L_VALUE) * 175.0 / 65535 - 45;ui_dat_temp = (uint16_t)(Temp_Read() * 10);sprintf((char*)puc_oled, "   Temperature  ");OLED_ShowString(0, puc_oled);sprintf((char*)puc_oled, "      %.1f  ", ui_dat_temp / 10.0);OLED_ShowString(2, puc_oled);HAL_Delay(500);    //延时一会儿/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

(4)实验现象

        能够实时测量环境温度。


二、温度采集接口函数封装

🟡️软件i2c.c

#include "i2c_2.h"#define DELAY_TIME 20//I2C总线内部延时函数
static void delay1(unsigned int n)
{uint32_t i;for ( i = 0; i < n; ++i);
}//配置SDA引脚为输入模式
void SDA_Input_Mode2(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = SDA2;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
//配置SDA引脚为输出模式
void SDA_Output_Mode2(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = SDA2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
//SDA引脚输出
void SDA_Output2(uint16_t val )
{if(val)GPIOB->BSRR |= SDA2;elseGPIOB->BRR |= SDA2;
}
//SCL引脚输出
void SCL_Output2( uint16_t val )
{if(val)GPIOB->BSRR |= SCL2;elseGPIOB->BRR |= SCL2;
}
//读取SDA引脚状态
uint8_t SDA_Input2(void)
{return HAL_GPIO_ReadPin(GPIOB, SDA2);
}//I2C总线启动信号
void I2CStart2(void)
{SDA_Output2(1);delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);SDA_Output2(0);delay1(DELAY_TIME);SCL_Output2(0);delay1(DELAY_TIME);
}//I2C总线停止信号
void I2CStop2(void)
{SCL_Output2(0);delay1(DELAY_TIME);SDA_Output2(0);delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);SDA_Output2(1);delay1(DELAY_TIME);}//等待应答
unsigned char I2CWaitAck2(void)
{unsigned short cErrTime = 5;SDA_Input_Mode2();delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);while(SDA_Input2()){cErrTime--;delay1(DELAY_TIME);if (0 == cErrTime){SDA_Output_Mode2();I2CStop2();return ERROR;}}SCL_Output2(0);SDA_Output_Mode2();delay1(DELAY_TIME);return SUCCESS;
}//发送应答
void I2CSendAck2(void)
{SDA_Output2(0);delay1(DELAY_TIME);delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);SCL_Output2(0);delay1(DELAY_TIME);}//发送非应答
void I2CSendNotAck2(void)
{SDA_Output2(1);delay1(DELAY_TIME);delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);SCL_Output2(0);delay1(DELAY_TIME);}//发送一个字节数据
void I2CSendByte2(unsigned char cSendByte)
{unsigned char  i = 8;while (i--){SCL_Output2(0);delay1(DELAY_TIME);SDA_Output2(cSendByte & 0x80);delay1(DELAY_TIME);cSendByte += cSendByte;delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);}SCL_Output2(0);delay1(DELAY_TIME);
}//接收一个字节数据
unsigned char I2CReceiveByte2(void)
{unsigned char i = 8;unsigned char cR_Byte = 0;SDA_Input_Mode2();while (i--){cR_Byte += cR_Byte;SCL_Output2(0);delay1(DELAY_TIME);delay1(DELAY_TIME);SCL_Output2(1);delay1(DELAY_TIME);cR_Byte |=  SDA_Input2();}SCL_Output2(0);delay1(DELAY_TIME);SDA_Output_Mode2();return cR_Byte;
}

🟡️软件i2c.h

#ifndef __I2C_2_H
#define __I2C_2_H#include "main.h"
//I2C总线引脚定义
#define SCL2	GPIO_PIN_6
#define SDA2	GPIO_PIN_7//接口函数
void I2CStart2(void);
void I2CStop2(void);
unsigned char I2CWaitAck2(void);
void I2CSendAck2(void);
void I2CSendNotAck2(void);
void I2CSendByte2(unsigned char cSendByte);
unsigned char I2CReceiveByte2(void);#endif

🟡️温度采集函数

/* 温度采集函数,中等可重复性+不使能时钟拉伸 */
float Temp_Read(void)
{uint8_t H_VALUE, L_VALUE, CRC_VALUE;float temp;I2CStart2();I2CSendByte2(0x94);I2CWaitAck2();I2CSendByte2(0x24);I2CWaitAck2();I2CSendByte2(0x0B);I2CWaitAck2();I2CStop2();HAL_Delay(2);I2CStart2();I2CSendByte2(0x95);I2CWaitAck2();I2CStop2();HAL_Delay(2);I2CStart2();I2CSendByte2(0x95);I2CWaitAck2();H_VALUE = I2CReceiveByte2();I2CSendAck2();L_VALUE = I2CReceiveByte2();I2CSendAck2();CRC_VALUE = I2CReceiveByte2();I2CSendNotAck2();I2CStop2();if(CRC_VALUE){;}temp = ((H_VALUE << 8) | L_VALUE) * 175.0 / 65535 - 45;return temp;
}

🔴温度采集接口函数调用实例

/* 采集任务函数 */
void Task_Colt(void)
{/* 200ms进入一次 */if(cnt_colt < 200)	return;cnt_colt = 0;/* 温度采集与转换 */ui_dat_temp = (uint16_t)(Temp_Read() * 10);
}

三、踩坑日记

(1)引脚配置问题

  1. 推荐使用软件模拟I2C(硬件I2C,在4ti测试出来有问题);
  2. PB7(SDA)配置为开漏输出、速度快;PB6(SCL)配置为推挽输出,速度快;

(2)底层驱动延时问题

        🔅注意编写底层驱动时存在两次HAL_Delay(2),释放时钟线作用,根据芯片手册说明,此处需要≥1ms;

(3)ALERT引脚

        🔅报警引脚Alert一般用于连接MCU的中断引脚。引脚的输出取决于可编程限制的温度读数值。当满足报警条件时,引脚拉高;

        🔅根据手册说明,不使用时必须保持浮空。

       

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/495671.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Edge浏览器的设置

这里记录几条个人比较习惯的使用浏览器方式的设置&#xff0c;主要是edge浏览器 1. 黑背景色 修改整个浏览器的背景色为黑色&#xff0c;而不是主题&#xff0c;只有边框颜色改变地址栏输入edge://flags/#enable-force-dark&#xff0c;将Default 改为 Enabled&#xff1b;如…

给bmp和png,设置BLENDFUNCTION的AlphaFormat不同参数的效果

BLENDFUNCTION是AlphaBlend用控制透明效果的重要参数。 选择一个32位的png图片&#xff0c;设置AlphaFormat 为 AC_SRC_ALPHA&#xff0c;效果如上图。 选择一个32位的png图片&#xff0c;设置AlphaFormat 为 0&#xff0c;效果如上图。 选择一个24位的bmp图片&#xff0c;设置…

Nginx界的天花板-Oracle 中间件OHS 11g服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用2台服务器&#xff0c;具体信息如下&#xff1a; 服务器IP DNS F5配置 OHS1 172.xx.xx.xx ohs01.xxxxxx.com ohs.xxxxxx.com OHS2 172.xx.xx.xx ohs02.xxxxxx.com 服务器用户角色信息均为&#xff1a;…

智驾感知「大破局」!新一轮混战开启

随着智能驾驶搭载率的攀升&#xff0c;舱外传感器赛道迎来新变局。 一方面&#xff0c;从近几年智驾传感器的配置变化来看&#xff0c;摄像头的主导地位显而易见。 12月10-12日&#xff0c;由德赛西威总冠名的2024&#xff08;第八届&#xff09;高工智能汽车年会暨年度金球奖…

Hive其四,Hive的数据导出,案例展示,表类型介绍

目录 一、Hive的数据导出 1&#xff09;导出数据到本地目录 2&#xff09;导出到hdfs的目录下 3&#xff09;直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…

基于WEB的房屋出租管理系统设计

摘 要 随着城市化程度的推进&#xff0c;越来越多的人涌入城市&#xff0c;同时也带来的旺盛的租房需求&#xff0c;传统的房屋出租管理依赖人 工记录的方式难以满足人们对房屋出租管理的需求。因此&#xff0c;本文根据房屋出租信息化的需求设计一款基于房屋出租 的管理系统。…

操作系统(26)数据一致性控制

前言 操作系统数据一致性控制是确保在计算机系统中&#xff0c;数据在不同的操作和处理过程中始终保持正确和完整的一种机制。 一、数据一致性的重要性 在当今数字化的时代&#xff0c;操作系统作为计算机系统的核心&#xff0c;负责管理和协调各种资源&#xff0c;以确保计算机…

C语言项目 天天酷跑(上篇)

前言 这里讲述这个天天酷跑是怎么实现的&#xff0c;我会在天天酷跑的下篇添加源代码&#xff0c;这里会讲述天天酷跑这个项目是如何实现的每一个思路&#xff0c;都是作者自己学习于别人的代码而创作的项目和思路&#xff0c;这个代码和网上有些许不一样&#xff0c;因为掺杂了…

Docker数据库的主从复制

有很多种方式,我这里使用的是docker镜像配置两个mysql容器做主从复制,一个做主服务器&#xff0c;另一个做从服务器&#xff0c;前提是有docker。 创建容器: 第一个容器: mkdir mysql cd mysql docker run -id \ -p 3307:3306 \ --namels \ -v /root/mysql/conf:/etc/mysql/co…

CH32V307VCT6---工程template创建

一、硬件&#xff1a;沁恒官网申请的CH32V307VCT6开发板 二、开发环境&#xff1a;Mounriver 三、最终效果 1.PB9连接LED1&#xff0c;使其闪烁 2.OLED屏幕显示&#xff1a;软件IIC&#xff0c;PB10----SDA&#xff0c;PB11---SCL 3.工程链接&#xff1a;CH32V307VCT6 lo…

mac中idea菜单工具栏没有git图标了

1.右击菜单工具栏 2.选中VCS&#xff0c;点击添加 3.搜索你要的工具&#xff0c;选中点击确定就添加了 4.回到上面一个界面&#xff0c;选中你要放到工具栏的工具&#xff0c;点击应用就好了 5.修改图标&#xff0c;快捷键或者右击选中编辑图标 6.选择你要的图标就好了

使用 Python 创建多栏 Word 文档 – 详解

目录 引言 一、工具与安装 二、Python 在 Word 中创建简单的多栏布局 三、Python 在 Word 文档的栏间添加分隔线 四、Python 从Word文档的指定位置开启多栏设置 五、Python 为多栏 Word 文档的各栏添加页码 引言 在文档设计中&#xff0c;排版不仅决定了内容的呈现方式&…

JZ31 栈的压入、弹出序列

题目来源&#xff1a;栈的压入、弹出序列_牛客题霸_牛客网 题目&#xff1a;如下 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序&#xf…

Spring源码_05_IOC容器启动细节

前面几章&#xff0c;大致讲了Spring的IOC容器的大致过程和原理&#xff0c;以及重要的容器和beanFactory的继承关系&#xff0c;为后续这些细节挖掘提供一点理解基础。掌握总体脉络是必要的&#xff0c;接下来的每一章都是从总体脉络中&#xff0c; 去研究之前没看的一些重要…

【Linux】进程间通信 -> 匿名管道命名管道

进程间通信的目的 数据传输&#xff1a;一个进程许需要将它的数据发送给另外一个进程。资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它们发生了某种事件&#xff08;如进程终止时要通知父进程…

大模型-使用Ollama+Dify在本地搭建一个专属于自己的聊天助手与知识库

大模型-使用OllamaDify在本地搭建一个专属于自己的知识库 1、本地安装Dify2、本地安装Ollama并解决跨越问题3、使用Dify搭建聊天助手4、使用Dify搭建本地知识库 1、本地安装Dify 参考往期博客&#xff1a;https://guoqingru.blog.csdn.net/article/details/144683767 2、本地…

黑盒测试/白盒测试知识总结

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 对于很多刚开始学习软件测试的小伙伴来说&#xff0c;如果能尽早将黑盒、白盒测试弄明白&#xff0c;掌握两种测试的结论和基本原理&#xff0c;将对自己后期的学习…

数据结构之线性表之顺序表

定义&#xff1a; 由n&#xff08;n>0&#xff09;个数据特性相同的元素构成的有限序列称为线性表 简单来说n个相同数据类型的数据组wsw合在一起的这么一个集合就是一个线性表 线性表包括顺序表和链表 1. 顺序表&#xff08;我们所有的代码实现都用函数来封装&#xff09…

ReactPress 1.6.0:重塑博客体验,引领内容创新

ReactPress 是一个基于Next.js的博客&CMS系统&#xff0c; Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 体验地址&#xff1a;http://blog.gaoredu.com/ 今天&#xff0c;我们自豪地宣布ReactPress 1.6.0版本的正式发布&#xff0c;…

(echarts)数据地图散点类型根据条件设置不同的标记图片

(echarts)数据地图散点类型根据条件设置不同的标记图片 1.用在线工具将本地图片转化base64格式 data(){return { base64Img:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQ...",} }在线转换地址&#xff1a;https://www.jyshare.com/front-end/59/ 2.symbol属…