STM32F407-驱动SHT41采集温湿度

2024-05-13 00:36

本文主要是介绍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;}

这篇关于STM32F407-驱动SHT41采集温湿度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/984183

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,

windows10 卸载网络驱动以及重新安装

右键桌面此电脑的图标,点击管理,设备管理器—网络适配器,找到下图中的驱动(不同的系统或者显卡会导致网卡驱动名称与下图不一样,多为Realtek开头),右键选择卸载设备,然后重启电脑,系统会自动重新安装驱动 新电脑首次安装驱动: 根据主板厂家,比如华硕,进入华硕官网,点击服务支持,点击下载中心,选择型号,点击右侧驱动程序和工具软件,选择windows版本,下载相应的驱动,下载完之后在对应文件中找

Python 爬虫入门 - 基础数据采集

Python网络爬虫是一种强大且灵活的工具,用于从互联网上自动化地获取和处理数据。无论你是数据科学家、市场分析师,还是一个想要深入了解互联网数据的开发者,掌握网络爬虫技术都将为你打开一扇通向丰富数据资源的大门。 在本教程中,我们将从基本概念入手,逐步深入了解如何构建和优化网络爬虫,涵盖从发送请求、解析网页结构到保存数据的全过程,并讨论如何应对常见的反爬虫机制。通过本教程,你将能够构建有效的网络爬

笔记整理—内核!启动!—kernel部分(1)驱动与内核的关系

首先,恭喜完成了uboot部分的内容整理,其次补充一点,uboot第一部分和第二部分的工作不是一定的,在不同的版本中,可能这个初始化早一点,那个的又放在了第二部分,版本不同,造成的工作顺序不同,但终归是要完成基本内容初始化并传参给kernel的。         那么至于驱动与内核的关系,用一张图来说明最适合不过:         驱动位于OS层的中下层与硬件相接。驱动是内