아두이노 메가 2560과 DHT22, SIM800L로 만드는 SMS 원격 온도 조회 시스템
부품 및 소모품
부품
수량
비고
아두이노 메가 2560 (Arduino Mega 2560)
1
하드웨어 시리얼 포트 다수 보유 (Serial1~3)
DHT22 온습도 센서
1
AM2302 호환
SIM800L GSM/GPRS 모듈
1
별도 3.7-4.2V 전원 필요
10k옴 저항
1
DHT22 데이터 라인 풀업용
브레드보드
1
점퍼 와이어
1세트
프로젝트 소개
안녕하세요. 이 프로젝트는 더 큰 프로젝트의 일부입니다. 이 부분에서 많은 문제를 겪고 결국 해결책을 찾아 커뮤니티와 공유하고자 합니다. 비슷한 문제로 고생하는 분들께 도움이 되길 바랍니다.
프로젝트 설명
아두이노로 SMS를 보내면 집 안의 온도를 문자메시지로 회신받는 시스템입니다.
소프트웨어 및 라이브러리 수정
SIM800L 모듈용으로 Seeeduino_GPRS 라이브러리 사용. 아두이노 메가에서 작동하려면 라이브러리 내 핀 정의를 수정해야 합니다:
// sim800.h 원본
#define SIM800_TX_PIN 8
#define SIM800_RX_PIN 7
// 메가용으로 변경 (SoftwareSerial 대신 하드웨어 시리얼 Serial3 사용 권장이나,
// 라이브러리 수정이 어려워 SoftwareSerial 핀을 메가의 디지털 핀으로 변경)
#define SIM800_TX_PIN 10
#define SIM800_RX_PIN 11
라이브러리를 SoftwareSerial에서 메가의 하드웨어 시리얼 포트(Serial3 등)로 변경하는 것은 너무 복잡해 쉬운 길을 택했습니다.
겪었던 문제
기본적으로 DHT.h와 Seeeduino_GPRS 라이브러리 예제를 복사해 붙여넣기 했습니다. 문제는 gprs.h 예제가 고정된 문자열 메시지만 보내는 방법만 보여주고, 변수(온도 값)를 문자열로 변환해 보내는 방법이 없었다는 점입니다. GPRS_SIM900, SIM800L-master 라이브러리도 마찬가지였습니다.
웹에서 몇 주간 검색하고 포럼 글도 찾아봤지만 답을 못 구했습니다. 답변을 못 받은 분들께 이 글이 도움이 되길 바랍니다.
해결책
float 값을 String으로 변환 → String을 char 배열로 변환 → 전송 하면 됩니다. 간단하죠!
핵심 코드 스니펫
MyString = String(temp, 0); // float를 String으로 (소수점 0자리)
MyString = (MyString + " Degrees C"); // 단위 추가
// String → char 배열 변환
int str_len = MyString.length() + 1; // 널 종료 문자 공간 포함
char char_array[str_len]; // 버퍼 준비
MyString.toCharArray(char_array, str_len); // 복사
gprs.sendSMS("04XXXXXXXX", char_array); // 전화번호와 메시지 전송
배선
SIM800L 모듈 전원용으로 울트라파이어 18650 배터리 사용. 추후 전압 레귤레이터 추가 예정. 이 튜토리얼 참조.