DHT11温湿度传感器
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和
注:一次检测完之后需要等待一段时间(大概100ms以上),否则继续触发收不到数据。
#define DHT_OUT PBout(5)
#define DHT_IN PBin(5)
void DHT11OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void DHT11IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
unsigned char ReadByte(void)
{
unsigned char cnt = 0, flag = 0;
int i;
unsigned char value = 0;
for(i = 7; i >=0; i--)
{
cnt = 0;
while(DHT_IN == 0)
{
if(cnt >= 5)
{
flag = 1;
break;
}
delay_us(10);
cnt++;
}
if(flag) //50us
{
printf("error:11\n");
return 0;
}
delay_us(30);
if(DHT_IN != 0)
{
value |= 1<<i; //数据为1
cnt = 0;
while(DHT_IN != 0)
{
if(cnt >= 5)
{
flag = 1;
break;
}
delay_us(10);
cnt++;
}
if(flag)
{
printf("error:12\n");
return 0;
}
}
}
printf("value:%d \n", value);
return value;
}
unsigned char DHT11Read(void)
{
int cnt = 0;
int flag = 0;
int i = 0;
DHT11OUT();
DHT_OUT = 0;
delay_ms(20); //大于18ms
DHT_OUT = 1;
delay_us(25);
DHT11IN();
if(DHT_IN != 0)
{
printf("error:1\n");
return 0;
}
while(DHT_IN == 0)
{
if(cnt >= 8)
{
flag = 1;
break;
}
delay_us(10);
cnt++;
}
if(flag)
{
printf("error:2\n");
return 0;
}
cnt = 0;
while(DHT_IN !=0)
{
if(cnt >= 8)
{
flag = 1;
break;
}
delay_us(10);
cnt++;
}
if(flag)
{
printf("error:3\n");
return 0;
}
memset(value_array, 0, 5);
for(i = 0; i < 5; i++)
{
value_array[i] = ReadByte();
if(value_array[i] == 0)
return 0;
//while(DHT_IN != 0);
}
return 1;
}
US-100 超声波测距模块
当插上跳线帽时为UART(串口)模式,拔掉时为电平
触发模式。
图5.1 表明:只需要在Trig/TX 管脚输入一个10US 以上的高电平,系统便可发出8 个40KHZ 的超声波脉冲,然后检测回波信号。当检测到回波信号后,模块还要进行温度值的测量,然后根据当前温度对测距结果进行校正,将校正后的结果通过Echo/RX 管脚输出。
在此模式下,模块将距离值转化为340m/s 时的时间值的2倍,通过Echo 端输出一高电平,可根据此高电平的持续时间来计算距离值。即距离为:(高电平时间*340m/s)/2。注:因为距离值已经经过温度校正,此时无需再根据环境温度对超声波声速进行校正,即不管温度多少,声速选择340m/s 即可。
while (1)
{
cnt = 0;
DHT11OUT();
DHT11IN();
DHT_OUT = 1;
delay_us(10);
DHT_OUT = 0;
while(!DHT_IN);
while(DHT_IN)
{
delay_ms(1);
cnt++;
}
printf("cnt:%d, len:%d cm\n", cnt, (int)(340 / 2.0 * cnt / 10));
delay_ms(1000);
}