I'm Electronic Engineer :)

0x00000001 본문

끄적끄적 code

0x00000001

Lu175 2019. 7. 28. 00:54

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
  
}

 

_________________________________________________________________