CoroFence 열화상 감지기: Panasonic Grid-EYE & PIR 센서 IoT 연동
부품 및 소모품
| 부품 |
수량 |
비고 |
| Panasonic Grid-EYE (AMG8833 등 8x8 열화상 센서) |
1 |
I2C 인터페이스, 60° 시야각, -20~100°C 측정 |
| PIR 센서 (7m 감지) |
1 |
모션 트리거용 |
| 부저 |
1 |
고온 경보음 |
| RGB LED |
1 |
온도별 색상 표시 |
| Arduino Nano 33 IoT |
1 |
WiFi/BLE 내장, 3.3V 로직 |
| 리튬 이온 배터리 3.7V (충전식) |
1 |
휴대용 전원 |
| 플라스틱 인클로저 (정션 박스) |
1 |
실외 설치용 |
앱 및 온라인 서비스
- Arduino IDE
- DasData Maker Data Storage Channel (데이터 스트리밍/시각화)
프로젝트 소개
배경: 팬데믹 시대의 비접촉 발열 감시
WHO 권장 사항(손 씻기, 마스크, 거리두기) 외에 공항 등에서 열화상 카메라로 발열자 선별이 일상화되었습니다. 집/사무실/연구실 출입구에 저비용 열화상 감지기를 직접 만들어 안전 구역을 지키고자 했습니다.
입력 센서
Panasonic Grid-EYE (AMG8833)
- MEMS 기술 기반 비접촉 열전파일 어레이 센서
- 8×8 = 64픽셀로 영역 전체 온도 측정
- I2C 통신, 1/10 fps, 인터럽트 기능 지원
- 크기 11.6×4.3×8.0mm, 동작 전압 3.3V/5V
- 측정 범위 -20°C~100°C, 시야각 60°
- 1.5m 거리에서 인체 감지, 5~7m에서 타겟 식별 가능
PIR 센서
약 10m(5~12m) 범위 내 인체 움직임 감지. Grid-EYE 측정 트리거로 사용하여 상시 전력 소모 줄임.
출력 장치
- RGB LED: 온도 구간에 따른 색상 표시 (파랑: 저온 → 녹색: 정상 → 노랑/마젠타/빨강: 고온)
- 부저: 37°C 초과 시 1kHz 경보음
온도-색상 매핑 (코드 기준)
if (tempC < 16) setColor(0, 0, 255); // 파랑
else if (tempC < 20) setColor(80, 0, 80); // 시안
else if (tempC < 24) setColor(0, 255, 255); // 아쿠아
else if (tempC < 28) setColor(0, 255, 0); // 녹색
else if (tempC < 37) setColor(255, 255, 0); // 노랑
else if (tempC < 38) setColor(255, 20, 20); // 마젠타
else setColor(255, 0, 0); // 빨강 + 부저
테스트 결과
- 정상 체온 시 녹색 LED 점등
- 다리미 증기(약 100°C)로 고온 테스트 시 빨강 LED + 부저 경보 정상 작동 확인
- DasData 플랫폼으로 실시간 데이터 스트리밍 및 Node.js 터미널 시각화 가능
소스 코드
#include
#include
GridEYE grideye;
String heatData;
int ledState;
unsigned long meetime;
uint16_t seconds = 3142;
int bluePin = 8, greenPin = 9, redPin = 10, buzzPin = 11;
int inputPin = 12; // PIR 센서
int pirState = LOW;
int val = 0;
float tempC;
void setup() {
pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT); pinMode(buzzPin, OUTPUT);
pinMode(inputPin, INPUT);
Wire.begin();
grideye.begin();
Serial.begin(115200);
}
void loop() {
// 시리얼 명령으로 LED 제어 가능 ('1': 켬, 그 외: 끔)
if (Serial.available() > 0) {
char c = Serial.read();
ledState = (c == '1') ? 1 : 0;
}
val = digitalRead(inputPin);
if (val == HIGH) { // 모션 감지
if (pirState == LOW) {
meetime = millis();
Serial.println("Motion detected!");
pirState = HIGH;
getHeatmap();
// 온도에 따른 LED 색상 변경
if (tempC < 16) setColor(0, 0, 255);
else if (tempC < 16) setColor(80, 0, 80); // 버그: 중복 조건
else if (tempC < 20) setColor(0, 255, 255);
else if (tempC < 24) setColor(0, 255, 0);
else if (tempC < 28) setColor(255, 255, 0);
else if (tempC < 37) setColor(255, 20, 20);
Serial.println(heatData);
delay(1500);
}
} else { // 모션 끝
if (pirState == HIGH) {
noTone(buzzPin);
Serial.println("Motion ended!");
setColor(0, 0, 0);
meetime = 0;
pirState = LOW;
}
}
}
void getHeatmap() {
heatData = "";
float previousVal = 0;
for (unsigned char i = 0; i < 64; i++) {
if (previousVal > 37) {
Serial.println("High temperature!");
setColor(255, 0, 0);
tone(buzzPin, 1000);
}
tempC = grideye.getPixelTemperature(i);
heatData += String(tempC) + ",";
previousVal = tempC;
}
Serial.println();
}
void setColor(int red, int green, int blue) {
#ifdef COMMON_ANODE
red = 255 - red; green = 255 - green; blue = 255 - blue;
#endif
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
회로도
배선도 이미지 제공: Grid-EYE I2C(SDA/SCL) → A4/A5, PIR → D12, RGB LED → D8/D9/D10 (PWM), 부저 → D11, 배터리 → VIN/GND.
향후 계획
- DasData 플랫폼과 완전 연동으로 클라우드 모니터링
- 머신러닝 모델로 발열 패턴 분석 고도화
- 다중 센서 노드 메쉬 네트워크 구성
- 실시간 웹 대시보드 구축
참고
GitHub: https://github.com/dasdata/coronafence (Arduino IDE, Visual Studio 2019, Node.js 코드 포함)