小通通 发表于 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;
intredled= 7; //红外信号接 7 端口
intled=8; // 灯接在8端口
int wendupin=6;//DHT11接口
int jiarePin=5; //加热继电器接Pin5
int sanrePin=4; //散热继电器接Pin4
int wendu;//温度
int tol;//校对码
unsigned int loopCnt;
int chr = {0};//创建数字数组,用来存放40个bit
unsigned long time;

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

int BH1750address = 0x23;//模块地址
byte buff;          //两个字节存储光强数据
uint16_t guangqiang=0;
SoftwareSerialmySerial(2,3);
//短信内容
char temp;
char mois;
char light;
char txtMsg;
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("");      //打印单位
//短信输出数据
strcpy(txtMsg,"temperature = ");
   temp=wendu/10%10+'0';
   temp=wendu%10+'0';
   temp='C';
   strcat(txtMsg,temp);
   strcat(txtMsg,"/n");
   
   mois=shidu/1000%10+'0';
   mois=shidu/100%10+'0';
   mois=shidu/10%10+'0';
   mois=shidu%10+'0';
   strcat(txtMsg,"Soil Moisture:");
   strcat(txtMsg,mois);
   strcat(txtMsg,"/n");
   
   light=guangqiang/100%10+'0';
   light=guangqiang/10%10+'0';
   light=guangqiang%10+'0';
   strcat(txtMsg,"Light intensity");
   strcat(txtMsg,light);
   strcat(txtMsg,"");
   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=1;
   }else{
       chr=0;
   }
   }
      
//温度,8位的bit,转换为数值
wendu=chr*128+chr*64+chr*32+chr*16+chr*8+chr*4+chr*2+chr;
   //校对码,8位的bit,转换为数值
tol=chr*128+chr*64+chr*32+chr*16+chr*8+chr*4+chr*2+chr;
//校对码,我这里没用上
//理论上,湿度+温度=校对码
//如果数值不相等,说明读取的数据有错。
}

//获取湿度值函数
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 = 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<<8)|buff)/1.2;   //数据处理
   }
}

zoologist 发表于 2015-5-31 18:07:40

自己化简程序吧

paobo99 发表于 2015-6-1 13:00:48

1、简化程序
2、这么多检测过程和动作,最好引入时间片做伪多线程
页: [1]
查看完整版本: 智能大棚的问题,跪求大神指点