STM32、GD32驱动SHT30温湿度传感器源码分享

一、SHT30介绍

1、简介

SHT30是一种数字湿度和温度传感器,由Sensirion公司生产。它是基于物理蒸发原理的湿度传感器,具有高精度和长期稳定性。SHT30采用I2C数字接口,可以直接与微控制器或其他设备连接。该传感器具有低功耗和快速响应的特点,能够在广泛的温度和湿度范围内准确测量。SHT30还具有内置的温度补偿功能,可以提供精确的湿度和温度测量结果。它广泛用于气象观测、室内环境监测、农业、工业自动化等领域。

2、引脚图

在这里插入图片描述

二、原理图

在这里插入图片描述
iic记得接上拉电阻哦

三、源码分享

1、iic.h

#ifndef _MYIIC_H
#define _MYIIC_H
#include "sys.h"//IO方向设置
#define SDA_IN()  {GPIOG->MODER&=~(3<<(12*2));GPIOG->MODER|=0<<12*2;}	//PH5输入模式
#define SDA_OUT() {GPIOG->MODER&=~(3<<(12*2));GPIOG->MODER|=1<<12*2;}  //PH5输出模式
//IO操作
#define IIC_SCL(n)  (n?HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET)) //SCL
#define IIC_SDA(n)  (n?HAL_GPIO_WritePin(GPIOG,GPIO_PIN_12,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOG,GPIO_PIN_12,GPIO_PIN_RESET)) //SDA
#define READ_SDA    HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_12)  //输入SDA//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(u8 txd);			//IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);					//IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);	 
#endif

2、iic.c

#include "myiic.h"
#include "delay.h"//IIC初始化
void IIC_Init(void)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOG_CLK_ENABLE();   //使能GPIOH时钟//PH4,5初始化设置GPIO_Initure.Pin=GPIO_PIN_11|GPIO_PIN_12;GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;    //快速HAL_GPIO_Init(GPIOG,&GPIO_Initure);IIC_SDA(1);IIC_SCL(1);  
}//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA(1);	  	  IIC_SCL(1);delay_us(4);IIC_SDA(0);//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL(0);//钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL(0);IIC_SDA(0);//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL(1); IIC_SDA(1);//发送I2C总线结束信号delay_us(4);							   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN();      //SDA设置为输入  IIC_SDA(1);delay_us(1);	   IIC_SCL(1);delay_us(1);	 while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL(0);//时钟输出0 	   return 0;  
} 
//产生ACK应答
void IIC_Ack(void)
{IIC_SCL(0);SDA_OUT();IIC_SDA(0);delay_us(2);IIC_SCL(1);delay_us(2);IIC_SCL(0);
}
//不产生ACK应答		    
void IIC_NAck(void)
{IIC_SCL(0);SDA_OUT();IIC_SDA(1);delay_us(2);IIC_SCL(1);delay_us(2);IIC_SCL(0);
}					 				     
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT(); 	    IIC_SCL(0);//拉低时钟开始数据传输for(t=0;t<8;t++){              IIC_SDA((txd&0x80)>>7);txd<<=1; 	  delay_us(2);   //对TEA5767这三个延时都是必须的IIC_SCL(1);delay_us(2); IIC_SCL(0);	delay_us(2);}	 
} 	    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL(0); delay_us(2);IIC_SCL(1);receive<<=1;if(READ_SDA)receive++;   delay_us(1); }					 if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

3、sht30.h

#ifndef __SHT30_H
#define __SHT30_H
#include "sys.h"
#include "myiic.h"#define SHT30_State 0xF32D#define CMD_CLEAR_STATUS  0x3041 // clear status register
#define CMD_HEATER_ENABLE  0x306D // enabled heater
#define CMD_HEATER_DISABLE  0x3066 // disable heater
#define CMD_MEAS_CLOCKSTR_H  0x2C06
#define CMD_MEAS_POLLING_H  0x2400
#define POLYNOMIAL 0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001// Generator polynomial for CRCvoid sht30_init(uint8_t slaveAddr);
uint8_t sht30_read_data(uint8_t slaveAddr,uint16_t mode,uint16_t *temp,uint16_t *humid);#endif

4、sht30.c

#include "sht30.h"
#include "delay.h"//SHT30写命令
void sht30_write_cmd(uint8_t slaveAddr,uint16_t cmd)
{IIC_Start();IIC_Send_Byte(slaveAddr << 1);IIC_Wait_Ack();IIC_Send_Byte(cmd >> 8);IIC_Wait_Ack();IIC_Send_Byte(cmd);IIC_Wait_Ack();IIC_Stop();
}uint8_t sht30_calc_crc(uint8_t data[], uint8_t Bytes)
{uint8_t bit; // bit maskuint8_t crc = 0xFF; // calculated checksumuint8_t byteCtr; // byte counter// calculates 8-Bit checksum with given polynomialfor(byteCtr = 0; byteCtr < Bytes; byteCtr++){crc^= (data[byteCtr]);for(bit = 8; bit > 0; --bit){if(crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;else crc = (crc << 1);}}return crc;
}uint8_t sht30_check_crc(uint8_t data[], uint8_t Bytes, uint8_t checksum)
{uint8_t crc; // calculated checksum// calculates 8-Bit checksumcrc = sht30_calc_crc(data, Bytes);// verify checksumif(crc != checksum) return 0;else return 1;
}//读SHT30状态uint16_t sht30_read_state(uint8_t slaveAddr)
{uint8_t temp[2],crc;uint16_t sta;IIC_Start();IIC_Send_Byte(slaveAddr << 1);IIC_Wait_Ack();IIC_Send_Byte(SHT30_State >> 8);IIC_Wait_Ack();IIC_Send_Byte((u8)SHT30_State);IIC_Wait_Ack();IIC_Start();IIC_Send_Byte(slaveAddr << 1 | 0x01);IIC_Wait_Ack();temp[0] = IIC_Read_Byte(1);//高位temp[1] = IIC_Read_Byte(1);//低位crc = IIC_Read_Byte(0);//校验IIC_Stop();if(sht30_check_crc(temp,2,crc)){sta = temp[0] << 8 | temp[1];return sta;}elsereturn 0;
}
float sht30_calc_temperature(uint16_t rawValue)
{
// calculate temperature [°C]
// T = -45 + 175 * rawValue / (2^16-1)return 175.0f * (float)rawValue / 65535.0f - 45.0f;
}
float sht30_calc_humidity(u16 rawValue)
{
// calculate relative humidity [%RH]
// RH = rawValue / (2^16-1) * 100return 100.0f * (float)rawValue / 65535.0f;
}//读取SHT30数据uint8_t sht30_read_data(uint8_t slaveAddr,uint16_t mode,uint16_t *temp,uint16_t *humid)
{uint8_t temp1[2],crc1,temp2[2],crc2;uint16_t tempValue;sht30_write_cmd(slaveAddr,mode);					//发送测量模式命令,并开始测量//delay_ms(5);//No Clock Stretching 模式下传感器对第一次微控制器发送的I2CStart() 是没有	ACK的 IIC_Start();               IIC_Send_Byte(slaveAddr << 1 | 0x01);IIC_Stop();delay_ms(50);//第二次微控制器发送的I2CStart()数据采集转换完成 有ACKIIC_Start();IIC_Send_Byte(slaveAddr << 1 | 0x01);IIC_Wait_Ack();temp1[0] = IIC_Read_Byte(1);//温度高位temp1[1] = IIC_Read_Byte(1);//温度低位crc1 = IIC_Read_Byte(1);//温度CRC校验值temp2[0] = IIC_Read_Byte(1);//湿度高位temp2[1] = IIC_Read_Byte(1);//湿度低位crc2 = IIC_Read_Byte(0);//湿度CRC校验值IIC_Stop();//CRC 校验uint8_t tempCheck = sht30_check_crc(temp1,2,crc1);uint8_t humCheck = sht30_check_crc(temp2,2,crc2);if(tempCheck){tempValue = temp1[0];tempValue <<= 8;tempValue |= temp1[1];*temp = sht30_calc_temperature(tempValue) * 10; //精度0.3°tempValue = temp2[0];tempValue <<= 8;tempValue |= temp2[1];*humid = sht30_calc_humidity(tempValue);//精度 %2return 1;}elsereturn 0;
}void sht30_init(uint8_t slaveAddr)
{}

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

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

相关文章

树莓派4-通过IIC实现图片循环播放

一、环境 1、树莓派4&#xff1b; 2、串口连接电脑&#xff1b; 3、树莓派由杜邦线连接0.96寸OLED1306协议 4、树莓派能够联网&#xff0c;便于安装环境。离线情况也可以安装&#xff0c;相对麻烦&#xff1b; 二、目标 1、树莓派可以开启IIC并识别已连接的IIC&#xff1b; …

Web3解密:理解去中心化应用的核心原理

引言 在当前数字化时代&#xff0c;去中心化技术和应用正在逐渐引起人们的关注和兴趣。Web3技术作为去中心化应用&#xff08;DApps&#xff09;的基础&#xff0c;为我们提供了一个全新的互联网体验。但是&#xff0c;对于许多人来说&#xff0c;这个复杂的概念仍然充满了神秘…

MongoDB基础操作

文章目录 一、什么是MongoDB二、MongoDB 与关系型数据库对比三、数据类型四、部署MongoDB1、下载二进制包2、下载安装包并解压3、创建用于存放数据和日志的目录&#xff0c;并修改权限4、启动MongoDB4.1前台启动4.2后台启动4.3、配置文件启动服务4.4、配置systemd服务4.5、syst…

RabbitMQ发布确认和消息回退(6)

概念 发布确认原理 生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker就会发送一个确认给生产者(包含消…

qt实现方框调整

效果 在四周调整 代码 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QWidget>class MainWindow : public QWidget {Q_OBJECT public:explicit MainWindow(QWidget *parent 0);~MainWindow();void paintEvent(QPaintEvent *event);void updateRect();void re…

Restful API 具体设计规范(概述)

协议 https 域名 https://www.baidu.com/api 版本 https://www.baidu.com/v1 路径 https://www.baidu.com/v1/blogs 方法 数据过滤 状态码返回结果 返回的数据格式 尽量使用 JSON&#xff0c;避免使用 XML。 总结&#xff1a; 看 url 就知道要什么看 http method 就知道干…

Linux进阶篇:CentOS7搭建NFS文件共享服务

CentOS7搭建NFS文件共享服务 一、NFS介绍 NFS(Network File System)意为网络文件系统&#xff0c;它最大的功能就是可以通过网络&#xff0c;让不同的机器不同的操作系统可以共享彼此的文件。简单的讲就是可以挂载远程主机的共享目录到本地&#xff0c;就像操作本地磁盘一样&…

Docker——数据管理和网络通信

目录 一、Docker的数据管理 1.数据卷 2.数据卷容器 3.容器互联 二、Docker镜像的创建 1.基于现有镜像创建 2.基于本地模板创建 3.基于Dockerfile 创建 3.1联合文件系统&#xff08;UnionFS&#xff09; 3.2镜像加载原理 3.3为什么Docker里的Centos大小才200M 4.Dcok…

9【PS作图】像素画Tips

放大缩小 “窗口”-排列-为…画布新建窗口&#xff0c;就可以新建一个窗口&#xff0c;实时看作图效果 如果要保持放大或缩小的像素画仍然保持硬边缘&#xff0c;需要设置两个东西 将 编辑 > 首选项 > 常规 中的 插值方式 改为 “邻近&#xff08;靠近硬边缘&#xff09…

HTML网页自动播放背景音乐和全屏背景图代码

HTML网页自动播放背景音乐的代码 背景音乐代码及分析代码的应用背景图代码及分析下期更新预报 背景音乐代码及分析 能使网站上自动循环的背景音乐代码如下&#xff1a; <audio src"music.mid" autostart"true" loop"true" hidden"true…

【小梦C嘎嘎——启航篇】C++四大类型转换

&#x1f60e; 前言&#x1f64c;C四大类型转换什么是类型转换C语言中的类型转换为什么C要嫌弃C语言的类型转换&#xff1f;自行搞一套呢&#xff1f;C强制类型转换1、static_cast2、reinterpret_cast3、const_cast4、dynamic_cast为什么要支持向下转呢&#xff1f; RTTI 总结撒…

RabbitMQ工作模式(4) - 路由模式

概念 路由模式&#xff08;Routing&#xff09;是 RabbitMQ 中的一种消息传递模式&#xff0c;也称为直连模式。它允许生产者将消息发送到一个交换机&#xff0c;并指定一个或多个路由键&#xff08;routing key&#xff09;&#xff0c;交换机根据路由键将消息路由到与之匹配的…

实验7:路由冗余协议HSRP配置管理(课内实验以及解答)

实验目的及要求&#xff1a; 理解首跳冗余协议&#xff08;FHRP&#xff09;的工作原理&#xff0c;掌握热备份路由器协议 (HSRP)&#xff08;思科私有协议&#xff09;原理和配置。能够实现网络终端设备虚拟网关的配置和网络故障的灵活切换&#xff0c;完成相应网络的联通性测…

多模态大语言模型综述

去年以来&#xff0c;我们见证了以 GPT-4V 为代表的多模态大语言模型(Multimodal Large Language Model&#xff0c;MLLM)的飞速发展。为此我们对综述进行了重大升级&#xff0c;帮助大家全面了解该领域的发展现状以及潜在的发展方向。 MLLM 发展脉络图 MLLM 脱胎于近年来广受…

【Redis 开发】缓存雪崩和缓存击穿

缓存问题 缓存雪崩解决方案 缓存击穿互斥锁逻辑时间基于互斥锁解决缓存击穿问题基于逻辑过期方式解决缓存击穿问题 缓存雪崩 缓存雪崩是指在同一时间段&#xff0c;大量的缓存key同时失效或者Redis服务器宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力 解决…

Qt | QAbstractButton 抽象类

QAbstractButton 类中的属性 ①、autoExclusive:bool 访问函数:bool autoExclusive() const; void setAutoExclusive(bool); 描述了按钮的自动排他性,若启用了该属性,则属于同一父部件的可选中按钮的行为, 就好像是在同一排他性组中的按钮一样。除了单选按钮,默认为关…

【网络编程】TCP流套接字编程 | Socket类 | ServerSocket类 | 文件资源泄露 | TCP回显服务器 | 网络编程

文章目录 TCP流套接字编程1.ServerSocket类2.Socket类3.文件资源泄露4.**TCP回显服务器** TCP流套接字编程 ​ ServerSocket类和Socket类这两个类都是用来表示socket文件&#xff08;抽象了网卡这样的硬件设备&#xff09;。 TCP是面向字节流的&#xff0c;传输的基本单位是b…

Facebook的未知力量:数字世界的新引擎

在数字化的时代&#xff0c;社交媒体已经成为了我们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头&#xff0c;其影响力远远超出了我们的想象。但是&#xff0c;Facebook背后隐藏的力量和影响远不止于此&#xff0c;它正逐渐成为数字世界的新引擎&#xff0…

python 使用flask_httpauth和pyjwt实现登录权限控制

最近需要用到&#xff0c;学习了一下记录 首先安装依赖 pip install Flask-HTTPAuth pyjwt passlib Welcome to Flask-HTTPAuth’s documentation! — Flask-HTTPAuth documentation Welcome to PyJWT — PyJWT 2.8.0 documentation Passlib 1.7.4 documentation — Passl…

Unreal Engine子类化系统UButton

UE系统Button点击事件无法传递参数&#xff0c;通过子类化系统Button添加自定义参数扩展实现Button点击事件参数传递点击C类文件夹&#xff0c;在右边的区域点击鼠标右键&#xff0c;在弹出的菜单中选择“新建C类”在弹出的菜单中选中“显示所有类”&#xff0c;选择Button作为…