STM32F407温湿度模块

 

 

#include "DHT11.h"  
#include "delay.h"
#define DHT11_Mode(x) (x)?GPIO_SetBits(GPIOB,GPIO_Pin_4):GPIO_ResetBits(GPIOB,GPIO_Pin_4)
#define DHT11_READ GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)
static GPIO_InitTypeDef  GPIO_InitStructure;
//引脚 PB4
//输入模式
void DHT11_InputMode(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	
	/* Configure PG6 and PG8 in output pushpull mode */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	
}
//输出模式
void DHT11_OutputMode(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	
	/* Configure PG6 and PG8 in output pushpull mode */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	DHT11_Mode(1);
}
//开始信号
void DHT11_StartSignal(void)
{
	//输出模式
	DHT11_OutputMode();
	//拉低
	DHT11_Mode(0);
	//延迟20ms
	delay_ms(20);
	//拉高
	DHT11_Mode(1);
	//延迟30us
	delay_us(30);
}

//响应
//返回1 失败 返回0成功
uint8_t DHT11_Respnse(void)
{
	uint8_t i = 0;
	//输入模式
	DHT11_InputMode();
	//等待低电平出现 
	while(DHT11_READ == 1 && i<100)
	{
		delay_us(1);
		i++;
	}
	if(i>=100)
		return 1;
	i=0;
	//等待低电平延迟80us
	while(DHT11_READ == 0 && i<100)
	{
		delay_us(1);
		i++;
		
	}
	if(i>=100)
		return 1;//表示没有响应
	else
		return 0;//表示响应了

}

//读取数据

uint32_t DHT_ReadBit(void)
{
	//等待低电平出现  设置超时处理
	uint8_t i = 0;
	while(DHT11_READ == 1 && i<100)
	{
		delay_us(1);
		i++;
	}
	//等待高电平出现
	while(DHT11_READ == 0 && i<100)
	{
		delay_us(1);
		i++;
	}
	delay_us(40);
	if(DHT11_READ == 1)
		return 1;
	else
		return 0;
}

//读取一个字节数据
uint8_t DHT11_ReadByte(void)
{
	uint32_t i =0;
	uint8_t data = 0;
	for(i = 0 ;i < 8; ++i)
	{
		data <<= 1;
		data |=DHT_ReadBit();
	}
	return data;
}

uint32_t DHT11_GetData(uint8_t *buf)
{
	uint32_t i =0;
	//发送开始数据
	DHT11_StartSignal();
	if(DHT11_Respnse() == 0)//响应
	{
		for(i = 0; i<5; ++i)
		{
			buf[i] = DHT11_ReadByte();
		}
		
		//对获取的数据进行校验
		if( buf[0]+buf[1]+buf[2]+buf[3] == buf[4] ) //说明校验正确
		{
			return 0; //说明获取数据成功
		}
		else
			return 1; //获取数据失败 因为校验失败
	
	}
	else
	{
		return 1; //获取数据失败 因为根本没响应
	}
	

}










 

STM32F407是一款高性能的32位微控制器,拥有丰富的外设和强大的计算能力。如果要实现温湿度和WiFi功能,可以按照以下步骤进行: 1. 温湿度传感器接口:STM32F407具有多个通用输入/输出引脚,可以选择其中的一些作为用于连接温湿度传感器的引脚。常见的温湿度传感器如DHT11或DHT22可以轻松地通过数字输入输出(GPIO)进行连接。 2. 读取温湿度数据:使用STM32F407的GPIO功能,通过所选引脚来读取温湿度传感器的数据。可以使用适当的读取协议,如单总线协议或I2C协议进行通信,并将温湿度数据存储在内部变量中,以供后续处理使用。 3. WiFi模块接口:可以选择适合的WiFi模块,如ESP8266或ESP32,并使用STM32F407的串口功能与WiFi模块进行通信。将其中一个UART引脚连接到WiFi模块的Tx引脚,另一个连接到Rx引脚。通过UART协议,可以实现与WiFi模块之间的数据传输。 4. 连接到WiFi网络:使用WiFi模块的AT指令,通过STM32F407向WiFi模块发送相应的命令,以连接到所需的WiFi网络。输入网络的SSID和密码后,WiFi模块将尝试与网络建立连接,并返回连接状态。 5. 数据传输:一旦连接到WiFi网络,可以使用WiFi模块STM32F407之间的串口通信,将温湿度数据传输到远程服务器或云平台。通过WiFi模块STM32F407可以将温湿度数据打包成合适的格式,并使用HTTP或MQTT等协议将数据发送到服务器。 总之,实现STM32F407温湿度加WiFi功能需要通过GPIO读取温湿度传感器数据,并通过UART与WiFi模块进行通信。通过WiFi模块连接到WiFi网络后,可以将温湿度数据传输到远程服务器或云平台,实现温湿度数据的远程监控和控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值