#define buzzer 2 //定義蜂鳴器腳位
#define reedSwitch 49 //定義門磁開關腳位
#define pb 53 //定義按鈕腳位
#define PIR 51 //定義人體動作感測器腳位
#include <LiquidCrystal_I2C.h> //載入LCD函式庫
LiquidCrystal_I2C LCD(0x27,20,4);
const int cnts=16;
const int LED=3;
#include <Adafruit_NeoPixel.h> //載入LED函式庫
Adafruit_NeoPixel LEDs=Adafruit_NeoPixel(cnts, LED, NEO_RGB+NEO_KHZ800);
String L0="=KTM-666 Smart home=" ; //變數宣告
String L1="=Anti-theft system==" ;
String L2_0="identify fingerprint";
String L2_1="=doors closed" ;
String L2_2="=doors opened" ;
String L3_1="=press the button ";
String L3_2="=identify successful";
String L4="= warning ";
bool sw0=false,sw1=false;
uint32_t redColor = LEDs.Color(0, 255, 0);
uint32_t greenColor = LEDs.Color(255, 0, 0);
int j=0;
int k=0;
int l=0;
int a=0;
void setup() //初始化設定
{
pinMode(buzzer,OUTPUT);
digitalWrite(buzzer,0);
//LCD.begin();
LCD.init();
LCD.backlight();
LCD.home();
LCD.print(L0);
LCD.setCursor(0,1);
LCD.print(L1);
LCD.setCursor(0,2);
LCD.print(L2_1);
LCD.setCursor(0,3);
LCD.print(L3_1);
LEDs.begin();
LEDs.show();
j=0;
k=0;
l=0;
a=0;
for (int i = 0; i < LEDs.numPixels(); i++) //設定LED整環為紅色
{
LEDs.setPixelColor(i, redColor);
}
LEDs.show();
}
void loop()
{
int x=digitalRead(pb); //讀取按鈕與門磁開關狀態
int door=digitalRead(reedSwitch);
if((door||l==1)&&k==0) //判斷是否要啟動蜂鳴器(警報)
{
digitalWrite(buzzer,1); //啟動蜂鳴器
delay(50);
digitalWrite(buzzer,0);
delay(50);
LCD.setCursor(0,2);
LCD.print(L2_2);
LCD.setCursor(0,3);
LCD.print(L4);
l=1;
}
if (k==1) //如果已通過人體感測器
{
door=digitalRead(reedSwitch);
if (door) //無警報開門
{
a=1;
LCD.setCursor(0,2);
LCD.print(L2_2);
}
if (!door&&a==1) //關門後再次啟動門禁系統
{
k=0;
j=0;
a=0;
LCD.setCursor(0,2);
LCD.print(L2_1);
LCD.setCursor(0,3);
LCD.print(L3_1);
}
}
if (!x) //如果按下按鈕
{
while(!x) //持續按著
{
x=digitalRead(pb);
LEDs.setPixelColor(j, greenColor);//LED接續變綠色
LEDs.show();
delay (100);
j++;
if (j==16) //當LED燈全部變綠色
{
LCD.setCursor(0,3);
LCD.print(L2_0);
digitalWrite(buzzer,1); //啟動蜂鳴器代表完成
delay(50);
digitalWrite(buzzer,0);
delay(50);
}
}
}
if (j>16) //當LED燈完整循環
{
for (int i = 0; i < LEDs.numPixels(); i++)
{
LEDs.setPixelColor(i, greenColor);
}
LEDs.show();
int y=digitalRead(PIR); //讀取人體感測器數值
if (y) //當人體感測器啟動時,解除門禁系統
{
LCD.setCursor(0,3);
LCD.print(L3_2);
k=1;
}
}
else //如果LED未完成循環(過程中按鈕放開)
{
for (int i = 0; i < LEDs.numPixels(); i++) //燈的顏色全部回到紅色
{
LEDs.setPixelColor(i, redColor);
}
LEDs.show();
j=0;
}
}