BASIC4MCU | 질문게시판 | 답변 : 레오나르도 인체감지센서 알림 안옴
페이지 정보
작성자 master 작성일2022-07-25 12:48 조회4,295회 댓글0건본문
//
#include "Adafruit_VL53L0X.h"
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include "Arduino.h"
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include <Wire.h>
#include <VL53L0X.h>
SoftwareSerial MP3Module(8, 9); // tx, rx
DFRobotDFPlayerMini myDFPlayer;
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
//Adafruit_VL53L0X lox = Adafruit_VL53L0X();
#include <Keypad.h>
#include <Servo.h>
Servo myservo;
VL53L0X d;
//
const int sensor = A0;
#define Sensing_pin A2 // 센서 신호선 핀 설정입니다.
#define UVC A3 // UVC 핀 설정입니다.
//
float Distance = 0;
float temperature = 0;
int value = 0; // 각도를 조절할 변수 value
int state; // 0의 신호가 출력되면 close, 1의 신호가 출력되면 open 되는 스위치 입니다.
char PW[]={"2222"}; //비밀번호
String str_data="";
const byte ROWS=4;
const byte COLS=3;
byte rowPins[ROWS]={11,4,5,7};
byte colPins[COLS]={10,12,6};
char keys[ROWS][COLS]={
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
//int num=10000;
int b=0;
int tru=0;
int count=0,count1=0;
int led_cnt=0;
int timer = 2000;
Keypad keypad=Keypad( makeKeymap(keys),rowPins,colPins,ROWS,COLS );
//
void setup() {
Serial.begin(9600);
Wire.begin();
d.setTimeout(500);
if (!d.init()){ Serial.println("Failed to detect and initialize sensor!"); while(1){} }
#if defined LONG_RANGE
// lower the return signal rate limit (default is 0.25 MCPS)
d.setSignalRateLimit(0.1);
// increase laser pulse periods (defaults are 14 and 10 PCLKs)
d.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
d.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif
#if defined HIGH_SPEED
// reduce timing budget to 20 ms (default is about 33 ms)
d.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
// increase timing budget to 200 ms
d.setMeasurementTimingBudget(200000);
#endif
pinMode (sensor, INPUT_PULLUP); //센서 핀을 입력핀으로 지정합니다.
myservo.attach(A1); // A1번핀에 서보모터 연결
Serial1.begin(9600); // 9600 속도로 블루투스시리얼(소프트웨어시리얼)통신을 시작한다
digitalWrite(A3,1); // UVC ON
mlx.begin();
MP3Module.begin(9600);
if (!myDFPlayer.begin(MP3Module)) { while (true); }
delay(1);
myDFPlayer.volume(10); // 볼륨을 조절합니다. 0~30까지 설정이 가능합니다.
// wait until serial port opens for native USB devices
// power
}
//
void loop() {
if(digitalRead(Sensing_pin)==HIGH){
if(timer>=2000){ timer=0;
//if(digitalRead(Sensing_pin)==HIGH){
Serial1.println("블루투스감지됨"); // 움직임이 감지됐어요!
Serial.println("감지되었습니다");
digitalWrite(A3,0); //UVC OFF
}
}
timer++;
//-------------------
if(Serial1.available()){
str_data=getStringdata();
Serial.println(str_data);
if(str_data==PW){ myservo.write(180); Serial.println("open "); Serial1.print('o'); delay(15); }
else { myservo.write( 0); Serial.println("close"); Serial1.print('x'); }
}
//-------------------
char key=keypad.getKey(); // 키패드 입력받는 부분
if(key == '#'){
Serial.println(key);
while(1){
key = 0;
char key=keypad.getKey(); // 키패드 입력받는 부분
if(key){
Serial.println(key);
if(key==PW[count]){ tru++; } //입력번호와 비밀번호가 맞을시 tru++
Serial.print("tru : "); Serial.println(tru);
count++;
key = 0;
}
if(count == 4 || tru == 4 ){ break; }
}
}
if(count==4){ //count개수가 비밀번호 개수와 같을 시
if(tru==4)Su();//성공함수
else Fa();//실패함수
tru=0; count=0;
}
//-------------------
//Serial.print(d.readRangeSingleMillimeters());
//if (d.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
Distance = d.readRangeSingleMillimeters();
if(Distance < 30 ){
Serial.println(Distance);
temperature = mlx.readObjectTempC();
//temperature = temperature - 8;
Serial.print(temperature); Serial.println("C");
//delay(1000);
if ( temperature >= 36.5 ) {//temperature
myDFPlayer.play(1); //Play 1 mp3
delay(20);
}
}
//-------------------
state = digitalRead(sensor); //센서핀을 디지털 입력신호로 받습니다.
/*
if (state == HIGH){ //만약 State 신호가 HIGH일시
delay(1000); myDFPlayer.play(3);
delay(1000); myDFPlayer.pause();
}
else if (state == LOW){
value = 0;
myservo.write(0);
digitalWrite(A3,1); // UVC ON
delay(500);
myDFPlayer.pause();
}
*/
//-------------------
delay(10);
}
//
String getStringdata(){
String str="";
while(Serial1.available()){
str +=(char)Serial1.read();
delay(5);
}
return str;
}
//
void Su(){ myservo.write(180); Serial.println("open the door "); }
//
void Fa(){ myservo.write( 0); Serial.println("close the door"); }
인체감지센서에서 알림이 한번만 오고
다음에 인체감지센서에 손을 대도 알림이 오지않습니다
코드상 20초에 한번씩 시리얼모니터에 알림이 올 것 같습니다.
ㅇ60초에 한번씩 인체감지 알람을 출력하고싶습니다ㅇ
또한 인체감지센서가 감지되면 led도 꺼지는데
다시 켜지지 않습니다
else if (state == LOW){
value = 0;
myservo.write(0);
digitalWrite(A3,1); // UVC ON
delay(500);
myDFPlayer.pause();
}
*/
커지는 부분은 주석처리 되어 있습니다.
댓글 0
조회수 4,295등록된 댓글이 없습니다.