I'm Electronic Engineer :)
0x00000001 본문
https://cafe.naver.com/carroty/329254
를 생각해본 것
_________________________________________________________________
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int REL = 3;
const int POT = A0;
const int PIR = 2;
int val = 0;
// while루프 내에서 사용되는 저항값 변수 초기화
int whileVal = 0;
// 릴레이 상태 변수를 HIGH로 초기화
int relayState = HIGH;
// 시간 변수 초기화
unsigned long PT = 0;
unsigned long CT = 0;
void setup() {
Serial.begin(9600);
pinMode(POT, INPUT);
pinMode(PIR, INPUT);
pinMode(REL, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("HELLO");
delay(3000);
lcd.clear();
// 이전 시간 입력
PT = millis();
}
void loop() {
// 저항값 val 처리 후 Serial과 lcd 출력
val = analogRead(POT);
val = map(val, 0, 1023, 1000, 300);
CT = millis();
Serial.println(CT);
Serial.println(PT);
Serial.println(digitalRead(PIR));
Serial.print("val: ");
Serial.println(val);
lcd.setCursor(0, 0);
lcd.print("TIME : ");
lcd.setCursor(7, 0);
lcd.print(val/100);
delay(100);
lcd.clear();
// 인체 감지센서가 HIGH일때 ////////////////////
if (digitalRead(PIR) == HIGH) {
// 반복하는 while루프
while(true) {
// 시간차 >= n초일때
if (CT - PT >= (val*10)) {
PT = CT;
// 릴레이 HIGH로 두고
relayState = HIGH;
// while루프 탈출
break;
}
// 저항값 whileVal 처리 후 Serial과 lcd 출력
// while루프 내에서도 변하는 Serial과 lcd 출력이 가능하게 함
whileVal = analogRead(POT);
whileVal = map(whileVal, 0, 1023, 1000, 300);
CT = millis();
Serial.println(CT);
Serial.println(PT);
Serial.println(digitalRead(PIR));
Serial.print("val: ");
Serial.println(whileVal);
lcd.setCursor(0, 0);
lcd.print("TIME : ");
lcd.setCursor(7, 0);
lcd.print(whileVal/100);
delay(100);
lcd.clear();
// relay의 상태를 LOW로 바꾼다 //////////
if (relayState == HIGH) {
relayState = LOW;
}
// 이미 LOW이면 while루프 처음으로 간다 //////////
else {
continue;
}
digitalWrite(REL, relayState);
}
}
digitalWrite(REL, relayState); // relayState는 HIGH
}
_________________________________________________________________