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);
}