아두이노 기반 사회적 거리두기 알림 시스템: 코로나19 대응
부품 및 소모품
Arduino UNO (Arduino Nano가 더 적합하지만 UNO 사용)× 1
Arduino 프로토 실드 (선택 사항)× 1
Adafruit 미니 브레드보드 × 1
Elegoo 16x2 LCD 디스플레이 × 1
초음파 센서 HC-SR04 × 1
터치 센서 (버튼 대체 가능, 풀다운 저항 필요)× 1
NTC 서미스터 × 1
저항 10kΩ × 1
부저 × 1
로터리 포텐셔미터 (LCD 대비 조절용)× 1
점퍼 와이어 × 1
투명 방수 케이스 (LCD 시인성 및 우천 시 보호용)× 1
앱 및 온라인 서비스
프로젝트 소개
이것은 무엇인가?
코로나19 확산을 늦추는 가장 신뢰할 수 있는 방법은 타인과 거리두기입니다. 예방이 치료보다 낫죠. 하지만 30초마다 뒤돌아보며 누가 다가오는지 확인하는 건 번거롭습니다. 타인에게 2미터 거리를 유지하라고 경고해주는 장치가 있으면 도움이 될 것입니다. 이 프로젝트의 목적입니다. 2-in-1 기능으로, 서미스터는 거리 측정 정확도를 높이는 데 쓰이는 동시에(음속은 온도에 따라 변함), 버튼/터치 센서로 모드를 전환해 두 가지 모드를 제공합니다: 타인 접근 경고 모드(모드 1)와 온도/거리 측정 모드(모드 2). 측정 모드에서는 LCD에 온도와 거리를 표시합니다.
작동 원리
아두이노가 온도 측정 온도를 이용해 거리를 더 정확하게 계산
모드 1(경고 모드)일 때:
거리 2m~1m: LCD 백라이트 점등, "Please keep away"와 거리 표시
거리 1m~50cm: LCD 백라이트 점멸, "Keep away" 표시
거리 50cm 미만: 백라이트 초당 2회 점멸, "STAY AWAY!" 표시
모드 2(측정 모드)일 때: LCD 상단에 거리, 하단에 온도 표시.
빗물로부터 부품을 보호하기 위해 페트병 절반을 잘라 비 올 때 덮을 수 있게 부착했습니다.
두 줄로 배낭 바닥에 부착/탈착 용이.
터치 센서로 모드 전환.
제작 방법
아래 회로도에 따라 부품을 연결하세요.
'코드' 섹션의 라이브러리를 가져오세요. Arduino IDE에서 '스케치' → '라이브러리 포함' → '.ZIP 라이브러리 추가...'로 라이브러리(.zip 파일) 선택. 두 라이브러리 모두 필요.
모든 준비가 끝났으면 아래 코드를 업로드하세요.
코드
메인 코드 Arduino
#include <HCSR04.h>
#include <LiquidCrystal.h>
#define trigPin 7
#define echoPin 6
#define buzzer 9
#define backlight 10
LiquidCrystal lcd(12, 11, 5, 4, 3, 8);
UltraSonicDistanceSensor distanceSensor(trigPin, echoPin);
int tempReading;
double tempK;
float tempC;
int rounded;
int temp_round;
volatile boolean modes = 0;
double distance;
void setup() {
lcd.begin(16, 2);
attachInterrupt(0, changeMode, FALLING);
pinMode(2, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(backlight, OUTPUT);
digitalWrite(backlight, HIGH);
backlightOn();
}
void loop() {
tempReading = analogRead(A0);
tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK)) * tempK);
tempC = tempK - 273.15;
distance = distanceSensor.measureDistanceCm(tempC);
temp_round = round(tempC);
if (modes == 1) { // 측정 모드
backlightOn();
if (distance >= 300 || distance <= 0) {
rounded = 0; lcd.clear(); lcd.print("Out of range"); lcd.setCursor(0, 1); lcd.print("Temperature:" + String(temp_round) + " C");
} else {
rounded = round(distance); lcd.clear(); lcd.print("Distance: "); lcd.print(rounded); lcd.print(" cm"); lcd.setCursor(0, 1); lcd.print("Temperature:" + String(temp_round) + " C");
}
} else { // 경고 모드
if (distance >= 300 || distance <= 0) { rounded = 0; lcd.clear(); backlightOff(); }
else {
rounded = round(distance);
if (distance >= 200) { backlightOff(); lcd.clear(); }
else if (distance <= 200 && distance > 100) { backlightOn(); lcd.clear(); lcd.print("Please keep away"); lcd.setCursor(0, 1); lcd.print("Distance:"); lcd.print(rounded); lcd.print(" cm"); }
else if (distance <= 100 && distance > 50) { backlightOn(); lcd.clear(); lcd.print("Keep away"); lcd.setCursor(0, 1); lcd.print("Distance:"); lcd.print(rounded); lcd.print(" cm"); delay(200); buzz(); backlightOff(); delay(100); unbuzz(); backlightOn(); delay(100); }
else if (distance <= 50) { backlightOn(); lcd.clear(); lcd.print("STAY AWAY!"); lcd.setCursor(0, 1); lcd.print("Distance:"); lcd.print(rounded); lcd.print(" cm"); delay(200); buzz(); backlightOff(); delay(200); unbuzz(); backlightOn(); delay(200); buzz(); backlightOff(); delay(200); unbuzz(); backlightOn(); }
}
}
delay(700);
}
void changeMode() { modes = !modes; }
void backlightOn() { digitalWrite(backlight, HIGH); }
void backlightOff() { digitalWrite(backlight, LOW); }
void buzz() { digitalWrite(buzzer, HIGH); }
void unbuzz() { digitalWrite(buzzer, LOW); }
필요 라이브러리
arduino-lib-hc-sr04-master.zip : https://github.com/Martinsos/arduino-lib-hc-sr04
LiquidCrystal.zip : https://github.com/arduino-libraries/LiquidCrystal