STM32F407-驱动SHT41采集温湿度

STM32F407-驱动SHT41采集温湿度

SHT41

SHT41通过I2C方式进行驱动

从机地址: 0x44

获取数据方式
1)先发送I2C写,写入特定指令
2)延时一段时间,等待SHT41处理
3)再进行I2C读,读数据即可

一些指令如下:
在这里插入图片描述demo
在这里插入图片描述

STM32F407驱动

I2C初始化

void my_sht41_init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	I2C_InitTypeDef  I2C_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);  
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); 
	
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_I2C1);
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_I2C1); 
	
	  
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 ;  
  GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
	I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	I2C_InitStructure.I2C_ClockSpeed = 300000;
	I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
	I2C_InitStructure.I2C_OwnAddress1 = STM32_I2C_OWN_ADDR;	
	I2C_Init(I2C1, &I2C_InitStructure); 
	
	I2C_Cmd(I2C1, ENABLE);
	
}

读SHT41 芯片ID

void my_sht41_read_id(void)
{
	uint8_t data[6] = {0};
	uint8_t ret = 0;
	uint16_t time = 0xFFF;
	my_sht41_send_cmd(0x89);
	
	printf("开始延迟\n");
	while(time)
	{
		time--;
	}
	printf("延时结束\n");
	ret = my_SHT41_buffer_read(data,6);
	
	if(ret == 0)
	{
		printf("data[0] = 0x%x\n",data[0]);
		printf("data[1] = 0x%x\n",data[1]);
		printf("data[3] = 0x%x\n",data[3]);
		printf("data[4] = 0x%x\n",data[4]);
	}
	else
	{
		printf("读取ID错误!\n");
	}
	
}


读温度湿度数据

void my_sht41_read_data(void)
{
	uint8_t data[6] = {0};
	uint8_t ret = 0;
	uint32_t time = 0xFFFFFF;
	my_sht41_send_cmd(0xFD);
	
	uint16_t recovery_temper = 0u;
	uint16_t recovery_hum = 0u;
	float temp = 0.f;
	float hum = 0.f;
	
	
	printf("开始延迟\n");
	while(time)
	{
		time--;
	}
	printf("延时结束\n");
	ret = my_SHT41_buffer_read(data,6);
	
	if(ret == 0)
	{
		printf("data[0] = 0x%x\n",data[0]);
		printf("data[1] = 0x%x\n",data[1]);
		printf("data[3] = 0x%x\n",data[3]);
		printf("data[4] = 0x%x\n",data[4]);
	}
	else
	{
		printf("读取ID错误!\n");
	}
	
	recovery_temper = ((uint16_t)data[0]<<8)|data[1];
    temp = -45 + 175*((float)recovery_temper/65535);
 
    /* 转换湿度数据 */
    recovery_hum = ((uint16_t)data[3]<<8)|data[4];
    hum = -6 + 125 * ((float)recovery_hum / 65535);
		if(hum>=100)   //根据数据手册编写
				hum=100;
		else if(hum<=0)
				hum=0;
		
		printf("温度为:%.2f",temp);
		printf("湿度为:%.1f%%",hum);

	
}

I2C读写接口

static uint8_t my_sht41_send_cmd(uint8_t data)
{
	uint32_t count_wait;
	I2C_GenerateSTART(I2C1,ENABLE); 
	
	
	count_wait = TIME_OUT;
	while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS)
	{
		count_wait--;
		if(count_wait == 0) {
			return Error_CallBack(1);
		}
	}
	
	I2C_Send7bitAddress(I2C1, SHT41_I2C_ADDR, I2C_Direction_Transmitter); 
	

	
	count_wait = TIME_OUT;
	
	while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS)
	{
		count_wait--;
		if(count_wait == 0) {
			return Error_CallBack(2);
		}
	}
	
	

	//发送数据
	I2C_SendData(I2C1,data); 
	
	count_wait = TIME_OUT;
	while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED) != SUCCESS)
	{
		count_wait--;
		if(count_wait == 0) {
			return Error_CallBack(4);
		}
	}	
	
	
	I2C_GenerateSTOP(I2C1, ENABLE);
	
	
	return 0;
	
}


/*读六个字节数据 */
static uint8_t my_SHT41_buffer_read(uint8_t *data,uint16_t size)
{
	uint32_t count_wait;
	//开始进行I2C通讯
	I2C_GenerateSTART(I2C1, ENABLE);
	
	if(size > 6)
	{
		return 1;
	}
	
	count_wait = TIME_OUT;	//等待拉低
	while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS)
	{
		count_wait--;
		if(count_wait == 0 )
		{
			return Error_CallBack(16);
		}
	}	
	
	//读模式
	I2C_Send7bitAddress(I2C1, SHT41_I2C_ADDR, I2C_Direction_Receiver);
	
	
	count_wait = TIME_OUT;
	while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) != SUCCESS)
	{
		count_wait--;
		if(count_wait == 0 )
		{
			return Error_CallBack(20);
		}
	}
	
	while(size--)
	{
		if(size == 0)
		{
			I2C_AcknowledgeConfig(I2C1, DISABLE);
		}else {
			I2C_AcknowledgeConfig(I2C1,ENABLE);
		}

		count_wait = TIME_OUT;		
		while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS)
		{
			count_wait--;
			if(count_wait == 0 )
			{
				return Error_CallBack(21);
			}
		}
			
		
		*data = I2C_ReceiveData(I2C1);
		data++;
	}
	
		
	
	I2C_GenerateSTOP(I2C1, ENABLE);
	
	return 0;

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【谷粒商城】02安装和配置git

1.下载和安装git 地址&#xff1a;https://git-scm.com/download/win 傻瓜式安装 2.配置git DELLLJL MINGW64 ~/Desktop $ git config --global user.name "yufuabu"DELLLJL MINGW64 ~/Desktop $ git config --global user.email "463999534qq.com"DELL…

智慧管家物业管理系统(小组项目)

目录 前言 一、项目介绍 1、目的和背景 2、项目主要内容 3、技术介绍 二、功能模块 1、重要文件结构 2、功能实现&#xff08;部分个人负责模块功能&#xff09; 2.1 展示房源信息页面 2.2 房屋详情页面 2.3 房源信息管理 三、功能模块页面 1、前台模块 2、后台…

【Mac】Ghost Buster Pro(苹果电脑内存清理专家) v3.2.5安装教程

软件介绍 Ghost Buster pro是一款针对Mac系统的电脑清理和优化工具&#xff0c;可以帮助用户清理系统垃圾、修复注册表错误、卸载不需要的软件、管理启动项等&#xff0c;从而提高系统性能和稳定性。 安装教程 1.打开镜像包&#xff0c;拖动「Ghost Buster Pro」到应用程序中…

UnitTest / pytest 框架

文章目录 一、UnitTest框架1. TestCase使用2. TestSuite 和 TestRunner3. TestLoader4. Fixture装置5. UnitTest断言1. 登录案例 6. 参数化1. parameterized插件 7. unitTest 跳过 二、pytest 框架1. 运行方式3.读取配置文件(常用方式) 2. pytest执行用例的顺序1. 分组执行(冒烟…

华为数据之道第二部分导读

目录 导读 第二部分 第4章 面向“业务交易”的信息架构建设 信息架构的四个组件 数据资产目录 数据标准 数据模型 数据分布 信息架构原则&#xff1a;建立企业层面的共同行为准则 信息架构建设核心要素&#xff1a;基于业务对象进行设计和落地 按业务对象进行架构设…

vue3+ts--实际开发之--table表格打印或者保存

vue3实现指定区域打印&#xff08;导出&#xff09;功能-主要是解决分页内容分割问题 一、 问题页面效果二、 Print.js相关属性 和使用1. 介绍2. 安装引入3. PrintJS参数配置表 三 、解决关于分页文字或者表格被分割问题&#xff0c;解决后如下&#xff1a;1. 设置一个自定义ta…

20240512,函数对象,常用算法:遍历,查找

函数对象 函数对象基本使用 重载 函数调用操作符 的类&#xff0c;其对象被称为函数对象&#xff1b;函数对象使用重载的&#xff08;&#xff09;时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 函数对象&#xff08;仿函数&#xff09;本质是一个类&#xff0c;不是…

创新案例|为何农夫山泉创新战略升级为一家零售科技公司

农夫山泉上市的消息被公之于众后&#xff0c;几乎所有人都将目光投向了这家国内家喻户晓的饮料公司&#xff0c;谁都想第一时间内窥探它的庐山真面目。 当然&#xff0c;在此之前已经有多路消息通过旁敲侧击&#xff0c;从管窥中获取了一些农夫山泉的真实数据。 去年6月&…

OCR技术在历史文献数字化中的革命性作用

随着数字化技术的不断发展&#xff0c;历史文献的数字化已成为保存和传播文化遗产的重要途径。其中&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术在历史文献数字化中发挥了革命性的作用&#xff0c;为研究者提供了更广阔的研究空间&#xff0c;推动了历史学研究的发…

Golang | Leetcode Golang题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; func partition(head *ListNode, x int) *ListNode {small : &ListNode{}smallHead : smalllarge : &ListNode{}largeHead : largefor head ! nil {if head.Val < x {small.Next headsmall small.Next} else {large.Next hea…

Web安全:SQL注入之布尔盲注原理+步骤+实战操作

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

Pytorch基础:环境变量CUDA_VISIBLE_DEVICES

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 CUDA_VISIBLE_DEVICES这个环境变量可以影响CUDA能识别到的GPU&#xff0c;并影响它映射到的cuda设备编号。 首先我们知道使用nvidia-smi命令可以查询本机GPU的相关…

vue element checkbox的实现

实现多选非常简单: 手动添加一个el-table-column&#xff0c;设type属性为selection即可&#xff1b;默认情况下若内容过多会折行显示&#xff0c;若需要单行显示可以使用show-overflow-tooltip属性&#xff0c;它接受一个Boolean&#xff0c;为true时多余的内容会在 hover 时以…

实验过程演示【计算机网络实验】

前言 这是陈旧已久的草稿2023-05-20 11:23:54 这个是计算机网络的一个实验&#xff0c;现在也不知道这个是啥来着。 现在2024-5-12 22:33:17&#xff0c;发布到[计算机网络实验]专栏中。 实验过程演示 2023-5-18 20:17:45 1&#xff0e;搭建一个多跳网络拓扑&#xff0c;…

回炉重造java----多线程

概念 注&#xff1a; main方法其实也是一个线程。在java中所以的线程都是同时启动的&#xff0c;至于什么时候&#xff0c;哪个先执行&#xff0c;完全看谁先得到CPU的资源。在java中&#xff0c;每次程序运行至少启动2个线程。一个是main线程&#xff0c;一个是垃圾收集(gc )线…

Hikyuu高性能量化研究框架助力探索

Hikyuu Quant Framework 是一款基于C/Python的开源量化交易分析与研究工具&#xff0c;主要用于A股市场的交易策略分析与回测&#xff0c;目前不支持期货等&#xff0c;需要自行改造。 Hikyuu的目标 Hikyuu的最初目的是为了快速对A股全市场股票进行策略回测和验证&#xff0c…

[数据集][目标检测]电力场景安全帽检测数据集VOC+YOLO格式295张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;295 标注数量(xml文件个数)&#xff1a;295 标注数量(txt文件个数)&#xff1a;295 标注类别…

Git之revert的使用

问题场景&#xff1a; 提交代码都是以merge request的形式合并到主分支master的。 由于有一个merge request被误merge了&#xff0c;这期间又有同时merge了其它内容。 如何快速将这个被误merge的request从master上revert呢&#xff1f; 实例演示&#xff1a; 下面是最近的5…

消息中间件Kafka(PHP版本)

小编最近需要用到消息中间件&#xff0c;有需要要复习一下以前的东西&#xff0c;有需要的自取&#xff0c;强调一点&#xff0c;如果真的想了解透彻&#xff0c;一定要动手&#xff0c;脑袋会了不代表就会写了 Kafka是由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅…

Debian Linux 下给Nginx 1.26.0 编译增加Brotli算法支持

明月发现参考【给Nginx添加谷歌Brotli压缩算法支持】一文给出的方法&#xff0c;在Debian Linux 12.5下就一直编译失败&#xff0c;主要的错误是因为文件缺失&#xff0c;在专门又安装了apt-get install libbrotli-dev的依赖库后依然会因为文件缺失无法编译完成&#xff0c;就这…