历史上的今天

今天是:2025年10月13日(星期一)

正在发生

2022年10月13日 | STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)

发布者:幸福时刻 来源: csdn关键字:STM32F103ZE  SHT30  IIC  模拟时序 手机看文章 扫描二维码
随时随地手机看文章

一、环境介绍

工程编译软件:  keil5


温湿度传感器: SHT30


MCU : STM32F103ZET6


程序采用模块化编程,iic时序为一个模块(iic.c 和 iic.h),SHT30为一个模块(sht30.c 和 sht30.h);IIC时序采用模拟时序方式实现,IO口都采用宏定义方式,方便快速移植到其他平台使用。


工程源码完整下载地址: https://download.csdn.net/download/xiaolong1126626497/18973724


二、SHT30介绍

特点:


1. 湿度和温度传感器

2. 完全校准、线性化和温度

3. 补偿数字输出,宽电源电压范围,从2.4 V到5.5 V

4. I2C接口,通信速度高达1MHz和两个用户可选地址

5. 典型精度 +- 2%相对湿度和+- 0.3°C

6. 启动和测量时间非常快

7. 微型8针DFN封装

这是SHT30的7位IIC设备地址:   

三、设备运行效果

这是串口打印的数据:

 

四、设备代码

4.1  main.c

#include "stm32f10x.h"

#include "led.h"

#include "delay.h"

#include "key.h"

#include "usart.h"

#include "iic.h"

#include "sht3x.h"

 

int main()

{

   float Humidity;

   float Temperature;

   USART1_Init(115200);

   USART1_Printf("设备运行正常....rn");

   IIC_Init(); 

   Init_SHT30();

   while(1)

   {

       //读取温湿度

       SHT3x_ReadData(&Humidity,&Temperature);

       USART1_Printf("温度:%0.2f,湿度:%0.2frn",Temperature,Humidity);

       delay_ms(1000);

   }

}


4.2 sht30.c

#include "sht3x.h"

 

const int16_t POLYNOMIAL = 0x131;

 

/***************************************************************

* 函数名称: SHT30_reset

* 说    明: SHT30复位

* 参    数: 无

* 返 回 值: 无

***************************************************************/

void SHT30_reset(void)

{

    u8 r_s;

    

    IIC_Start(); //发送起始信号

    

    IIC_WriteOneByteData(SHT30_AddrW); //写设备地址

    r_s=IIC_GetACK();//获取应答

    if(r_s)printf("Init_SHT30_error:1rn");

 

    IIC_WriteOneByteData(0x30); //写数据

    r_s=IIC_GetACK();//获取应答

    if(r_s)printf("Init_SHT30_error:2rn");

    

    IIC_WriteOneByteData(0xA2); //写数据

    r_s=IIC_GetACK();//获取应答

    if(r_s)printf("Init_SHT30_error:3rn");

    

    IIC_Stop(); //停止信号 

 

    delay_ms(50);    

}

 

 

/***************************************************************

* 函数名称: Init_SHT30

* 说    明: 初始化SHT30,设置测量周期

* 参    数: 无

* 返 回 值: 无

***************************************************************/

void Init_SHT30(void)

{

     u8 r_s;

    

    IIC_Start(); //发送起始信号

    

    IIC_WriteOneByteData(SHT30_AddrW); //写设备地址

    r_s=IIC_GetACK();//获取应答

    if(r_s)printf("Init_SHT30_error:1rn");

 

    IIC_WriteOneByteData(0x22); //写数据

    r_s=IIC_GetACK();//获取应答

    if(r_s)printf("Init_SHT30_error:2rn");

    

    IIC_WriteOneByteData(0x36); //写数据

    r_s=IIC_GetACK();//获取应答

    if(r_s)printf("Init_SHT30_error:3rn");

    

    IIC_Stop(); //停止信号  

    

    delay_ms(200);

}

 

 

/***************************************************************

* 函数名称: SHT3x_CheckCrc

* 说    明: 检查数据正确性

* 参    数: data:读取到的数据

nbrOfBytes:需要校验的数量

checksum:读取到的校对比验值

* 返 回 值: 校验结果,0-成功 1-失败

***************************************************************/

u8 SHT3x_CheckCrc(char data[], char nbrOfBytes, char checksum)

{

    char crc = 0xFF;

    char bit = 0;

    char byteCtr ;

    //calculates 8-Bit checksum with given polynomial

    for(byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)

    {

        crc ^= (data[byteCtr]);

        for ( bit = 8; bit > 0; --bit)

        {

            if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;

            else crc = (crc << 1);

        }

    }

    if(crc != checksum)

return 1;

    else

return 0;

}

 

/***************************************************************

* 函数名称: SHT3x_CalcTemperatureC

* 说    明: 温度计算

* 参    数: u16sT:读取到的温度原始数据

* 返 回 值: 计算后的温度数据

***************************************************************/

float SHT3x_CalcTemperatureC(unsigned short u16sT)

{

    float temperatureC = 0;            // variable for result

 

    u16sT &= ~0x0003;           // clear bits [1..0] (status bits)

    //-- calculate temperature [℃] --

    temperatureC = (175 * (float)u16sT / 65535 - 45); //T = -45 + 175 * rawValue / (2^16-1)

    return temperatureC;

}

 

/***************************************************************

* 函数名称: SHT3x_CalcRH

* 说    明: 湿度计算

* 参    数: u16sRH:读取到的湿度原始数据

* 返 回 值: 计算后的湿度数据

***************************************************************/

float SHT3x_CalcRH(unsigned short u16sRH)

{

    float humidityRH = 0;              // variable for result

    u16sRH &= ~0x0003;          // clear bits [1..0] (status bits)

    //-- calculate relative humidity [%RH] --

    humidityRH = (100 * (float)u16sRH / 65535);  // RH = rawValue / (2^16-1) * 10

    return humidityRH;

}

 

 

//读取温湿度数据

void SHT3x_ReadData(float *Humidity,float *Temperature)

{

    char  data[3];    //data array for checksum verification

    u8 SHT3X_Data_Buffer[6]; //byte 0,1 is temperature byte 4,5 is humidity

    u8 r_s=0;

    u8 i;

    unsigned short tmp = 0;

    uint16_t dat;

    

    IIC_Start(); //发送起始信号

    

    IIC_WriteOneByteData(SHT30_AddrW); //写设备地址

    r_s=IIC_GetACK();//获取应答

    if(r_s)printf("SHT3X_error:1rn");

 

    IIC_WriteOneByteData(0xE0); //写数据

    r_s=IIC_GetACK();//获取应答

    if(r_s)printf("SHT3X_error:2rn");

    

    IIC_WriteOneByteData(0x00); //写数据

    r_s=IIC_GetACK();//获取应答

    if(r_s)printf("SHT3X_error:3rn");

    

    //IIC_Stop(); //停止信号 

    

   // DelayMs(30); //等待

    

    //读取sht30传感器数据

    IIC_Start(); //发送起始信号

    IIC_WriteOneByteData(SHT30_AddrR);

    r_s=IIC_GetACK();//获取应答

    if(r_s)printf("SHT3X_error:7rn");

    

    for(i=0;i<6;i++)

    {

        SHT3X_Data_Buffer[i]=IIC_ReadOneByteData(); //接收数据

        if(i==5)

        {

             IIC_SendACK(1); //发送非应答信号

            break;

        }

        IIC_SendACK(0); //发送应答信号

    }

    IIC_Stop(); //停止信号

    

    //    /* check tem */

    data[0] = SHT3X_Data_Buffer[0];

    data[1] = SHT3X_Data_Buffer[1];

    data[2] = SHT3X_Data_Buffer[2];

 

    tmp=SHT3x_CheckCrc(data, 2, data[2]);

    if( !tmp ) /* value is ture */

    {

        dat = ((uint16_t)data[0] << 8) | data[1];

        *Temperature = SHT3x_CalcTemperatureC( dat );    

    }

 

    //    /* check humidity */

    data[0] = SHT3X_Data_Buffer[3];

    data[1] = SHT3X_Data_Buffer[4];

    data[2] = SHT3X_Data_Buffer[5];

 

    tmp=SHT3x_CheckCrc(data, 2, data[2]);

    if( !tmp ) /* value is ture */

    {

        dat = ((uint16_t)data[0] << 8) | data[1];

        *Humidity = SHT3x_CalcRH( dat );    

    }

}

 


4.3 iic.c

#include "iic.h"

 

/*

函数功能:IIC接口初始化

硬件连接:

SDA:PB7

SCL:PB6

*/

void IIC_Init(void)

{

RCC->APB2ENR|=1<<3;//PB

GPIOB->CRL&=0x00FFFFFF;

GPIOB->CRL|=0x33000000;

GPIOB->ODR|=0x3<<6;

}

 

/*

函数功能:IIC总线起始信号

*/

void IIC_Start(void)

{

    IIC_SDA_OUTMODE(); //初始化SDA为输出模式

    IIC_SDA_OUT=1; //数据线拉高

    IIC_SCL=1;      //时钟线拉高

    DelayUs(4);        //电平保持时间

    IIC_SDA_OUT=0; //数据线拉低

    DelayUs(4);        //电平保持时间

    IIC_SCL=0;      //时钟线拉低

}

 

 

/*

函数功能:IIC总线停止信号

*/

void IIC_Stop(void)

{

IIC_SDA_OUTMODE(); //初始化SDA为输出模式

IIC_SDA_OUT=0; //数据线拉低

IIC_SCL=0;      //时钟线拉低

DelayUs(4);        //电平保持时间

IIC_SCL=1;      //时钟线拉高

DelayUs(4);        //电平保持时间

IIC_SDA_OUT=1; //数据线拉高

}

 

/*

函数功能:获取应答信号

返 回 值:1表示失败,0表示成功

*/

u8 IIC_GetACK(void)

{

u8 cnt=0;

IIC_SDA_INPUTMODE();//初始化SDA为输入模式

IIC_SDA_OUT=1;   //数据线上拉

  DelayUs(2);         //电平保持时间

IIC_SCL=0;        //时钟线拉低,告诉从机,主机需要数据

DelayUs(2);         //电平保持时间,等待从机发送数据

  IIC_SCL=1;        //时钟线拉高,告诉从机,主机现在开始读取数据

while(IIC_SDA_IN)   //等待从机应答信号

{

cnt++;

if(cnt>250)return 1;

}

IIC_SCL=0;        //时钟线拉低,告诉从机,主机需要数据

return 0;

}

 

/*

函数功能:主机向从机发送应答信号

函数形参:0表示应答,1表示非应答

*/

void IIC_SendACK(u8 stat)

{

IIC_SDA_OUTMODE(); //初始化SDA为输出模式

IIC_SCL=0;      //时钟线拉低,告诉从机,主机需要发送数据

if(stat)IIC_SDA_OUT=1; //数据线拉高,发送非应答信号

else IIC_SDA_OUT=0; //数据线拉低,发送应答信号

DelayUs(2);            //电平保持时间,等待时钟线稳定

IIC_SCL=1;           //时钟线拉高,告诉从机,主机数据发送完毕

[1] [2]
关键字:STM32F103ZE  SHT30  IIC  模拟时序 引用地址:STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)

上一篇:STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)
下一篇:STM32+MFRC522完成IC卡号读取、密码修改、数据读写

推荐阅读

        在如今这个“一部手机走天下”的时代,为了日常支付的方便,很多人都会在支付应用中开通“免密支付”功能。尽管大多数时候“免密支付”的额度并不高,但稍不留意仍有可能给自己造成巨额损失。近日,苹果App Store就爆出了大规模的“免密”盗刷事件,受害者多达700余人。        从新闻报道的内容来看,这700多位用户收到的损失都...
10月9日上午,中国能建安徽电建二公司承建的陕北±800千伏换流站工程主控楼基础正式浇筑第一罐混凝土,标志着该工程主体工程正式开工。 陕北±800千伏换流站是陕北-湖北±800千伏特高压直流输电工程的送端换流站,站址位于陕西省榆林市东北府谷县田家寨乡,黄土高原近边缘区,孤山川与石马川之间山坳中。该项目的建设将构筑起“北电南送”的“高速路”...
自去年iPhone 11首次推出超宽带UWB技术,不久前三星Galaxy Note20 Ultra也支持UWB技术,而今小米10系列产品也正式推出UWB技术。10月12日,小米官方公布其最新的黑科技“一指连”UWB技术,一指连全场景设备。这是一全具备空间定位的新一代连接技术,率先实现了革命性的指向交互方式。此次,结合小米自研的天线排列及算法,通过魔改小米10系列手机及一系...
摘要该方法适用于STM32,实现了使用printf等标准C流函数输出数据的办法,极大的减少了输出串口数据时所需要做的数据处理。实现原理在C库中,printf()等输出流函数都是通过fputc()这个函数实现的,所以我们通过重映射的方式,修改这个函数的定义使它输出在STM32的寄存器中,便可以实现使用printf()函数在STM32串口上输出数据的功能。Keil环境 重映射在STM3...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved