HTU31D温湿度传感器与IIC通讯获取温度湿度
利用HTU31D温湿度传感器与IIC通讯,实现高精度温湿度的获取,利用常规的IIC通讯协议,编辑IIC底层,然后按照HTU31D温湿度传感器时序发送命令与读取温湿度。本人已调通
#include "drv_iic.h"void IIC_delay(uint32_t a)
{ uint32_t i = a; // 实测控制在72KHZ左右while(i) { i--; }
}
//IIC延时函数
void IIC_Delay_us(uint16_t us)
{{uint16_t i = 0;while (us--){i = 6;while (i--);}}
}void IIC_Config(void){__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}void IIC_SDA_OUT(void){__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}void IIC_SDA_IN(void){__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //浮空输入GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}// 起始信号:SCL在高电平期间,SDA由高电平跳变到低电平,产生一个有效的下降沿void IIC_START(void)
{ SCL_LOW;IIC_SDA_OUT();SDA_HIGH;SCL_HIGH;IIC_delay(10);SDA_LOW;IIC_delay(10);SCL_LOW;
}// 停止信号:SCL在高电平期间,SDA由低电平跳变到高电平,产生一个有效的上升沿
void IIC_STOP(void)
{SCL_LOW;IIC_SDA_OUT();SDA_LOW;SCL_HIGH;IIC_delay(10);SDA_HIGH;IIC_delay(10);
}// 应答信号:SCL在高电平期间,SDA产生一个有效的低电平
void IIC_SendACK_l(void)
{SCL_LOW;IIC_SDA_OUT();SDA_LOW;SCL_HIGH;IIC_delay(10);SCL_LOW;
}// 非应答信号:SCL在高电平期间,SDA产生一个有效的高电平
void IIC_SendNoACK_l(void)
{SCL_LOW;IIC_SDA_OUT();SDA_HIGH;SCL_HIGH;IIC_delay(10);SCL_LOW;
}// 等待应答信号:拉高时钟线,去获取SDA线上的高电平或者低电平
uint8_t IIC_WaitACK_l(void)
{uint8_t temp=0;SCL_LOW;IIC_SDA_IN();SDA_HIGH;IIC_Delay_us(10);SCL_HIGH;IIC_Delay_us(10);
// IIC_delay(4);while(SDA_Read){temp++;if(temp>200){IIC_STOP();return 1;}}SCL_LOW;IIC_Delay_us(30);return 0;
}//发送数据信号:一个字节的数据分8次发送,高位先行,先准备好要发送的数据,然后在让数据有效,在SCL为高电平时,
//数据是稳定,在SCL为低电平时,数据线允许发生改变。
void IIC_SendByteData_l(uint8_t Txdata)
{uint8_t i;SCL_LOW;IIC_SDA_OUT();for(i=0;i<8;i++){if(Txdata&0x80){SDA_HIGH;}else{SDA_LOW;}SCL_HIGH;IIC_delay(10);SCL_LOW;IIC_delay(10);Txdata=Txdata<<1;}SCL_LOW;
}//接收数据信号:拉高时钟线,读取SDA线上从机发过来的数据
uint8_t IIC_RecvByteData_l(uint8_t ackflag)
{uint8_t i;uint8_t Rxdata=0;SCL_LOW;IIC_SDA_IN();for(i=0;i<8;i++){Rxdata=Rxdata<<1;SCL_HIGH;IIC_delay(10);if(SDA_Read){Rxdata=Rxdata|0x01;}SCL_LOW;IIC_delay(10); }if(ACK==ackflag){IIC_SendACK_l();}else{IIC_SendNoACK_l();}SCL_LOW;return Rxdata;
}
#include "drv_htu31d.h"void HTD31D_INIT(void)
{IIC_START();IIC_SendByteData_l(0x80);while(IIC_WaitACK_l());IIC_SendByteData_l(0x1e);while(IIC_WaitACK_l());IIC_STOP();
}void HTD31D_resolution_ratio(uint8_t grade)
{IIC_delay(10000);uint32_t description = 0x40;description|=(grade<<1);IIC_START();IIC_SendByteData_l(0x80);while(IIC_WaitACK_l());IIC_SendByteData_l(description);IIC_delay(2600);while(IIC_WaitACK_l());IIC_STOP();
}uint32_t HTD31D_Humi(uint32_t* Humi) //获取湿度
{uint32_t data;IIC_delay(20000);IIC_START();IIC_SendByteData_l(0x80);while(IIC_WaitACK_l());IIC_SendByteData_l(0x10);while(IIC_WaitACK_l());IIC_STOP();IIC_START();IIC_SendByteData_l(0x81);if(!IIC_WaitACK_l()){data = IIC_RecvByteData_l(ACK);data <<= 8;data += IIC_RecvByteData_l(ACK);data <<= 8;data += IIC_RecvByteData_l(NoACK); *Humi = data; }return 0;
}uint32_t HTD31D_Temp_Humi(uint32_t* Temp,uint32_t* Humi) //获取温度
{uint32_t data;IIC_delay(20000);IIC_START();IIC_SendByteData_l(0x80);while(IIC_WaitACK_l());IIC_SendByteData_l(0x00);while(IIC_WaitACK_l());IIC_STOP();IIC_START();IIC_SendByteData_l(0x81);if(!IIC_WaitACK_l()){data = IIC_RecvByteData_l(ACK);data <<= 8;data += IIC_RecvByteData_l(ACK);data <<= 8;data += IIC_RecvByteData_l(ACK); *Temp = data; data = 0;data <<= 8;data = IIC_RecvByteData_l(ACK);data <<= 8;data += IIC_RecvByteData_l(ACK);data <<= 8;data += IIC_RecvByteData_l(NoACK); *Humi = data; }return 0;}void HTD31D_Heater_on(void) //打开加热
{IIC_START();IIC_SendByteData_l(0x80);IIC_delay(10);while(IIC_WaitACK_l());IIC_delay(10);IIC_SendByteData_l(0x04);\IIC_STOP();
}void HTD31D_Heater_off(void) //关闭加热
{IIC_START();IIC_SendByteData_l(0x80);IIC_delay(10);while(IIC_WaitACK_l());IIC_delay(10);IIC_SendByteData_l(0x02);\IIC_STOP();
}
int main(void)
{HAL_Init();//htu31d初始化 //IIC_delay(10000);IIC_Config();HTD31D_INIT();uint32_t Humi = 0;double Humi_l = 0;SEGGER_RTT_Init();uint32_t Tamp = 0;double Tamp_l = 0;while (1){ HTD31D_resolution_ratio(0);//HTD31D_Humi(&Humi);HTD31D_Temp_Humi(&Tamp,&Humi);Tamp>>=8;Tamp_l = (double)Tamp;Tamp_l = Tamp_l/65535*165-40;Humi>>=8;Humi_l = (double)Humi;Humi_l = Humi_l/65535*100;SEGGER_RTT_printf(0,"Tamp_l=%d Humi_l=%d \r\n",Tamp_l,Humi_l);printf("Tamp_l=%.1f\n",Tamp_l);}}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
