|
作者:菜园学子
先下一张图片看看:
生菜
以下是arduino 代码:
int io7 = 7;//串口7为水泵 CTR1
int io8 = 8;//串口8为风扇 CTR2
int io9 = 9;//串口9为PWM LED闪光 固态继电器
int a,v;//a表示分钟,v表示次数
int wendu5 = 0;//从0到15,1分钟计算1次温度;如果连续15次就串口8高电平
int shidu5 = 0;//从0到15,1分钟计算1次湿度;如果连续15次就串口8高电平
#define DHT11_PIN 0;//温湿度传感器A0
byte read_dht11_dat(){
byte i = 0;
byte result = 0;
for(i=0;i<8;i++){
while(!(PINC&_BV(DHT11_PIN)));
delayMicroseconds(30);
if(PINC&_BV(DHT11_PIN)){
result|=(1<<(7-i));
while((PINC&_BV(DHT11_PIN)));
}
}
return result;
}
void setup_dht11(){
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
Serial.begin(9600);
Serial.println("Ready");
}
void setup(){//创建函数
Serial.begin(9600);//设定波特率为9600
pinMode(io7,OUTPUT);//设定7为输出串口:OUTPUT为输出,INPUT为输入。
pinMode(io8,OUTPUT);//设定8为输出串口:OUTPUT为输出,INPUT为输入。
pinMode(io9,OUTPUT);//设定9为输出串口:OUTPUT为输出,INPUT为输入。
setup_dht11();
}
void loop(){//循环执行1次用时30分钟
/*获取温湿度——开始*/
byte dht11_dat[5];
byte dht11_in;
byte i;
PORTC &= ~_BV(DHT11_PIN);
delay(18);
PORTC|=_BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &= ~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN);
if(dht11_in){
Serial.println("dht11 start condition 1 not met");
return;
}
delayMicroseconds(80);
dht11_in=PINC & _BV(DHT11_PIN);
if(!dht11_in){
Serial.println("dht11 start condition 2 not met");
return;
}
delayMicroseconds(80);
for(i=0;i<5;i++){
dht11_dat<i>=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){
Serial.println("DHT11 checksum error");
}
/*获取温湿度——结束*/
/*统计次数——开始*/
if(dht11_dat[2]<15 || dht11_dat[2]>29){//如果温度不在15至29度之间
++wendu5;//计算一次温度
} else {
wendu5 = 0;//温度回调为0次
}
if(dht11_dat[0]<55 || dht11_dat[0]>85){//如果湿度不在55%至85%之间
++shidu5;//计算一次湿度
} else {
shidu5 = 0;//湿度回调为0次
}
/*统计次数——结束*/
if(a<1 || a>30){
a = 1;//a回调为1
}
if(a==1 || a==16){//在第1和16分钟时,串口7工作
digitalWrite(io7,HIGH);//串口7输出高电平
} else {//其它时间,串口7暂停
digitalWrite(io7,LOW);//串口7输出低电平
}
if(wendu5>=15 || shidu5>=15){
digitalWrite(io8,HIGH);//串口8输出高电平
wendu5 = 0;//温度回调为0次
shidu5 = 0;//湿度回调为0次
} else {
digitalWrite(io8,LOW);//串口8输出低电平
}
for(v=1;v<=3000;++v){//v表示次数,执行3000次刚好60秒
analogWrite(io9,255);//串口9输出高电平,5V
delayMicroseconds(3617);//等待3617微秒,1毫秒=1000微秒
analogWrite(io9,0);//串口9输出低电平,0V
delayMicroseconds(16383);//等待16383微秒,1毫秒=1000微秒
}
++a;//a递加1
}
原文地址:http://www.yzci.com/forum.php?mod=viewthread&tid=163045 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入菜园网
×
|