SHT20 SHT21 HTU20 温湿度传感器驱动 STM32F051

STM32F051 模拟IIC

/**
  ******************************************************************************
  * @file      HTU20.x
  * @brief     HTU20 function
  * @cpu       STM32F051
  * @compiler  Keil uVision V4.74
  * @author    MetalSeed
  * @copyright WSHHB
  * @version   V1.0.0
  * @date      18-Sept-2014
  * @modifydate20-Sept-2014
  ******************************************************************************
  * @attention
  */
#include "boardAPI.h"
#include "stm32f0xx.h"
#include "HTU20.h"
#include "uart.h"
#include "delay.h"

GPIO_InitTypeDef        GPIO_InitStructure;

/**
  * @brief  Start HTU GPIO port CLK
  * @retval None
  */
void HTUInit()
{
  RCC_AHBPeriphClockCmd(HTU20_CLK, ENABLE);
}

/*================================================================
                           IIC address
================================================================*/
#define SHT20ADDR      0x80

/*================================================================
                 ACK  and  NACK  defination
================================================================*/
#define ACK            0
#define NACK           1

/*================================================================
                       HTU20D Command Code
================================================================*/
/*
  Command                         Code              Comment
  Trigger Temperature Measurement 0xe3              Hold master
  Trigger Humidity Measurement    0xe5              Hold master
  Trigger Temperature Measuremeng 0xf3              No Hold master
  Trigger Humidity Measurement    0xf5              No Hold master
  Write user register             0xe6
  Read user register              0xe7
  Soft Reset                      0xfe
*/
#define SOFT_RESET      0xfe
#define READ_REGISTER   0xe7
#define WRITE_REGISTER  0xe6
#define TRIGGER_TEMP    0xf3
#define TRIGGER_HUMI    0xf5

/*================================================================
                    HTU20 operate interface
================================================================*/
#define HTU20_SDA         GPIO_ReadInputDataBit(HTU20_SCL_PORT,HTU20_SCL_PIN)
#define HTU20_SCL         GPIO_ReadInputDataBit(HTU20_SDA_PORT,HTU20_SDA_PIN)

/**
  * @brief  Set SDA pin dircate as output
  * @retval None
  */
void HTU20_SDA_OUT()
{
  GPIO_StructInit(&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin   = HTU20_SDA_PIN;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_Init(HTU20_SDA_PORT, &GPIO_InitStructure);
}

/**
  * @brief  Set SDA pin dircate as intput
  * @retval None
  */
void HTU20_SDA_IN()
{
  GPIO_StructInit(&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin   = HTU20_SDA_PIN;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(HTU20_SDA_PORT, &GPIO_InitStructure);
}

/**
  * @brief  Set SDA pin as high
  * @retval None
  */
void HTU20_SDA_1()
{
  GPIO_SetBits(HTU20_SDA_PORT,HTU20_SDA_PIN)            ;
}

/**
  * @brief  Set SDA pin as low
  * @retval None
  */
void HTU20_SDA_0()
{
  GPIO_ResetBits(HTU20_SDA_PORT,HTU20_SDA_PIN)          ;
}

/**
  * @brief  Set SCL pin dircate as output
  * @retval None
  */
void HTU20_SCL_OUT()
{
  GPIO_StructInit(&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin   = HTU20_SCL_PIN;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_Init(HTU20_SCL_PORT, &GPIO_InitStructure);
}

/**
  * @brief  Set SCL pin as high
  * @retval None
  */
void HTU20_SCL_1()
{
  GPIO_SetBits(HTU20_SCL_PORT,HTU20_SCL_PIN)            ;
}

/**
  * @brief  Set SCL pin as low
  * @retval None
  */
void HTU20_SCL_0()
{
  GPIO_ResetBits(HTU20_SCL_PORT,HTU20_SCL_PIN)          ;
}

/*================================================================
                  Simulation I2C Function
================================================================*/

/**
  * @brief  A short delay  for iic synchronization
  * @param  t us
  * @retval None
  */
void I2CDelay (BYTE t)
{
  while(t--)
  {
    __nop();  __nop(); __nop(); __nop(); __nop();
    __nop();  __nop(); __nop(); __nop(); __nop();
    __nop();  __nop(); __nop(); __nop(); __nop();
    __nop();  __nop(); __nop(); __nop(); __nop();
    __nop();  __nop(); __nop(); __nop(); __nop();
    __nop();  __nop(); __nop(); __nop(); __nop();
    __nop();  __nop(); __nop(); __nop(); __nop();
  }
}
/**
  * @brief  I2C init
  * @retval None
  */

void I2CInit(void)
{
  HTU20_SDA_OUT();
  HTU20_SCL_OUT();
  HTU20_SDA_1();
  I2CDelay(1);
  HTU20_SCL_1();
  I2CDelay(1);
}

/**
  * @brief   IIC start signal
  * @comment SCL、SDA同为高,SDA跳变成低之后,SCL跳变成低
  * @retval  None
  */
void I2CStart(void)
{
  HTU20_SDA_OUT();
  HTU20_SDA_1();
  HTU20_SCL_1();
  I2CDelay(5);     //大于4.7us
  HTU20_SDA_0();
  I2CDelay(5);     //大于4us
  HTU20_SCL_0();
  I2CDelay(5);
}

/**
  * @brief  IIC Stop Signal
  * @commet SCL、SDA同为低,SCL跳变成高之后,SDA跳变成高
  * @retval None
  */
void I2CStop(void)
{
  HTU20_SDA_OUT();
  HTU20_SDA_0();
  HTU20_SCL_0();
  I2CDelay(5);
  HTU20_SCL_1();
  I2CDelay(5);
  HTU20_SDA_1();
  I2CDelay(5);
}

/**
  * @brief  simu IIC write byte
  * @param  Write_Byte: data
  * @retval None
  */
BYTE I2C_Write_Byte(BYTE Write_Byte)
{
  BYTE i;
  HTU20_SDA_OUT();

  for(i = 0; i < 8; ++i)
  {
    if(Write_Byte & SHT20ADDR)
    {
      HTU20_SDA_1();
    }
    else
    {
      HTU20_SDA_0();
    }
    I2CDelay(1);
    HTU20_SCL_1();       //输出SDA稳定后拉高SCL,从机检测到后采样
    I2CDelay(5);         //保证足够长锁定时间,确保从机采样成功
    HTU20_SCL_0();
    I2CDelay(1);
    Write_Byte <<= 1;
  }
  I2CDelay(4);
  HTU20_SDA_1();         //8位发送完后释放数据线,准备接受应答信号
  HTU20_SCL_1();         //再次拉高SCL,告诉从机发送完毕,等待应答
  I2CDelay(5);

  HTU20_SDA_IN();
  if(HTU20_SDA == 1)     //SDA为高,收到NACK
    return NACK;
  else                   //SDA为低,收到ACK
    return ACK;
//  HTU20_SCL_0();
//  I2CDelay(15);
}

/**
  * @brief  simu read byte form IIC
  * @param
  * @retval None
  */
BYTE I2C_Read_Byte(BYTE AckValue)//receivebyte
{
  BYTE i, RDByte = 0;
  HTU20_SDA_OUT();
  HTU20_SCL_0();
  HTU20_SDA_1();      //释放总线,并置数据线为输入
  HTU20_SDA_IN();
  for (i = 0; i < 8; ++i)
  {
    HTU20_SCL_1();    //拉高SCL期间,采样
    I2CDelay(2);
    RDByte <<= 1;
    if(HTU20_SDA == 1)
    {
      RDByte |= 0x01;
    }
    else
    {
      RDByte &= 0xfe;
    }
    I2CDelay(1);
    HTU20_SCL_0();    //下降沿告知从机发送下一位
    I2CDelay(6);
  }
  HTU20_SDA_OUT();   //接受完一个字节,发送ACK or NACK
  if(AckValue == 1)
  {
    HTU20_SDA_1();
  }
  else
  {
    HTU20_SDA_0();
  }
  I2CDelay(3);
  HTU20_SCL_1();
  I2CDelay(5);
  HTU20_SCL_0();     //清时钟线
  I2CDelay(15);
  //HTU20_SDA_1();
  return RDByte;
}

/**
  * @brief  soft reset by transmit reset command
  * @retval None
  */
void SoftReset(void)
{
  I2CInit();
  I2CStart();
  I2C_Write_Byte(SHT20ADDR & 0xfe);  //I2C address + write
  I2C_Write_Byte(SOFT_RESET);        //soft reset
  I2CStop();
}

/**
  * @brief  SET HTU20D resolution by write register
  * @retval None
  */
void SET_Resolution(void)
{
  I2CStart();
  if(I2C_Write_Byte(SHT20ADDR & 0xfe) == ACK) //I2C address + write + ACK
  {
    if(I2C_Write_Byte(WRITE_REGISTER)==ACK)   //写用户寄存器
    {
      if(I2C_Write_Byte(0x83)==ACK);          //设置分辨率   11bit RH% 测量时间:12ms(typ.)
    }                                         //             11bit T℃ 测量时间:9ms(typ.)
  }
  I2CStop();
}

/**
  * @brief  read sht20's converted result
  * @param  TempOrHumiCMD: operation command for temperature or humidity
  * @retval None
  */
float ReadSht20(char TempOrHumiCMD)
{
  float temp;
  BYTE MSB,LSB;
  float Humidity, Temperature;

  SET_Resolution();
  I2CStart();
  if(I2C_Write_Byte(SHT20ADDR & 0xfe) == ACK)      //I2C address + write + ACK
  {
    if(I2C_Write_Byte(TempOrHumiCMD) == ACK)       //command
    {
      do
      {
        delayms(6);
        I2CStart();
      } while(I2C_Write_Byte(SHT20ADDR | 0x01) == NACK); //I2C address + read + NACK

      MSB = I2C_Read_Byte(ACK);
      LSB = I2C_Read_Byte(ACK);
      I2C_Read_Byte(NACK);                        //Checksum  + NACK
      I2CStop();
      LSB &= 0xfc;                                //Data (LSB) 的后两位在进行物理计算前前须置0
      temp = (MSB << 8) + LSB;

      if (TempOrHumiCMD == ((char)TRIGGER_HUMI))
      {
        /*-- calculate relative humidity [%RH] --*/
        //equation: RH% = -6 + 125 * SRH/2^16
        Humidity = (temp * 125) / 65536 - 6;
        return Humidity;
      }
      else
      {
        /*-- calculate temperature [°C] --*/
        //equation:T = -46.85 + 175.72 * ST/2^16
        Temperature = (temp * 175.72) / 65536 - 46.85;
        return Temperature;
      }
    }
  }
  return 0;
}

SHT20 SHT21 HTU20 温湿度传感器驱动 STM32F051,布布扣,bubuko.com

时间: 2024-08-27 16:27:05

SHT20 SHT21 HTU20 温湿度传感器驱动 STM32F051的相关文章

SHT20 IIC总线驱动概述

SHT20温湿度传感器使用iic总线的驱动方式,以下资料参考SHT20 datasheet总结 1.IIC总线 Start信号 IIC总线的起始信号以SDA由高电平变为低电平,等待5us以上,再由SCL从高电平变低电平,发出起始信号,图示如下所示: 注意:两根线由高变低的间隔时间大于4.7us,建议延时15us example: void IIC_Start(void) { GpioWrite(&SDA, 1); GpioWrite(&SCL, 1); //todo :delay 15us

AM2320 温湿度传感器 C51程序 uart串口输出温湿度

实物图 引脚图 接线图 效果图 源代码 //****************************************************************// //AM系列温湿度传感器,读IIC使用示例  //单片机 :AT89S52 或 STC89C52RC  //功能  :串口发送温湿度数据  波特率 9600  //晶振  :12M (用户系统时钟如不是12M 请更改相关宏定义及注释的延时时间) //波特率:9600 //编译环境:  Keil 4 //*********

Arduino I2C + 温湿度传感器Si7021

  Si7021是Silicon Labs生产的温湿度传感器芯片.其主要特性: 湿度精度:误差典型值+/-2%RH,最大值+/-3%RH(0~80%RH),出厂已校正 温度精度:误差典型值+/-0.3%°C,最大值+/-0.4%°C(-10°C~85°C),出厂已校正 测量范围:温度范围0~100%RH:温度范围最大-40°C~125°C 工作电压:1.9~3.6V 低功耗:工作时150μA,待机时60nA 接口:I2C,最大速率支持400kbps 长期稳定性:湿度≤0.25%RH/yr,温度≤

【Espruino】NO.14 温湿度传感器DHT11

http://blog.csdn.net/qwert1213131/article/details/35828873 本文属于个人理解,能力有限,纰漏在所难免,还望指正! [小鱼有点电] [Espruino中文社区] 在第10节演示过一个DS18B20温度传感器,这节引入可以同时检测温度和湿度的传感器DHT11,可检测温度范围0~50℃(精度为+/-1℃),湿度20~90%(精度为 +/- 4%).DHT11有时不能识别触发脉冲,或偶尔不能读取正确的数据,因此使用校验和机制来验证所以接收到的数据

张高兴的 Windows 10 IoT 开发笔记:DHT11 温湿度传感器

原文:张高兴的 Windows 10 IoT 开发笔记:DHT11 温湿度传感器 GitHub : https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/DHT11Demo

arduino使用oled显示时间MQ_2温湿度

这代码一般都是复制过来,在小改下就行了 代码如下: double Fahrenheit(double celsius) { return 1.8 * celsius + 32; } //摄氏温度度转化为华氏温度 double Kelvin(double celsius) { return celsius + 273.15; } //摄氏温度转化为开氏温度 // 露点(点在此温度时,空气饱和并产生露珠) // 参考: http://wahiduddin.net/calc/density_algor

如何为编程爱好者设计一款好玩的智能硬件(五)——初尝试&#183;把温湿度给收集了(中)!

一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的! 三.MCU选型:如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢? 四.温湿度传感器DHT11驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(四)——初尝试·把温湿度给收集了(上)! 五.温湿度传感器DHT11驱动封装(中): 先打个预防针——本篇可能比较枯燥!与上一篇

树莓派连接DHT11温湿度传感器(python)

介绍 DHT11作为一个廉价配件,同时包含了温度.湿度传感器,而且,编码使用也非常简单. 本文介绍如果在树莓派中使用 DHT11,代码是Python.如果有任何疑问,欢迎在下面留言. 接线 VCC接5V或者3.3V DATA接GPIO(我接的是BCM的16号针脚,物理针脚是36) GND接GND 代码 [codesyntax lang="python"] [python] view plain copy #!/usr/bin/python import RPi.GPIO as GPIO

如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试&#183;把温湿度给收集了(下)!

一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的! 三.MCU选型:如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢? 四.温湿度传感器DHT11驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(四)——初尝试·把温湿度给收集了(上)! 五.温湿度传感器DHT11驱动封装(中):如何为编程爱好者设计一款好玩的智能硬件(五)