#include <Arduino.h>
//====================
// 하드웨어 설정
//====================
// 핀 설정
const int LIGHT_SENSOR_PIN = 34; // 조도 센서가 연결된 핀
const int RELAY_PIN = 26; // 릴레이 제어 핀
//====================
// 조도 센서 설정
//====================
// 조도 임계값 (환경에 따라 조정 필요)
const long LIGHT_THRESHOLD_ON = 1900; // 이 값보다 어두우면 켜짐
const long LIGHT_THRESHOLD_OFF = 2100; // 이 값보다 밝으면 꺼짐
// 샘플링 설정
const int SAMPLES = 5; // 평균을 위한 샘플 수
const unsigned long INTERVAL_MS = 1000; // 조도 측정 간격 (밀리초)
//====================
// 디버깅 설정
//====================
const unsigned long PRINT_INTERVAL = 5000; // 시리얼 출력 간격 (밀리초)
const long SENSOR_MIN_VALUE = 0; // 센서 최소 유효값
const long SENSOR_MAX_VALUE = 4095; // 센서 최대 유효값
//====================
// 전역 변수
//====================
// 조도값 저장 배열 (long 타입으로 변경)
long lightValues[SAMPLES];
int currentIndex = 0;
// 타이밍 관련 변수
unsigned long previousMillis = 0; // 이전 조도 측정 시간
unsigned long lastPrintTime = 0; // 마지막 시리얼 출력 시간
// 상태 추적 변수
int previousRelayState = LOW; // 이전 릴레이 상태
//====================
// 함수 정의
//====================
// 평균 조도값 계산 함수
long getAverageLightLevel() {
long sum = 0;
for (int i = 0; i < SAMPLES; i++) {
sum += lightValues[i];
}
return sum / SAMPLES;
}
// 센서값 유효성 검사 함수
bool isValidSensorReading(long value) {
return (value >= SENSOR_MIN_VALUE && value <= SENSOR_MAX_VALUE);
}
void setup() {
// 시리얼 통신 초기화
Serial.begin(115200);
Serial.println("System starting...");
// 핀 모드 설정
pinMode(LIGHT_SENSOR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
// 조도 값 배열 초기화
for (int i = 0; i < SAMPLES; i++) {
lightValues[i] = 0;
}
// 릴레이 초기 상태 설정 (안전을 위해 꺼진 상태로 시작)
digitalWrite(RELAY_PIN, LOW);
Serial.println("Initialization complete");
}
void loop() {
unsigned long currentMillis = millis();
// 측정 간격 확인
if (currentMillis - previousMillis >= INTERVAL_MS) {
previousMillis = currentMillis;
// 조도 센서 값 읽기
long lightLevel = analogRead(LIGHT_SENSOR_PIN);
// 센서 값 유효성 검사
if (!isValidSensorReading(lightLevel)) {
Serial.println("Error: Invalid sensor reading detected");
return;
}
// 새로운 값 저장
lightValues[currentIndex] = lightLevel;
currentIndex = (currentIndex + 1) % SAMPLES;
// 평균 조도값 계산
long averageLight = getAverageLightLevel();
// 주기적인 상태 출력
if (currentMillis - lastPrintTime >= PRINT_INTERVAL) {
lastPrintTime = currentMillis;
Serial.print("Current Light Level: ");
Serial.print(lightLevel);
Serial.print(" | Average Light Level: ");
Serial.print(averageLight);
Serial.print(" | Relay State: ");
Serial.println(previousRelayState == HIGH ? "ON" : "OFF");
}
// 릴레이 상태 결정 (히스테리시스 적용)
int relayState;
if (averageLight < LIGHT_THRESHOLD_ON) {
relayState = HIGH; // 어두우면 켜기
} else if (averageLight > LIGHT_THRESHOLD_OFF) {
relayState = LOW; // 밝으면 끄기
} else {
relayState = previousRelayState; // 중간값은 현재 상태 유지
}
// 상태 변경 필요시에만 릴레이 제어
if (relayState != previousRelayState) {
digitalWrite(RELAY_PIN, relayState);
previousRelayState = relayState;
// 상태 변경 로그
Serial.print("Light turned ");
Serial.println(relayState == HIGH ? "ON" : "OFF");
Serial.print("Light level at change: ");
Serial.println(averageLight);
}
}
}
조도감지센서가 어떻게 동작하는지에 대해 단 하나도 이해 못했지만
근이아이님의 코딩이 실제로 어떻게 구현되는지가 궁금해졌음
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.