아두이노 UNO, ESP-01, ThingSpeak, MIT App Inventor로 간단한 IoT 프로젝트 구축하기
부품 및 소모품
부품
수량
아두이노 UNO
1
Espressif ESP8266 ESP-01
1
DHT22 온습도 센서
1
DS18B20 1-Wire 디지털 온도 센서 (토양용)
1
LDR - 조도 의존 저항
1
2채널 DC 5V 릴레이 모듈
1
앱 및 온라인 서비스
아두이노 IDE
ThingSpeak API
MIT App Inventor
프로젝트 개요
목표는 로컬 유닛에서 정보를 수집해 인터넷으로 전송하는 것입니다. 지구 반대편의 사용자가 이 정보를 보고 원격 명령을 액추에이터로 보내는 구조입니다. 어떤 센서나 액추에이터든 적용 가능합니다.
내 IoT 작업의 대부분은 NodeMCU와 최근에는 ESP32를 사용했지만, 몇 년 전 아두이노 UNO와 ESP8266-01로 IoT를 처음 배우던 시절을 잊지 않고, 이제는 더 많은 경험을 바탕으로 다시 이 훌륭한 기기들을 탐구해보려 합니다. ThingSpeak.com 웹 서비스를 이용해 클라우드에 연결하고, MIT App Inventor로 개발한 안드로이드 앱으로 원격 제어도 구현합니다.
우리 IoT 프로젝트의 "중심"은 ThingSpeak.com입니다. 로컬 유닛(UNO/ESP-01)은 센서와 액추에이터 상태에서 데이터를 수집해 전송하며, ThingSpeak.com의 특정 상태 채널(Status Channel)에 "기록"합니다. 로컬 유닛은 인터넷에서 데이터를 수신해 특정 액추에이터 채널(Actuator Channels)에서 "읽기"도 합니다.
안드로이드 앱도 ThingSpeak.com 상태 채널에서 데이터를 읽어 사용자에게 표시합니다. 사용자는 이 상태 정보를 바탕으로 액추에이터에 명령을 보내 ThingSpeak 액추에이터 채널에 기록합니다 (위 블록 다이어그램의 데이터 흐름 참조).
1단계: 소개
일반적인 센서를 사용해 여러 데이터를 수집하고 클라우드로 전송해 인터넷 어디에서든 볼 수 있게 합니다. 데이터 처리는 ThingSpeak.com(오픈 IoT 플랫폼) 서비스를 이용해 수집, 분석, 조치합니다.
센서로 수집할 데이터:
대기 온도 및 상대 습도
토양 온도 및 습도
조도
액추에이터 2개:
전기 펌프
전기 램프
액추에이터 상태(ON/OFF)도 클라우드로 전송됩니다. 예를 들어 농장의 데이터를 수집해 클라우드로 보내고, 사용자는 다음 기준으로 판단해 원격 제어합니다.
토양 습도가 너무 낮으면 펌프 ON
토양 온도가 너무 낮으면 램프 ON
원격 제어를 위해 안드로이드 앱을 사용합니다.
2단계: BoM - 자재 명세서
주요 구성품 링크와 대략적인 가격(USD)은 참고용입니다.
아두이노 UNO (마이크로컨트롤러) - $10.00
ESP8266-01 (통신 모듈) - $3.50
DHT22 (대기 온습도 센서) - $9.00
DS18B20 (토양용 1-Wire 디지털 온도 센서) - $6.00
YL-69 + LM393 (토양 습도 센서) - $2.00
LDR (조도 센서) - $0.20
LED 2개 (적색, 녹색)
2채널 DC 5V 릴레이 모듈 (옵토커플러, 로우 레벨 트리거) - $7.00
5V DC 펌프 - $3.00
220V 램프
330Ω 저항 2개 (LED용)
10kΩ 저항 2개 (DHT22, LDR용)
4.7kΩ 저항 1개 (DS18B20용)
브레드보드, 점퍼 와이어, 릴레이용 외부 5V DC 전원
3단계: 하드웨어 구성
프로젝트 하드웨어를 조립합니다. 이상적으로는 파트별로 설치하고 테스트하는 것이 좋습니다. 제안 순서:
모든 센서 로컬 설치 및 테스트
ESP-01 설치 및 설정 (BareMinimum)
ESP-01 최종 구성으로 변경 및 테스트
ThingSpeak 상태 채널 설정
아두이노에 ThingSpeak 코드 설치 및 클라우드 센서 상태 확인
상태/메시지 표시용 안드로이드 앱 1차 개발
액추에이터(LED, 릴레이) 설치
ThingSpeak 액추에이터 채널 설정
액추에이터 포함 아두이노 코드 설치 및 테스트
최종 안드로이드 앱 버전 개발
4단계: 센서 연결
센서를 제대로 읽으려면 IDE에 라이브러리가 설치되어 있어야 합니다. 초기 설정 예시:
// DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5 // DS18B20 on pin D5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
int soilTemp = 0;
// DHT
#include "DHT.h"
#include <stdlib.h>
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht(pinoDHT, tipoDHT);
int airTemp = 0, airHum = 0;
// LDR (조도)
#define ldrPIN 1
int light = 0;
// 토양 습도
#define soilHumPIN 0
int soilHum = 0;
리셋 시마다 자동으로 WiFi에 연결하려면 setup() 끝에 connectWiFi() 호출을 추가하세요.
7단계: 센서와 ESP-01 연결
모든 센서와 ESP-01이 테스트 완료되면 인터넷으로 데이터 전송을 위해 통합합니다.
8단계: ThingSpeak 설정
ThingSpeak 계정이 없다면 회원가입 후 새 채널을 생성합니다. 2개 액추에이터, 5개 센서, 1개 예비 필드 구성:
Field 1: Actuator 1 (펌프)
Field 2: Actuator 2 (램프)
Field 3: 대기 온도 (°C)
Field 4: 대기 습도 (%)
Field 5: 토양 온도 (°C)
Field 6: 토양 습도 (%)
Field 7: 조도 (%)
Field 8: 예비 (통신 오류 카운터 등으로 활용)
채널 생성 후 Write/Read API Key를 메모해둡니다.
9단계: 상태 데이터를 클라우드로 전송
로컬 센서 데이터를 ThingSpeak에 WRITE합니다. GET 문자열 전송을 3단계로 수행:
시작 명령: AT+CIPSTART="TCP","184.106.153.149",80
명령 길이: AT+CIPSEND=116
GET 문자열: GET /update?api_key=YOUR_WRITE_KEY&field1=pump&field2=lamp&field3=airTemp&field4=airHum&field5=soilTemp&field6=soilHum&field7=light&field8=spare
MIT App Inventor로 사용자 인터페이스와 블록을 설계합니다. 2초마다(Clock1) "readArduino" 프로시저를 호출해 ThingSpeak 상태 채널을 READ하고 각 필드 값을 전역 변수에 저장해 라벨에 표시합니다. 액추에이터 상태 0/1을 OFF/ON으로 변환해 표시합니다. JSON 파싱으로 각 필드 값을 추출합니다. 토양 센서 상태 분석해 온도 10°C 미만 또는 습도 60% 미만 시 경고 메시지 표시(1초마다 색상 토글로 깜빡임).
펌프와 램프를 원격 제어하기 위해 릴레이 모듈(옵토커플러, 로우 레벨 트리거)을 사용합니다. 별도 5V 전원으로 릴레이를 구동해 아두이노 핀에 전류 부담을 주지 않습니다. 릴레이 GND는 아두이노 GND와 연결하지 않아 노이즈 유입을 방지합니다.
12단계: ThingSpeak 액추에이터 채널 설정
상태 채널과 마찬가지로 액추에이터별 채널 2개 생성 (Field 1만 사용):
Channel ID 375598 → 적색 LED (펌프): Field1=0 OFF, Field1=1 ON
Channel ID 375599 → 녹색 LED (램프): Field1=0 OFF, Field1=1 ON
13단계: 액추에이터 포함 아두이노 코드 설치 및 테스트
이제 ThingSpeak에서 READ해 명령을 수신합니다. 10초 간격으로 액추에이터 채널에서 Field 1의 최신 값을 읽습니다. GET 명령: GET /channels/375598/fields/1/last. 응답에서 '1' 또는 '0'을 파싱해 액추에이터 제어. 핵심 함수는 readThingSpeak(String channelID)입니다. 전체 코드: GitHub - ReadingCommandTS_EXT.ino
14단계: 액추에이터에 명령 전송 (브라우저 테스트)
최종 앱 개발 전 브라우저로 테스트 가능:
펌프 ON: https://api.thingspeak.com/update?api_key=ACT1_WRITE_KEY&field1=1