STM32F407-驱动SHT41采集温湿度

news2024/11/27 14:46:25

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.coloradmin.cn/o/1668813.html

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

相关文章

打开远程连接的命令是什么?

远程连接是一种能够在不同设备之间建立连接并共享信息的技术。在许多情况下&#xff0c;我们需要通过远程连接来访问其他设备或处理一些远程任务。本文将介绍一些常用的打开远程连接的命令。 使用SSH连接远程设备 SSH&#xff08;Secure Shell&#xff09;是一种安全的网络协议…

1-02-02:虚拟化与容器化Docker环境搭建

1.02.02 虚拟化与容器化Docker环境搭建 一. 虚拟化与容器化技术简介1. 虚拟机环境2. docker环境 二. Docker 架构与隔离机制2.1 Docker 架构2.2 Docker 隔离机制2.3 资源限制2.4 Docker应用场景 三. 实战:Docker在Centos7安装与镜像加速 ❤❤❤3.1 docker安装3.2 设置镜像加速 …

NIOS II实现LED流水灯以及串口输出(DE2-115开发板)

NIOS II实现LED流水灯以及串口输出&#xff08;DE2-115开发板&#xff09; 前言什么是Qsys?什么是NIOSII?注意事项1、管脚配置2、配置NIOSII时的连接3、注意中断配置好后是这样的4、注意名称的配置5、设置双功能引脚 NIOS II的报错代码以及效果演示流水灯输出到电脑串口助手 …

人工智能轨道交通行业周刊-第79期(2024.4.22-5.12)

本期关键词&#xff1a;无人机巡检、车机联控、减速顶、Agent、GraphRAG、RAGFlow 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…

【智能算法应用】遗传粒子群算法(GA-PSO)求解选址问题

目录 1.算法原理2.数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】粒子群算法&#xff08;PSO&#xff09;原理及实现 经典PSO算法用于连续空间优化问题&#xff0c;选址问题作为组合优化问题&#xff0c;需要在离散空间中求解。因此&#xff0c;考虑遗传算…

阮怀俊谈如何盘活和挖掘乡村文旅资源

近年来&#xff0c;浙江凭借高水平建设新时代美丽乡村&#xff0c;各项工作持续走在全国前列&#xff0c;最近&#xff0c;在国家发展改革委关于恢复和扩大消费措施的通知中也提到&#xff1a; “推广浙江‘千万工程’经验&#xff0c;建设宜居宜业和美乡村。实施文化产业赋能乡…

Libcity 笔记:自定义模型

在/libcity/model/trajectory_loc_prediction/&#xff0c;我们复制一份Deepmove.py&#xff0c;得到DM_tst.py&#xff0c;我们不改变其中的机制&#xff0c;只动class name 然后修改相同目录下的__init__.py&#xff1a; 修改task_config文件&#xff1a; 在config/model/tra…

带头单链表 C++实现

节点定义 带头单链表&#xff1a;我们只需要一个结点指针指向整个链表的第一个节点&#xff0c;这样我们就可以通过next指针访问整个链表内的所有节点 template<class T> struct ListNode {T _val;ListNode* _next;ListNode(const T &val):_val(val),_next(nullptr){…

Unity图形图表XChart插件使用

最近做了一款数字孪生项目,其中涉及到了图形图表的应用,网上找了一下,找到了XChart插件,使用起来蛮方便的,不过还有待继续研究,很多细节性的知识点需要进行学习探索。以下是项目中的应用。 官方应用: ![](https://img-blog.csdnimg.cn/direct/ab9de8e84e7b4be4a50ea…

抽丝剥茧:详述一次DevServer Proxy配置无效问题的细致排查过程

事情的起因是这样的&#xff0c;在一个已上线的项目中&#xff0c;其中一个包含登录和获取菜单的接口因响应时间较长&#xff0c;后端让我尝试未经服务转发的另一域名下的新接口&#xff0c;旧接口允许跨域请求&#xff0c;但新接口不允许本地访问&#xff08;只允许发布测试/生…

【058】基于SpringBoot+Vue校园失物招领系统的设计与实现

系统介绍 基于SpringBootVue校园失物招领系统主要通过使用Java语言编码设计系统功能&#xff0c;MySQL数据库管理数据&#xff0c;AJAX技术设计简洁的、友好的网址页面&#xff0c;然后在IDEA开发平台中&#xff0c;编写相关的Java代码文件&#xff0c;接着通过连接语言完成与…

C#实现简单音乐文件解析播放——Windows程序设计作业2

1. 作业内容 编写一个C#程序&#xff0c;要求实现常见音乐文件的播放功能&#xff0c;具体要求如下&#xff1a;     1). 播放MP3文件&#xff1a; 程序应能够读取MP3文件&#xff0c;并播放其中的音频。     2). 播放OGG文件&#xff1a; 应能够播放ogg文件。     …

软考高项总结:第20章高级项目管理

一、高级项目管理基础 1、项目组合主要是为实现战略目标而进行的多个项目。比如村里要发展经济。制定了一个发展战略。要修路,要建厂,要种树,要整田。这些方面都有很多项目,在一起形成了项目组合。 2、项目集中的项目之间存在着关联关系,要统一考虑以实现更大利益。比如…

MFC的CPen与CBush画图对象使用步骤

在MFC中&#xff0c;CPen和CBrush是两个常用的绘图对象&#xff0c;分别用于定义画笔和画刷&#xff0c;可以用于绘制图形、填充区域等。下面我会详细介绍如何在MFC中使用CPen和CBrush来绘制和填充图形。 使用 CPen 绘制图形&#xff1a; 创建 CPen 对象&#xff1a; 首先&am…

推荐我常用的爬虫工具,三种爬虫方式,搞定反爬和动态页面

我和很多学python的同学聊过&#xff0c;至少有30%以上的人学Python是为了网络爬虫&#xff0c;也就是采集网站的数据&#xff0c;不得不说这确实是一个刚性需求。 但一个残酷的事实是&#xff0c;即使一部分人学了Python&#xff0c;掌握了requests、urllib、bs4等爬虫技术&a…

Git系列:git diff使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

通过acl设置阻止数据包通过

实验拓扑和信息如图&#xff08;配置信息参考上一章内容&#xff09; acl设置代码 AR4 系统是视图下 acl 2000 rule 5 deny source 10.10.10.1 0 接口0视图下 数据接收时 traffic-filter inbound acl 2000 测试结果

再有人说数字孪生大屏没有用,用这8条怼回去。

数字孪生大屏之所以受到欢迎&#xff0c;主要有以下几个原因&#xff1a; 实时数据可视化 数字孪生大屏可以将实时数据以直观的可视化形式展示出来&#xff0c;让用户能够一目了然地了解数据的状态和趋势。这样可以帮助用户更好地理解和分析数据&#xff0c;及时做出决策和调…

信息系统安全与对抗-网络侦查技术与网络扫描技术(期末复习简答题)

1、网络拓扑结构在网络攻击中的作用 查明目标网络的拓扑结构&#xff0c;有利于找到目标网络的关键节点&#xff0c;从而提高攻击效率&#xff0c;达到最大攻击效果。 2、网络侦查在网络攻击中的作用 识别潜在目标系统&#xff0c;确认目标系统适合哪种类型的攻击。 3、百度…

类和对象-Python-第二部分

师从黑马程序员 多态 抽象类&#xff08;接口&#xff09; #演示抽象类 class AC:def cool_wind(self):"""制冷"""passdef hot_wind(self):"""制热"""def swing_l_r(self):"""左右摆风""…