设计要求:
当温度在10—40摄氏度范围内,亮黄灯;
当温度在40摄氏度以上时,亮绿灯;
当温度在10摄氏度以下时亮红灯;
所用器材:
1.Arduino 328控制板一个
2.面包板 一个
3.LED红黄绿各一个
4.DHT11一个
5.1K的电阻三个
6.接线若干
源代码:
#define DHT11_PIN 2 // ADC0 这里用ADC0作为数字口用,注意,其实模拟口也可以设置为数字口的。
#define LED_GREEN 9//定义与绿灯连接的引脚
#define LED_YELLOW 10//定义与黄灯连接的引脚
#define LED_RED 11//定义与红灯连接的引脚
byte data;
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while(!(PINC & _BV(DHT11_PIN))); // wait for 50us
delayMicroseconds(30);
if(PINC & _BV(DHT11_PIN))
result |=(1<<(7-i));
while((PINC & _BV(DHT11_PIN))); // wait '1' finish
}
return result;
}
void setup()
{
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
Serial.begin(19200);
}
void loop()
{
byte dht11_in, dht11_dat[5];
byte i;
PORTC &= ~_BV(DHT11_PIN); // 1. pull-down i/o pin from 18ms
delay(18);
PORTC |= _BV(DHT11_PIN); //总线由上拉电阻拉高 主机延时20-40us
delayMicroseconds(40);
DDRC &= ~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN);
delayMicroseconds(80);
dht11_in = PINC & _BV(DHT11_PIN);
if(!dht11_in)
{
return;
}
delayMicroseconds(80); //判断从机是否发出 80us 的低电平响应信号是否结束
// now ready for data recep
tion
for (i=0; i<5; i++)
dht11_dat
= read_dht11_dat();
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
if(dht11_dat[4]= dht11_check_sum) // check check_sum
{
data=dht11_dat[2];
}
if(data>40)//温度大于40
{
digitalWrite(LED_GREEN,HIGH);//绿灯亮
digitalWrite(LED_YELLOW,LOW);//黄灯灭
digitalWrite(LED_RED,LOW);//红灯灭
}
else if(data>=10&&data<=40)//温度在10-40度之间
{
digitalWrite(LED_YELLOW,HIGH);//黄灯亮
digitalWrite(LED_GREEN,LOW);//绿灯灭
digitalWrite(LED_RED,LOW);//红灯灭
}
else//温度在10度以下
{
digitalWrite(LED_RED,HIGH);//红灯亮
digitalWrite(LED_YELLOW,LOW);//黄灯灭
digitalWrite(LED_GREEN,LOW);//绿灯灭
}
delay(2000); //读取模块数据周期不易小于2S
}
原始硬件图
温度在10—40摄氏度之间时的现象
温度在10摄氏度以下时的现象
温度在40摄氏度一上时的现象
1