배터리 구동 MKR FOX 1200 기상 관측소 만들기
부품 및 소모품
| Arduino MKR Fox 1200 |
1 |
| SparkFun 대기 센서 브레이크아웃 - BME280 |
1 |
| TSL2561 디지털 조도 센서 |
1 |
| HTU21D 온습도 센서 |
1 |
앱 및 온라인 서비스
- Arduino Web Editor
- ThingSpeak API
- Sigfox 백엔드
프로젝트 개요
참고: 이 튜토리얼은 구버전일 수 있습니다. 최신 버전은 여기를 참조하세요.
이 프로젝트는 MKR FOX 1200 보드와 여러 I2C 센서를 조합해 배터리로 구동되는 간단한 기상 관측소를 만드는 방법을 보여줍니다.
사용 센서
- 내장 온도 센서 (저정밀도, ±1°C)
- HTU21D I2C 센서 - 습도 측정
- Bosch BMP280 - 기압 및 정밀 온도 측정
- TSL2561 조도 센서 - 조도 측정
하드웨어 설정
모든 센서는 I2C 인터페이스를 사용하며 3.3V로 동작합니다. MKR FOX 1200에서 네 개의 선만 연결하면 됩니다: GND, 3.3V, SDA(핀 11), SCL(핀 12). 각 센서마다 고유한 I2C 주소를 가지므로 세 개의 센서를 병렬로 연결해도 라이브러리가 자동으로 구분합니다.
전원은 AA 또는 AAA 알칼라인 배터리 2개를 직렬로 연결해 3V를 만든 뒤, 보드의 나사 단자 블록에 연결하면 됩니다.
Sigfox 메시지 최적화
Sigfox 네트워크는 하루 최대 140회 전송 가능하므로, 데이터를 효율적으로 패킹해야 합니다. 메시지 최대 크기는 12바이트이며, float 타입은 4바이트를 차지하므로 더 작은 표현으로 변환해 전송합니다. 배포 환경에 맞춰 안전한 범위를 정한 뒤 백엔드에서 원래 값으로 복원하는 방식입니다.
클라우드 서비스 설정
두 가지 클라우드 서비스를 사용합니다:
FirstConfiguration 예제의 PAC와 ID를 사용해 보드를 Sigfox 백엔드에 등록합니다(이미 등록했다면 생략). 두 서비스가 서로 통신하며 데이터를 올바르게 해석하도록 설정해야 합니다. ThingSpeak에서 두 개의 채널을 생성하세요. 첫 번째 채널(readChannelID)은 원시 데이터를 수신하고, 두 번째 채널(writeChannelID)은 재조정된 데이터를 저장합니다.
Arduino Create Editor로 스케치 업로드
기본 스케치는 배포 전 모든 인프라를 테스트할 수 있게 해줍니다. 다음을 선언하세요:
oneshot = false
백엔드 설정이 완료되면 시리얼 포트를 열고 첫 메시지 전송을 확인하세요.
Sigfox 콜백 설정
- DEVICE TYPE → LIST → 보드 우클릭 → Edit
- 좌측 메뉴 CALLBACKS 클릭 → New 버튼 → Custom callback 선택
- 설정:
- TYPE:
DATA/UPLINK
- Channel:
URL
- Http method:
GET
Custom Payload:
status::uint:8 temp1::int:16:little-endian temp2::int:16:little-endian press::uint:16:little-endian hum::uint:16:little-endian light::uint:16:little-endian lastMsg::uint:8
URL Pattern:
https://api.thingspeak.com/update?api_key=XXXXXXXXXXXX&field1={customData#temp1}&field2={customData#press}&field3={customData#temp2}&field4={customData#hum}&field5={customData#light}&field6={customData#status}&field7={customData#lastMsg}
api_key를 ThingSpeak의 Channel1 Write API Key로 교체하세요. 저장 후 시리얼 포트를 열면 첫 메시지 전송을 확인할 수 있습니다.
원시 데이터에서 그래프로
ThingSpeak 분석 도구를 사용해 원시 데이터를 실제 값으로 변환합니다. 다음 MATLAB 코드를 분석기에 추가하고 React로 10분마다 실행되도록 예약하세요:
% TODO - 읽을 채널 ID: readChannelID = [];
% TODO - Read API Key: readAPIKey = 'T6UK7XO6A4H2AGT7';
% TODO - 쓸 채널 ID: writeChannelID = [];
% TODO - Write API Key: writeAPIKey = 'XU4TGY261P6B5USN';
%% 데이터 읽기 %%
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table');
analyzedData = data;
%% 데이터 분석 %%
INT16_t_MAX = 32767;
UINT16_t_MAX = 65536;
analyzedData.('Temperature1') = data.('Temperature1') / INT16_t_MAX * 120;
analyzedData.('Temperature2') = data.('Temperature2') / INT16_t_MAX * 120;
analyzedData.('Pressure') = data.('Pressure') / UINT16_t_MAX * 200000;
analyzedData.('Light') = data.('Light') / UINT16_t_MAX * 100000;
analyzedData.('Humidity') = data.('Humidity') / UINT16_t_MAX * 110;
%% 데이터 쓰기 %%
thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey);
%% 예약 액션: React → 10분마다 실행
자신의 채널 ID로 교체하면 원시 데이터가 실제 기상 값으로 변환되어 그래프로 표시됩니다.
코드
전체 스케치는 WeatherMonitor라는 이름으로 제공됩니다. Arduino Create Editor에서 열거나 GitHub 저장소에서 다운로드하세요.