C언어 토이 프로젝트를 구상하던 중, 기록적인 더위가 이어지면서 동료들이 온습도계가 없어도 실시간으로 온습도 정보를 쉽게 확인할 수 있으면 좋겠다는 생각이 들었다. 이에 온습도 정보를 사내 Slack 채널에 자동으로 전송하는 Arduino 온습도 키트를 만들어보기로 했다. 관련된 자료가 많지 않아 직접 방법을 찾아 해결해 나가면서 프로젝트를 완성할 수 있었다.
프로젝트는 Arduino를 이용해 실시간으로 환경 데이터를 측정하고, 시리얼 통신을 통해 컴퓨터로 전송한 후, Python 스크립트를 활용해 Slack Webhook을 통해 데이터를 전달하는 방식으로 진행되었다. 여기서는 Arduino 온습도계를 구축한 상태에서, Python 라이브러리 설치부터 Slack 연동까지의 과정을 단계별로 설명해 보았다.
1. Arduino 온습도계 제작하기
Arduino 에 DHT11 센서를 연결해 온도와 습도를 측정하고, 그 결과를 LCD 디스플레이에 출력하는 키트를 구매하여 조립했다. 이 키트는 LED의 밝기가 온도와 습도 값에 따라 실시간으로 조절되도록 설계되어 있어 변화하는 환경 정보를 시각적으로도 확인할 수 있다.
나는 비교적 저렴한 DHT11 센서를 선택해 연결했는데, 이 센서는 온도를 0°C에서 50°C까지, 습도를 20%에서 80%까지 측정할 수 있다. 반면, DHT22 센서를 사용하면 온도는 -40°C에서 80°C까지, 습도는 0%에서 100%까지 더 넓은 범위를 측정할 수 있으며, 더 높은 정확도와 빠른 데이터 업데이트 속도를 제공한다고 한다. 물론 비싼 제품이 더 좋은 성능을 제공하는 것은 사실이지만, 사용 목적에 따라 적절한 센서를 선택하여 제작하기를 권장한다.

2. Arduino 통합개발환경(IDE) 설치 및 설정하기
- 제작이 완료된 보드와 노트북을 USB 포트로 연결한 후, Arduino 통합개발환경(IDE)을 설치하기 위해 노트북의 웹 브라우저에서 arduino.cc 웹사이트에 접속한다.
- SOFTWARE 메뉴에서 DOWNLOADS를 클릭한 후, 자신의 운영체제(OS)를 선택하여 설치 파일을 다운로드한다.
- 다운로드한 Arduino IDE를 열고, 상단 메뉴에서 [Sketch] -> [Include Library] -> [Manage Libraries]를 클릭한다.
- 제작 환경에 맞는 라이브러리를 검색하여 설치한다.
- 필자는 LCD 디스플레이로 온습도 값을 출력하기 위해 "HD44780" 컨트롤러를 설치하였다.
- 온습도 센서 "DHT11"을 제어하기 위해 "dht" 라이브러리도 설치한다.
3. Arduino 코드 작성하기
- 상단 메뉴에서 [File] -> [New Sketch]를 클릭하여 새로운 스케치 파일을 생성한다.
- Arduino IDE에서 코드를 작성한다
// Arduino 온습도 측정 및 LCD 출력 코드
#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>
#include <DHT.h>
#include <DHT_U.h>
// 핀 설정 및 센서 타입 정의
#define DHTPIN 7
#define DHTTYPE DHT11
// 객체 생성
hd44780_I2Cexp lcd;
DHT dht(DHTPIN, DHTTYPE);
// LED 핀 정의
int ledPin1 = 9, ledPin2 = 10;
void setup() {
// 시리얼 모니터 및 센서, LCD 초기화
Serial.begin(115200);
lcd.begin(16, 2);
dht.begin();
// LED 핀 모드 설정
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop() {
// 온도 및 습도 값 측정
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 센서 오류 처리
if (isnan(humidity) || isnan(temperature)) {
Serial.println("DHT 센서에서 데이터를 읽는 데 실패했습니다!");
return;
}
// 측정된 온도 및 습도 출력
Serial.print("현재 온도: ");
Serial.print(temperature);
Serial.print(" °C, 습도: ");
Serial.print(humidity);
Serial.println(" %");
// LED 밝기 조정 (온도와 습도 값 기반)
int ledValue1 = map(temperature, -10, 50, 0, 255); // 온도 범위
int ledValue2 = map(humidity, 0, 100, 0, 255); // 습도 범위
analogWrite(ledPin1, ledValue1);
analogWrite(ledPin2, ledValue2);
// LCD 출력
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humi: ");
lcd.print(humidity);
lcd.print(" %");
delay(500); // 딜레이 시간
}
- Arduino IDE와 제작한 보드를 연결하기 위해 [Tools] -> [Board] 메뉴에서 연결할 보드를 선택한다.
(필자는 "Arduino Uno"를 사용하였음)
- [Tools] -> [Port] 메뉴에서 포트를 설정해준다.
- [Sketch] -> [Verify/Compile] 메뉴를 클릭하여 코드를 컴파일하고 오류가 없는지 확인한다.
- 컴파일이 완료되면, [Sketch] -> [Upload] 메뉴를 클릭하여 코드를 Arduino 보드에 업로드한다.
- 코드가 정상적으로 업로드되면, LCD 화면에 온습도 정보가 출력된다.
4. Python 라이브러리 설치하기
Arduino 설정을 완료했다면, Python 환경에서 Arduino와의 통신을 위해 필요한 라이브러리들을 설치해야 한다.
Windows 노트북에 이미 Python이 설치된 환경에서, 다음과 같이 pyserial과 requests 라이브러리를 설치한다. (필자는 Python v3.12.4 버전을 사용하였다.)
pip install pyserial requests
참고로, pyserial은 Python에서 시리얼 포트를 통해 데이터를 주고받을 수 있도록 도와주는 라이브러리이다. 이를 통해 컴퓨터와 Arduino가 시리얼 통신을 통해 데이터를 주고받을 수 있게 된다. requests는 HTTP 요청을 처리하기 위한 라이브러리로, Slack webhook을 통해 데이터를 전송하는 데 사용될 것이다.
5. 수신 웹후크 연동하기
수신 웹후크(Incoming Webhook)는 Slack에서 외부 애플리케이션이나 서비스가 특정 URL로 HTTP POST 요청을 통해 데이터를 전송할 수 있게 해주는 기능이다. 이 프로젝트에서는 USB 포트로 연결된 Arduino 온습도계의 정보를 Python 스크립트를 사용하여 수신 웹후크를 통해 Slack 메신저로 전송하는 방법을 설명한다.
- 웹후크를 생성하려면 다음 단계를 따라 진행한다.
- Slack 상단바에서 [파일] 메뉴를 클릭한다.
- [설정 및 관리]를 선택한 후, [앱 관리]로 이동한다.
- 앱 관리 페이지로 이동하면, 자동으로 Slack 홈페이지로 연결된다. 여기서 수신 웹후크(Incoming Webhook)를 선택한 후 추가 버튼을 클릭하여 새 웹후크를 생성한다.
- 웹후크가 생성되면, 데이터 전송에 필요한 Webhook URL이 제공된다. 이 URL은 Python 스크립트를 통해 Arduino에서 수집한 데이터를 Slack으로 전송할 때 사용되므로, 별도로 복사해 둔다.
6. Python 스크립트 작성하기
Slack으로 데이터를 전송하는 Python 코드를 작성한 후, 파일 이름을 'send_to_slack.py'로 저장한다. 이 코드는 Arduino에서 수집한 온습도 정보를 Slack Webhook URL을 통해 Slack 채널로 전송하는 역할을 한다.
코드 작성 당시, Slack으로 메시지가 전송되지 않는 문제가 발생하여, 원인을 파악하기 위해 디버깅 코드를 포함시켰다. 이를 통해 전송 성공 여부를 쉽게 확인할 수 있도록 설계하였고, 문제 해결에 도움이 되도록 하였다.
import serial
import requests
ser = serial.Serial('COM3', 9600)
slack_webhook_url = 'Slack_WEBHOOK_URL_Address'
def send_to_slack(message):
payload = {
'text': message
}
try:
response = requests.post(slack_webhook_url, json=payload)
response.raise_for_status()
print("Message sent to Slack successfully.")
except requests.exceptions.RequestException as e:
print(f"Error sending message to Slack: {e}")
if response is not None:
print(f"Response content: {response.content}")
def read_and_send():
temperature = None
humidity = None
while True:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8', errors='ignore').rstrip()
print(line)
if "온도" in line:
try:
temperature = float(line.split(":")[1].strip())
except ValueError:
print("Failed to parse temperature")
if "습도" in line:
try:
humidity = float(line.split(":")[1].strip())
except ValueError:
print("Failed to parse humidity")
if temperature is not None and humidity is not None:
message = f"온도: {temperature} °C\n습도: {humidity} %"
print("Sending to Slack:", message)
send_to_slack(message)
break
read_and_send()
7. Python 스크립트 실행 및 결과 확인하기
- 먼저, 현재 설치된 Python 버전을 확인한다.
python --version
- 이후, CMD(명령 프롬프트) 또는 터미널을 열고, 작성한 Python 스크립트가 저장된 경로로 이동한 후 스크립트를 실행한다.
python3 send_to_slack.py
- Arduino에서 온습도 값을 0.5.초마다 새로 측정하도록 설정해두었기 때문에 Python 스크립트를 성공적으로 실행하면, 실시간 온습도 정보가 설정한 Slack 채널에 메시지 형태로 전송되는 것을 확인할 수 있다.
#Arduino
delay(500); //0.5초 마다 온습도 정보가 갱신되도록 설정
8. 앱 관리하기
- 추후 Slack 앱 설정을 수정하거나 웹후크를 삭제하려면, Slack 앱 관리 페이지에서 해당 앱을 찾아 관리할수 있다.
- 웹후크 설정을 편집 또는 삭제를 원할 경우 [사용자 지정 통합 앱] > [수신 웹후크] > [구성] 메뉴를 클릭하여 편집한다.
이번 프로젝트를 통해 온습도 센서로 데이터를 실시간으로 수집하고, 이를 네트워크를 통해 외부 서비스로 전송하는 구조를 이해하는 데 큰 도움이 되었다. 프로젝트의 핵심은 데이터 수집, 전송, 처리 과정으로, Arduino에서 수집한 온습도 데이터를 시리얼 통신으로 컴퓨터에 전송한 뒤, Python으로 이 데이터를 Slack 수신 웹후크를 통해 전달하는 방식으로 구현하였다.
이러한 시스템은 다양한 방식으로 활용될 수 있다. 예를 들어, 서버실 관리 시 매우 유용할 수 있다. 서버실의 적절한 온도와 습도는 서버의 안정적인 운영과 수명 연장에 중요한 요소이기 때문이다. 일반적으로 서버실의 적정 온도는 20°C ~ 24°C, 습도는 40% ~ 60% 범위에서 유지되는 것이 이상적이다. 이를 실시간으로 모니터링하여 이상 발생 시 즉각 대응할 수 있다.
또한, 이 시스템은 사무실 내 식물 관리에도 적용될 수 있다. 식물은 종류에 따라 적정 온도와 습도가 다르므로, 센서를 통해 환경 변화를 실시간으로 모니터링하고 관리할 수 있다. 이러한 자동화된 환경 모니터링 시스템은 특히 유지 관리가 어려운 환경에서 매우 효율적인 도구가 될 것이다.
'토이 프로젝트' 카테고리의 다른 글
토이 프로젝트 _ Unity 캐릭터로 데스크톱 다마고치 만들기 (0) | 2024.09.21 |
---|---|
교보문고 책 판매 순위 웹 스크래핑하기 (0) | 2024.08.18 |