아시아에서는 더운 날씨와 2003년 사스(SARS) 사태로 인해 초중고생이 매 분기마다 체온 측정을 실시해 학생 건강을 확인합니다. 체온 측정 기간에는 학생 각자 디지털 체온계를 지참해야 합니다. 하지만 체온계를 분실/파손하거나 깜빡해 참여 못 하는 학생이 있습니다. 개인 위생상 체온계 공유는 금지되며, 새 체온계 살 돈이 없는 학생도 있습니다. 이로 인해 체온 측정 실시율에 영향을 줍니다. 측정 후 교직원이 모든 학생 체온 데이터와 인적 사항을 수동으로 데이터베이스에 입력해야 하는데, 담임교사 한 명이 약 40명 분을 입력하느라 매우 번거롭고 시간 많이 걸립니다.
해결책은?
프로젝트 테마는 SqwidNet의 Social Impact, 지속가능개발목표(SDG)의 '좋은 건강과 웰빙' 영역입니다. 우리 시스템은 유효 사용자의 체온을 자동 측정해 모니터링하고, 임계값 초과 시 알림을 보냅니다.
작동 원리: 라즈베리파이 & 아두이노
라즈베리파이에 파이썬 프로그램과 MySQL 데이터베이스가 있습니다.
파이썬 프로그램 실행 시 데이터베이스 존재 여부 확인 후 자동 생성, 테이블도 필요 시 자동 생성돼 교직원 수작업을 줄여줍니다.
데이터베이스 쿼리 연결을 맺고 아두이노가 시리얼 통신으로 정보를 보내길 대기합니다.
아두이노에 RFID 카드 태그하면 카드 정보를 아두이노에 저장한 뒤 시리얼로 라즈베리파이에 전송. 라즈베리파이가 DB에서 유효 사용자인지 확인 후 유효하면 아두이노에 확인 신호 보내고 아두이노 LCD에 "Welcome, 이름" 표시. 유효하지 않으면 "Error! Invalid User!" 표시.
유효 사용자 태그 후 아두이노가 체온 측정 안내. 거리 센서로 사용자 준비 감지 시 체온 측정해 LCD에 표시. 유효 온도 범위(28~42℃)면 라즈베리파이(MySQL)와 시그폭스(ThingSpeak)에 동시 저장. MySQL에는 사용자 ID, 날짜, 타임스탬프, 체온 저장.
라즈베리파이는 아두이노에서 온도 데이터 수신 시 제대로 전달됐는지 지속 확인 후 진행합니다. 아두이노와 파이썬 코드 실행 타이밍이 달라 한 번만 체크하면 데이터가 아직 안 왔을 수 있기 때문입니다.
참고: 라즈베리파이 파이썬 코드와 아두이노 코드 모두 핸드셰이킹(Handshaking) 동기화 방식을 사용합니다. 라즈베리파이가 다음 데이터 받을 준비 안 되면 아두이노가 카드 태그를 허용 안 하고, 그 반대도 마찬가지입니다.
간단한 구현: 상대방이 "RECEIVED" 신호 보낼 때까지 "READY" 신호 계속 전송해 서로 준비됐음을 확인.
// 아두이노 측
boolean readySignal = Serial.readString() == "READY";
if (readySignal) {
tapped = true;
Serial.println("RECEIVED");
}
// 파이썬 측
while (readySignal == True) {
ser.write(b'' + "READY");
receivedSignal = ser.readline().strip() == "RECEIVED";
if (receivedSignal == True) { readySignal = False; }
}
쿼리 작업 끝나면 매번 연결 닫아 메모리 누수 방지 및 좋은 습관 유지.
작동 원리: 시그폭스 (SiPy)
아두이노에서 온도 데이터 수신 후 SiPy가 사용자 ID, 온도 정수부, 소수부로 분리. 모든 데이터를 바이트로 시그폭스 백엔드에 전송(유비닷츠와 ThingSpeak 모두에 전송 가능). 전송 데이터 예시:
시그폭스 백엔드에서 이 데이터를 디코딩해 ThingSpeak로 전송. 백엔드 설정 방법:
시그폭스 백엔드 > Device Type > Device Name > CALLBACKS에서 커스텀 페이로드를 정확히 일치시켜야 함(SiPy 코드 변경하지 않는 한). 커스텀 페이로드 첫 번째 값이 사용자 ID가 되므로 순서 중요. Body에 Write API Key를 위에 두고, 필드에 커스텀 데이터 매핑.
작동 원리: 클라우드
데이터가 ThingSpeak에 도달하면 첫 번째 프라이빗 채널에서 MATLAB Analysis 스크립트가 데이터를 분석해 정수부와 소수부를 합쳐 하나의 온도 값으로 만듭니다.
테이블 코드는 오픈소스 프로젝트에서 가져와 수정했습니다. 새 데이터 들어올 때마다 자동 업데이트돼 분석에 유용합니다.
동시에 발열 온도(38℃ 이상)인지 체크해 넘으면 이메일로 교직원/교사에게 알림.
요약: 첫 채널(정수/소수 분리)은 백엔드용, 두 번째 채널(결합된 온도+사용자 ID)은 관리자용 보기 채널로 엑셀 스타일 테이블 제공.
설치는 직관적: 이미지 파일을 SD카드에 플래싱(쓰기) 후 라즈베리파이 3에 꽂기. 단계별 튜토리얼 원하면 balenaEtcher 소프트웨어로 라즈비안 이미지(데스크톱 및 추천 소프트웨어 포함 버전 권장) 플래싱.
HDMI로 모니터 연결해 초기 설정. Preferences → Raspberry Pi Configuration에서 SSH, VNC 등 인터페이스 활성화(이더넷/와이파이로 원격 접속 가능).
(선택) 터미널에서 dhcpcd.conf 편집(sudo nano /etc/dhcpcd.conf)해 고정 IP 설정:
interface eth0
static ip_address=192.168.0.11/24
이더넷 케이블로 항상 같은 주소(192.168.0.11)로 접속 가능. 와이파이 연결 시 wlan0 IP로도 어디서든 접속 가능(같은 와이파이망). 우상단 와이파이 아이콘 마우스 오버로 wlan0 IP 확인.
3. MySQL 데이터베이스 설정
약간 까다로울 수 있으니 주의 깊게 따라하세요. 특히 MySQL root 사용자 설정 부분은 실수 바로잡기 어렵습니다.
시스템 업데이트: sudo apt update && sudo apt upgrade
Apache2 설치: sudo apt install apache2 (웹 서버용)
PHP 설치: sudo apt install php php-mbstring
브라우저에서 라즈베리파이 IP 또는 localhost 접속해 Apache 인덱스 페이지 확인
데이터베이스 설치: sudo apt install mariadb-server php-mysql
중요: MySQL root 사용자 생성:
sudo mysql --user=root
DROP USER 'root'@'localhost';
CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;
root 로그인 테스트: mysql --user=root --password=yourmysqlpassword
Receive a web request 선택 → 이벤트 이름 입력(예: fever) → Create trigger.
That 클릭 → email 검색/선택 → Send me an email 선택.
메시지 정보 입력. 이벤트 트리거 데이터는 Ingredients로 전달. 예: {{EventName}}로 이벤트 이름 포함. Body에 최소 {{Value1}}, {{Value2}} 포함 필수. Create action으로 앱릿 완성. Value1,2,3은 MATLAB Analysis에서 파생되며 필요에 따라 수정 가능.
ThingSpeak는 쉽게 설정/학습 가능한 오픈소스 IoT 플랫폼.
채널 2개 생성: (SIGFOX) TEMPERATURE PRIVATE VIEWING, (SIGFOX) TEMPERATURE PUBLIC VIEWING.
프라이빗 채널: 시그폭스 백엔드에서 바이트로 데이터 수신(유비닷츠가 문자열 디코딩 잘 안돼 바이트 사용). 정수부/소수부 분리 전송. 이 채널은 지저분한 값 보관용.
퍼블릭 채널: MATLAB Analysis로 두 값을 합쳐 하나의 온도 값으로 변환해 전송. 사용자 ID도 전송. MATLAB 스크립트는 ThingSpeak REACT로 데이터 삽입 시 트리거.
REACT 설정: Apps → React → New React. 조건 유형: String, 테스트 빈도: On Data Insertion, 조건: 프라이빗 채널 Field 3(사용자 ID) ≠ 0, 액션: MATLAB Analysis(온도 계산 코드), 옵션: Run action only the first time condition is met.
테이블 플러그인은 프라이빗 뷰에서만 보임(관리자용이므로 문제 없음).
Webhooks 정보: 프로필 로고 → My Services → Webhooks → Documentation(우상단) → 키와 요청 포맷 확인. 이벤트 이름은 fever.