IoT 스마트 가로등: 지능형 에너지 절약 LED 시스템
부품 및 소모품
| 부품 |
수량 |
| 아두이노 우노 와이파이 Rev.2 |
1 |
| LED (일반) |
1 |
| LDR 조도 센서 (1MΩ) |
1 |
| IR 근접 센서 (Digilent) |
1 |
| ESP8266 ESP-12E |
1 |
| 1kΩ 저항 |
1 |
필요 도구
소프트웨어 및 서비스
프로젝트 배경
문제 정의
도시 가로등은 막대한 전력 비용을 차지합니다. 기존 나트륨 증기등은 전력 소모가 크고, 수동으로 저녁에 켜고 아침에 끄는 방식이라 켜진 시간 동안 에너지가 낭비됩니다. 인력도 많이 필요합니다.
기존 시스템 단점
- 수동 점등/소등
- 과도한 에너지 소비
- 높은 운영 비용
- 많은 인력 필요
제안 시스템 장점
- 자동 점등/소등
- 유지보수 비용 절감
- CO₂ 배출 감소
- 빛 공해 감소
- 무선 통신 지원
- 에너지 절약
- 인력 절감
핵심 구성 요소 설명
A. LDR 조도 센서 입력
광의존 저항(LDR)은 포토레지스터라고도 하며, 전자기 복사에 따라 저항값이 변하는 소자입니다. 인간 눈과 유사하게 빛에 민감합니다. 빛이 비치면 저항이 낮아져 전류가 흐르고, 프리셋 저항으로 감도 조절 가능. 아두이노에 아날로그 값 전달.
B. IR 근접 센서
적외선 방출/감지로 주변 물체 감지, 열 측정, 모션 감지 가능. 가시광선보다 파장이 긴 적외선(0.75~1000µm) 사용. IR 빛을 전류로 변환해 전압/전류 검출기로 감지. 아두이노에 디지털 신호 전달.
C. LED 조명
순방향 전압 인가 시 전자-정공 재결합으로 광자(빛) 방출. 주변 조도에 따라 밝기 자동 조절: 외부 조도 낮으면 최대 밝기, 높으면 낮춤.
D. ESP8266 와이파이 모듈
Espressif Systems의 Wi-Fi 내장 SoC 모듈로 IoT 임베디드 개발에 널리 사용. 주요 특징:
- 2.4GHz Wi-Fi (802.11 b/g/n, WPA/WPA2)
- 16개 GPIO, I²C, SPI, UART, I²S, PWM 지원
- 10비트 ADC, 32비트 RISC CPU (80~160MHz)
- 64KB 부트 ROM, 64KB 명령어 RAM, 96KB 데이터 RAM
- 외부 플래시 메모리 SPI 접근
AT 명령어로 제어, UART 통신. ESP-01(8핀, 2GPIO), ESP-02/03/04 등 다양한 모듈 존재.
ESP8266-01 핀 설명
- 3V3: 3.3V 전원
- GND: 그라운드
- RST: 액티브 로우 리셋
- EN: 액티브 하이 인에이블
- TX: UART 송신
- RX: UART 수신
소스 코드
메인 제어 코드 (아두이노 우노 와이파이)
int smooth; int LDR; int threshold = 40; // 태양광 임계값
int brightness = 0; int ledState = 0;
int sensor1 = 11; int sensor2 = 8; int sensor3 = 9;
int led1 = 5; int led = 6; int led2 = 2;
int carPresent = 0; int carPresent1 = 0;
float beta = 0.65; // 스무딩 계수
void setup() {
Serial.begin(115200);
pinMode(sensor1, INPUT); pinMode(sensor2, INPUT); pinMode(sensor3, INPUT);
pinMode(led, OUTPUT); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT);
}
void loop() {
// LDR 값 스무딩 (지수 이동 평균)
smooth = smooth - (beta * (smooth - analogRead(A0)));
delay(1);
LDR = round(((float)smooth / 1023) * 100); // 0~100% 변환
// 조도에 따른 밝기 결정
if (LDR <= 40) brightness = 0;
else brightness = map(LDR, 40, 100, 0, 255);
checkSensors(); // 차량 감지 로직
if (carPresent == 1) { // 1번 센서 구간 차량 있음
ledState = 1;
digitalWrite(led, HIGH); digitalWrite(led1, HIGH);
analogWrite(led, brightness); analogWrite(led1, brightness);
} else if (carPresent == 0) { // 1번 구간 차량 없음
ledState = 0;
digitalWrite(led, HIGH);
analogWrite(led, ledState);
if (carPresent1 == 1) { // 2번 구간 차량 있음
ledState = 1;
if (ledState == 1) {
analogWrite(led1, brightness); analogWrite(led2, brightness);
}
} else { // 2번 구간도 차량 없음
ledState = 0;
digitalWrite(led1, HIGH); digitalWrite(led2, HIGH);
analogWrite(led1, ledState); analogWrite(led2, ledState);
}
}
// ThingSpeak 전송용 데이터 포맷
String data = (String)ledState + "," + (String)brightness + ";";
Serial.print(data);
delay(100);
}
void checkSensors() {
// 3개 IR 센서로 차량 위치 추적 (앞차/뒷차 구분)
if (digitalRead(sensor1) == 0) { // 1번 센서 감지
if (digitalRead(sensor2) == 1) carPresent = 1; // 2번 센서 아직 미도착
} else if (digitalRead(sensor2) == 0) { // 2번 센서 감지
if (digitalRead(sensor1) == 1) { carPresent = 0; carPresent1 = 1; } // 앞차 통과
else { // 앞차 바로 뒤에 뒷차 있음
analogWrite(led, brightness); analogWrite(led1, brightness); analogWrite(led2, brightness);
digitalWrite(led, HIGH); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH);
}
} else if (digitalRead(sensor3) == 0) { // 3번 센서 감지
if (digitalRead(sensor2) == 1) { carPresent = 0; carPresent1 = 0; } // 모든 차 통과
else { carPresent = 0; carPresent1 = 1; } // 2번 구간 아직 차 있음
}
}
ESP8266 ThingSpeak 업로드 코드
#include
const char* ssid = "ardent";
const char* password = "12345678";
String ledState = ""; String brightness = "";
char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "NUEBLW9OA58DLL4N"; // 본인 채널 쓰기 키로 변경
WiFiClient client;
void setup() {
Serial.begin(115200);
connectWifi();
}
void loop() {
filterData();
HTTPPost();
delay(15000); // ThingSpeak 업로드 간격 (최소 15초)
}
int connectWifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(2500);
}
void HTTPPost() {
if (client.connect(thingSpeakAddress, 80)) {
String PostData = "api_key=" + writeAPIKey;
PostData += "&field1=" + ledState;
PostData += "&field2=" + brightness;
client.println("POST /update HTTP/1.1");
client.println("Host: api.thingspeak.com");
client.println("Connection: close");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Content-Length: " + String(PostData.length()));
client.println();
client.println(PostData);
client.stop();
}
}
void filterData() {
if (Serial.available()) {
String buffer = Serial.readStringUntil(';');
int i1 = buffer.indexOf(',');
ledState = buffer.substring(0, i1);
brightness = buffer.substring(i1 + 1);
}
}
회로도
브레드보드 회로도 이미지 제공.