极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11418|回复: 2

智能大棚的问题,跪求大神指点

[复制链接]
发表于 2015-5-31 14:58:15 | 显示全部楼层 |阅读模式
要做个智能大棚的模型,用的是Arduino UNO,HC-SR501,DHT11,YL-69,GY-30,SIM900A,功能是来人了自动开灯,环境数值超过或低于设定值就相应的输出一个高电平,接通继电器启动外设,例如温度低就加热,所有的数据都能通过短信的形式发送到手机上。现在的情况是各个模块单个能使用,合起来程序能编译通过,继电器能启动,但是串口中不能显示,短信不能发出来。跪求大神解决!谢谢各位
#include<SoftwareSerial.h>
#include <Wire.h>//IIC
#include <math.h>
int havepeople;
int  redled= 7; //红外信号接 7 端口
int  led=8; // 灯接在8端口
int wendupin=6;//DHT11接口
int jiarePin=5; //加热继电器接Pin5
int sanrePin=4; //散热继电器接Pin4
int wendu;//温度
int tol;//校对码
unsigned int loopCnt;
int chr[40] = {0};//创建数字数组,用来存放40个bit
unsigned long time;

int shiduPin = 1;//信号接模拟口A1
int  jiaoshuiPin=12; //浇水继电器接Pin12  
int  tongfengPin=13; //通风继电器接Pin13
int shidu;//定义湿度变量

int BH1750address = 0x23;  //模块地址  
byte buff[2];          //两个字节存储光强数据  
uint16_t guangqiang=0;
SoftwareSerial  mySerial(2,3);
//短信内容
char temp[2];
char mois[3];
char light[2];
char txtMsg[100];
void setup()
{
   // 初始化串口通信
Serial.begin(19200);
Serial.println("Ready");
pinMode(redled, INPUT); // 将7 端口设置为输入
pinMode(led,OUTPUT);
pinMode(shiduPin, INPUT);
pinMode(jiarePin,OUTPUT);
pinMode(sanrePin,OUTPUT);
pinMode(jiaoshuiPin,OUTPUT);
pinMode(tongfengPin,OUTPUT);
Wire.begin();//设置IIC总线  
mySerial.begin(19200);
delay(100);
mySerial.println("AT");
delay(100);
mySerial.println("AT+IPR=<0>");
delay(100);
mySerial.println("AT+CMGF=1");
delay(100);
}
void loop()
{
char c;
checkpeople();
getwendu();
if(wendu<20)//温度小于20,加热
{
   digitalWrite(jiarePin,HIGH);
}  
else
digitalWrite(jiarePin,LOW);  

if(wendu>30)//温度大于30,散热
{
   digitalWrite(sanrePin,HIGH);
}
else
digitalWrite(sanrePin,LOW);
delay(2000);//500

getshidu();
if(shidu<500)
{
digitalWrite( jiaoshuiPin ,HIGH); // 湿度小于500,浇水  
}
if(shidu>900)
{
digitalWrite(tongfengPin,HIGH); //湿度大于900,通风  
}

getguangqiang();
if(guangqiang<50000)     //光强小于50000  
{
   analogWrite(3,200);        //开补光灯  
}
Serial.println(havepeople); //串口输出信息,有人的时候输出高电平1 无人0
Serial.print("Temperature =");
Serial.println(wendu);
Serial.println("C");
Serial.print("Soil Moisture:"); //串口打印信息
Serial.println(analogRead(shiduPin));

Serial.print(guangqiang,DEC);   
Serial.println("[lx]");      //打印单位
//短信输出数据
  strcpy(txtMsg,"temperature = ");
   temp[0]=wendu/10%10+'0';
   temp[1]=wendu%10+'0';
   temp[2]='C';
   strcat(txtMsg,temp);
   strcat(txtMsg,"/n");
   
   mois[0]=shidu/1000%10+'0';
   mois[1]=shidu/100%10+'0';
   mois[2]=shidu/10%10+'0';
   mois[3]=shidu%10+'0';
   strcat(txtMsg,"Soil Moisture:");
   strcat(txtMsg,mois);
   strcat(txtMsg,"/n");
   
   light[0]=guangqiang/100%10+'0';
   light[1]=guangqiang/10%10+'0';
   light[2]=guangqiang%10+'0';
   strcat(txtMsg,"Light intensity");
   strcat(txtMsg,light);
   strcat(txtMsg,"[lx]");
   strcat(txtMsg,"/n");
   
   mySerial.println("AT+CMGS=\"GSM\"");
   delay(100);
   mySerial.println("AT+CMGS=\"18233136227\"");
   delay(100);
   mySerial.println(txtMsg);
   delay(100);
   mySerial.println((char)26);
   delay(100);
   mySerial.println();
}
//红外检测函数
void checkpeople()
{
havepeople = digitalRead(redled); //读取7 端口状态  
digitalWrite(led,redled); //有人亮灯,无人灭灯  
//Serial.println(havepeople); //串口输出信息,有人的时候输出高电平1 无人0      
}
//获取温度函数  
void getwendu()
{
   bgn:
   delay(2000);
//设置2号接口模式为:输出
//输出低电平20ms(>18ms)
//输出高电平40μs
   pinMode(wendupin,OUTPUT);
   digitalWrite(wendupin,LOW);
   delay(20);
   digitalWrite(wendupin,HIGH);
   delayMicroseconds(40);
   digitalWrite(wendupin,LOW);
//设置2号接口模式:输入
  pinMode(wendupin,INPUT);
   //高电平响应信号
  loopCnt=10000;
   while(digitalRead(wendupin) != HIGH)
   {
     if(loopCnt-- == 0)
     {
//如果长时间不返回高电平,输出个提示,重头开始。
      Serial.println("HIGH");
       goto bgn;
     }
   }
   //低电平响应信号
  loopCnt=30000;
   while(digitalRead(wendupin) != LOW)
   {
     if(loopCnt-- == 0)
     {
//如果长时间不返回低电平,输出个提示,重头开始。
      Serial.println("LOW");
       goto bgn;
     }
   }
//开始读取bit1-40的数值  
     for(int i=0;i<40;i++)
   {
     while(digitalRead(wendupin) == LOW)
     {}
//当出现高电平时,记下时间“time”
    time = micros();
     while(digitalRead(wendupin) == HIGH)
     {}
//当出现低电平,记下时间,再减去刚才储存的time
//得出的值若大于50μs,则为‘1’,否则为‘0’
//并储存到数组里去
    if (micros() - time >50)
     {
       chr[i]=1;
     }else{
       chr[i]=0;
     }
   }
      
//温度,8位的bit,转换为数值
wendu=chr[16]*128+chr[17]*64+chr[18]*32+chr[19]*16+chr[20]*8+chr[21]*4+chr[22]*2+chr[23];
   //校对码,8位的bit,转换为数值
tol=chr[32]*128+chr[33]*64+chr[34]*32+chr[35]*16+chr[36]*8+chr[37]*4+chr[38]*2+chr[39];
//校对码,我这里没用上
//理论上,湿度+温度=校对码
//如果数值不相等,说明读取的数据有错。
}

//获取湿度值函数  
void getshidu()
{
shidu= analogRead(shiduPin); //读取湿度值
delay(100);
}

//获取光强传感器数值函数  
int BH1750_Read(int address) //读取数据  
{
   int i=0;
   Wire.beginTransmission(address);
   Wire.requestFrom(address, 2);     //数据格式  
   while(Wire.available()) //
   {
     buff[i] = Wire.read();  // receive one byte  
     i++;
   }
   Wire.endTransmission();
   return i;
}
void BH1750_Init(int address)
{
   Wire.beginTransmission(address);
   Wire.write(0x10);//1lx reolution 120ms  
   Wire.endTransmission();
}
//获取光强函数  
void getguangqiang()
{
BH1750_Init(BH1750address);  //初始化模块  
delay(200);
if(2==BH1750_Read(BH1750address))  //读两个字节  
   {
    guangqiang=((buff[0]<<8)|buff[1])/1.2;   //数据处理  
   }
}
回复

使用道具 举报

发表于 2015-5-31 18:07:40 | 显示全部楼层
自己化简程序吧
回复 支持 反对

使用道具 举报

发表于 2015-6-1 13:00:48 | 显示全部楼层
1、简化程序
2、这么多检测过程和动作,最好引入时间片做伪多线程
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 07:36 , Processed in 0.055589 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表