/*****************************************/
int led1=22; //客厅灯
int led2=23; //厨房灯
int led3=24; //卫生间灯
int led4=25; //主卧灯
int led5=26; //客房灯
int led[5]={22,23,24,25,26};
int buttonled[5]={27,28,29,30,31};
bool buttonflag[5]={false,false,false,false,false};
int buttonlightcon=32;//光控使能按键
int corridorled=33; //楼道灯
//光采集型号采用A6模拟口
//声控模拟口采用A7模拟口
/*******************此部分为灯光控制部分的引脚定义**********************/
/*****************************************/
//火焰、烟雾采集采用A8模拟口
int kitchenbuzzer=34;
int toiletbuzzer=35;
//防水采集模拟口用A9
/*******************此部分为消防控制部分的引脚定义**********************/
/**********************************************************************/
#include <Keypad.h>
#include <Servo.h> //舵机库
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t colPins[COLS] = { 5, 4, 3, 2 }; // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 }; // Pins connected to R1, R2, R3, R4
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
Servo myservo1; //大门舵机
int doorbutton=36;
int doorbell=37;
int doorswitch=38;
/********************此部分为门禁系统初始定义****************************************/
/******************************************************************/
Servo myservo2;
//雨滴传感器使用A10
int windowswitch=39;
bool windowflag=false;
int winnum=0;
/*******************此部分为消防控制部分的引脚定义**********************/
void setup() {
/******************************************************************/
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);//led控制引脚设置
for(int i;i<=4;i++)
{
pinMode(buttonled[i], INPUT_PULLUP);
} //按键控制引脚设置
pinMode(buttonlightcon, INPUT_PULLUP); //光控使能按键
pinMode(corridorled, OUTPUT);//楼道灯设置
Serial.begin(115200);
/*********************灯光控制的pin口设置***************************/
/***********************************************************/
pinMode(kitchenbuzzer, OUTPUT);
pinMode(toiletbuzzer, OUTPUT);
/*****************消防控制部分引脚设置******************/
/***********************************************************/
myservo1.attach(10);
pinMode(doorbutton, INPUT_PULLUP);
pinMode(doorbell, OUTPUT);
pinMode(doorswitch, INPUT_PULLUP);
/*****************门禁系统引脚设置******************/
/***********************************************************/
myservo2.attach(11);
pinMode(windowswitch, INPUT_PULLUP);
/*****************窗子控制系统引脚设置******************/
}
void loop() {
buttonflagtest();//按键状态检测
buttonconled( );//按键控制led灯
lightconled();
voiceconled();
//*************灯光控制常驻代码
firealarm();
wateralarm();
//******消防控制常驻代码
doorpass();
calldoorbell();
doorbuttoncon();
//门禁系统常驻函数
//keyconwin();
rainconwin();
//窗控制常驻函数
}
/***************************************/
//此部分为灯光控制部分的函数定义
/***************************************/
void ledon(int n)// 参数n为具体控制的灯ledx
{
digitalWrite(n, HIGH);
}
void ledoff(int n)// 参数n为具体控制的灯ledx
{
digitalWrite(n, LOW);
}
void allledon() //该函数打开所有的灯
{
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
}
void allledoff()//该函数关闭所有的灯
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
}
void partledon()//部分灯打开,客厅和厨房
{
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
}
void partledoff()//部分灯关闭,客厅和厨房
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
}
void buttonflagtest()//该函数监控按键是否按下
{
for(int i=0;i<=5;i++)
{
if(digitalRead(buttonled[i])==LOW)
{
buttonflag[i]=!buttonflag[i];
}
}
}
void buttonconled( )
{
for(int i=0;i<=5;i++)
{
if(buttonflag[i]==true)
{
ledon(led[i]);
}
if(buttonflag[i]==false)
{
ledoff(led[i]);
}
}
}
void lightconled() //灯光控制函数
{
int val;
val=analogRead(A6);
if(val>=300 && digitalRead(buttonlightcon)==LOW)
{
partledon();
}
if(val<300 && digitalRead(buttonlightcon)==LOW)
{
partledoff();
}
}
void voiceconled()
{
int val;
val=analogRead(A7);
if(val>=500)
{
digitalWrite(corridorled, HIGH);
}
if(val<500 )
{
digitalWrite(corridorled, LOW);
}
}
/***************************************/
//灯光控制部分的函数定义结束标志
/***************************************/
/***************************************/
//此部分为消防控制部分的函数定义
/***************************************/
void firealarm() //火警函数
{
int val;
val=analogRead(A8);
if(val>=500)
{
tone(kitchenbuzzer,2000);
}
if(val<500 )
{
noTone(kitchenbuzzer);
}
}
void wateralarm() //防水控制
{
int val;
val=analogRead(A9);
if(val>=500)
{
tone(toiletbuzzer,1000);
}
if(val<500 )
{
noTone(toiletbuzzer);
}
}
/***************************************/
//此部分为消防控制部分的函数定义结束标志
/***************************************/
/***************************************/
//此部分为门禁控制部分的函数定义
/***************************************/
void doorpass() {
char key = keypad.getKey();
char key1,key2,key3;
if (key != NO_KEY) {
Serial.println(key);
if(key=='A')
{
Serial.println("请输入密码");
Serial.println("请及时输入第一位密码");
key1=keypad.getKey();
while(key1==NO_KEY)
{
key1=keypad.getKey();
//delay(500);
}
Serial.println(key1);
if(key1=='4' )
{
Serial.println("请及时输入第二位密码");
key2=keypad.getKey();
while(key2==NO_KEY)
{
key2=keypad.getKey();
//delay(500);
}
Serial.println(key2);
if(key2=='4')
{
key3=keypad.getKey();
Serial.println("请及时输入第三位密码");
while(key3==NO_KEY)
{
key3=keypad.getKey();
//delay(500);
}
Serial.println(key3);
if(key3=='5')
{
Serial.println("密码正确");
dooropen();
delay(5000);
doorclose();
}
else
{
Serial.println("密码错误");
}
}
else
{
Serial.println("密码错误");
}
}
else
{
Serial.println("密码错误");
}
}
}
}
void dooropen()//开门
{
myservo1.write(0);
}
void doorclose()//关门
{
myservo1.write(90);
}
void calldoorbell()//按门铃
{
if(digitalRead(doorbutton)==LOW)
{
tone(doorbell,800);
delay(200);
noTone(doorbell);
}
}
void doorbuttoncon() //大门按钮开关
{
if(digitalRead(doorswitch)==LOW)
{
dooropen();
}
if(digitalRead(doorswitch)==HIGH)
{
doorclose();
}
}
/***************************************/
//此部分为门禁控制部分的函数定义结束
/***************************************/
/***************************************/
//此部分为窗控制部分的函数定义结束
/***************************************/
void winopen() //窗打开
{
myservo2.write(0);
}
void winclose() //窗关闭
{
myservo2.write(90);
}
void keyconwin()
{
if(digitalRead(windowswitch)==LOW)
{
winopen();
}
if(digitalRead(windowswitch)==HIGH)
{
winclose();
}
}
void rainconwin()
{
int val;
val=analogRead(A10);
Serial.println(val);
if(val>=500)
{
if(windowflag!=digitalRead(windowswitch))
{
winnum++;
}
if(digitalRead(windowswitch)==HIGH)
{
winclose();
}
if(digitalRead(windowswitch)==LOW)
{
if(winnum>=1)
{
winopen();
}
if(winnum==0)
{
winclose();
}
// winnum++;
}
windowflag=digitalRead(windowswitch);
}
if(val<500)
{
keyconwin();
windowflag=digitalRead(windowswitch);
winnum=0;
}
}
/***************************************/
//此部分为窗控制部分的函数定义结束
/***************************************/