要做个智能大棚的模型,用的是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; //数据处理
}
}
|