STM32F103C8x平台 AM2311温湿度驱动

4593470-050e9ad3145af4ab.png
image.png

4593470-a62fb46469f80f9c.png
image.png

AM231 11 1 引脚分配
1 红色 VDD 电源 (3.3V-5.5V)
2 黄色 SDA 串行数据,双向口
3 黑色 GND 地
4 -- NC 空脚
电源引脚(D VDD GND )
AM2311 的供电电压范围为 3.3V - 5.5V,建议供电电压为 5V。
串行数据( SDA )
SDA 引脚为三态结构,用于读、写传感器数据。具体的通信时序,见通信协议的详细说明。
时序
用户主机(MCU)发送一次起始信号(把数据总线 SDA 拉低至少 1ms)后,AM2311 从休眠模式转换到高
速模式。待主机开始信号结束后,AM2311 发送响应信号,从数据总线 SDA 串行送出 40Bit 的数据,先发送
字节的高位;发送的数据依次为湿度高位、湿度低位、温度高位、温度低位、校验位,发送数据结束触发
一次信息采集,采集结束传感器自动转入休眠模式,直到下一次通信来临。
4593470-c928156898b001ae.png
image.png

详细产品说明书点击查看
驱动
hal_am2311.c

#include "hal_am2311.h"
#include <string.h>
#include "delay.h"

//GPIO口切换到输如模式
static void AM2311_Mode_IPU(void)
{
     GPIO_InitTypeDef myGPIO_InitStruct;
    myGPIO_InitStruct.Pin = PIN_AM2311;
    myGPIO_InitStruct.Pull = GPIO_PULLUP;
    myGPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    myGPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIO_AM2311, &myGPIO_InitStruct);
    
}

//GPIO口切换到输出模式
static void AM2311_Mode_Out_PP(void)
{   
     GPIO_InitTypeDef myGPIO_InitStruct;
    myGPIO_InitStruct.Pin = PIN_AM2311;
    myGPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    myGPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIO_AM2311, &myGPIO_InitStruct);

}


static uint8_t Read_Byte(void)
{

uint8_t i, temp=0;

for(i=0;i<8;i++)
{

/*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/
while(AM2311_DATA_IN()==LOW);

/*AM2311 以22~30us的高电平表示“0”,以68~75us高电平表示“1”,
             通过检测60us后的电平即可区别这两个状态*/

delay_us(50); //延时50us            

if(AM2311_DATA_IN()==HIGH)//60us后仍为高电平表示数据“1”
{
/*轮询直到从机发出的剩余的 30us 高电平结束*/
while(AM2311_DATA_IN()==HIGH);

temp|=(uint8_t)(0x01<<(7-i));//把第7-i位置1 

}
else //60us后为低电平表示数据“0”
{temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0
}
}return temp;
}

uint8_t Read_AM2311(AM2311_Data_TypeDef *AM2311_Data)
{/*输出模式*/
    AM2311_Mode_Out_PP();
    /*主机拉低*/
    AM2311_DATA_OUT(LOW);
    /*延时2ms*/
    delay_ms(20);

/*总线拉高 主机延时30us*/
AM2311_DATA_OUT(HIGH);

delay_us(30);//延时30us

/*主机设为输入 判断从机响应信号*/
AM2311_Mode_IPU();

/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/
if(AM2311_DATA_IN()==LOW)//T !   
{
/*轮询直到从机发出 的80us 低电平 响应信号结束*/
while(AM2311_DATA_IN()==LOW);
/*轮询直到从机发出的 80us 高电平 标置信号结束*/
while(AM2311_DATA_IN()==HIGH);
/*开始接收数据*/
AM2311_Data->humi_int=Read_Byte();
AM2311_Data->humi_deci= Read_Byte();
AM2311_Data->temp_int= Read_Byte();
AM2311_Data->temp_deci= Read_Byte();
AM2311_Data->check_sum= Read_Byte();
/*读取结束,引脚改为输出模式*/
AM2311_Mode_Out_PP();
/*主机拉高*/
AM2311_DATA_OUT(HIGH);
/*检查读取的数据是否正确*/
if(AM2311_Data->check_sum ==AM2311_Data->humi_int + AM2311_Data->humi_deci + AM2311_Data->temp_int+ AM2311_Data->temp_deci)
return SUCCESS;
else
return ERROR;
}
else
{
return ERROR;
}
}

hal_am2311.h

#ifndef _AM2311_H
#define _AM2311_H

#include <stdio.h>
#include <stm32f1xx_hal.h>

#define RCC_GPIO_AM2311 RCC_APB2Periph_GPIOB
#define GPIO_AM2311 GPIOB
#define PIN_AM2311 GPIO_PIN_0  //修改为对应的io口
#define HIGH 1
#define LOW 0

typedef struct
{  
    uint8_t     humi_int;//湿度的整数部分
    uint8_t     humi_deci;//湿度的小数部分
    uint8_t     temp_int;//温度的整数部分
    uint8_t     temp_deci;//温度的小数部分
    uint8_t     check_sum;//校验和

}AM2311_Data_TypeDef;

#define AM2311_DATA_OUT(a) if (a) \
        HAL_GPIO_WritePin(GPIO_AM2311, PIN_AM2311, GPIO_PIN_SET);\
        else \
        HAL_GPIO_WritePin(GPIO_AM2311, PIN_AM2311, GPIO_PIN_RESET)
//读取引脚的电平
#define AM2311_DATA_IN()        HAL_GPIO_ReadPin(GPIO_AM2311, PIN_AM2311)
void AM2311_GPIO_Config(void);
static void AM2311_Mode_IPU(void);
static void AM2311_Mode_Out_PP(void);
uint8_t Read_AM2311(AM2311_Data_TypeDef *AM2311_Data);
static uint8_t Read_Byte(void);
        
#endif /* _AM2311_H */

读取温湿度数据

 //计算出实际湿度值的10倍
if( Read_AM2311(&AM2311_Data)==SUCCESS)
        {           
            RH_Value= AM2311_Data.humi_int*256 + AM2311_Data.humi_deci;
            RH_H = RH_Value/10;
            RH_L = RH_Value%10;
            //计算出时间温度值的10倍
            TEMP_Value = AM2311_Data.temp_int*256 + AM2311_Data.temp_deci;
            TP_H = TEMP_Value/10;
            TP_L = TEMP_Value%10;
}

多次读取时,设置读取间隔时间,一般为2s.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

truemi.73

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值