아두이노 & ThingSpeak로 실시간 날씨 모니터링 IoT 구축
부품 및 소모품
| 부품 | 수량 |
| 아두이노 우노 | 1 |
| ESP8266 ESP-01 와이파이 모듈 | 1 |
| DHT11 온습도 센서 (3핀) | 1 |
| 브레드보드 | 1 |
| 점퍼 와이어 | 1세트 |
| 브레드보드 파워 서플라이 5V/3.3V | 1 |
앱 및 온라인 서비스
- ThingSpeak API
- 아두이노 IDE
- Microsoft Windows 10
프로젝트 소개
ThingSpeak 아두이노 날씨 스테이션
IoT 입문하기
IoT 입문은 방대한 옵션 때문에 막막할 수 있습니다. ThingSpeak로 시작하면 저렴하고 이해하기 쉽으며 멋진 첫 프로젝트가 됩니다. 온습도 센서 데이터를 아두이노와 ESP-01 와이파이 모듈로 ThingSpeak 클라우드에 전송합니다.
필요한 것들
참고: 아두이노로 센서와 와이파이 모듈 전원 공급 가능하지만, ESP-01의 피크 전류 감당이 안 되어 외부 파워 서플라이(브레드보드용 5V/3.3V 모듈) 사용을 권장합니다.
회로 연결
ESP-01
- VCC → 3.3V
- GND → GND
- CH_PD → 3.3V
- RESET → 3.3V
- TX → 아두이노 핀 2
- RX → 아두이노 핀 3
DHT11
- VCC → 5V
- OUT → 아두이노 A0
- GND → GND
브레드보드 파워 서플라이 점퍼를 3.3V로 설정하세요. 전원 투입 후 연기나 냄새 없으면 정상입니다.
ThingSpeak 설정
- ThingSpeak 홈페이지 가입 후 새 채널 생성 (필드: Temperature, Humidity)
- 채널 생성 후 'API Keys' 탭에서 Write API Key 복사
아두이노 IDE 라이브러리 설정
SoftwareSerial.h는 내장. 다음 두 라이브러리 직접 설치 필요:
- DHT Sensor Library by Adafruit
- Adafruit Unified Sensor Library
ZIP 파일 다운로드 후 IDE에서 '스케치 → 라이브러리 포함 → .ZIP 라이브러리 추가'로 설치.
코드 업로드 및 실행
코드: GitHub 또는 아래 복사.
수정 사항:
- Write API Key 입력
- 와이파이 SSID와 비밀번호 입력
업로드 후 ThingSpeak 채널에서 그래프 확인. 15초 간격으로 업데이트됩니다.
전체 코드
String myAPIkey = "Your Write API key here";
#include <SoftwareSerial.h>
#include <DHT.h>;
SoftwareSerial ESP8266(2, 3); // Rx, Tx
#define DHTTYPE DHT11
#define DHTPIN A0
DHT dht(DHTPIN, DHTTYPE,11);
float humidity, temp_f;
long writingTimer = 17;
long startTime = 0;
long waitTime = 0;
boolean relay1_st = false;
boolean relay2_st = false;
unsigned char check_connection=0;
unsigned char times_check=0;
boolean error;
void setup() {
Serial.begin(9600);
ESP8266.begin(9600);
dht.begin();
startTime = millis();
ESP8266.println("AT+RST");
delay(2000);
Serial.println("Connecting to Wifi");
while(check_connection==0) {
Serial.print(".");
ESP8266.print("AT+CWJAP=\"Wifi Network's name\",\"PassWord\"\r\n");
ESP8266.setTimeout(5000);
if(ESP8266.find("WIFI CONNECTED\r\n")==1) {
Serial.println("WIFI CONNECTED");
break;
}
times_check++;
if(times_check>3) {
times_check=0;
Serial.println("Trying to Reconnect..");
}
}
}
void loop() {
waitTime = millis()-startTime;
if (waitTime > (writingTimer*1000)) {
readSensors();
writeThingSpeak();
startTime = millis();
}
}
void readSensors(void) {
temp_f = dht.readTemperature();
humidity = dht.readHumidity();
}
void writeThingSpeak(void) {
startThingSpeakCmd();
String getStr = "GET /update?api_key=";
getStr += myAPIkey;
getStr += "&field1=";
getStr += String(temp_f);
getStr += "&field2=";
getStr += String(humidity);
getStr += "\r\n\r\n";
GetThingspeakcmd(getStr);
}
void startThingSpeakCmd(void) {
ESP8266.flush();
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += "184.106.153.149"; // api.thingspeak.com IP
cmd += "\",80";
ESP8266.println(cmd);
Serial.print("Start Commands: ");
Serial.println(cmd);
if(ESP8266.find("Error")) {
Serial.println("AT+CIPSTART error");
return;
}
}
String GetThingspeakcmd(String getStr) {
String cmd = "AT+CIPSEND=";
cmd += String(getStr.length());
ESP8266.println(cmd);
Serial.println(cmd);
if(ESP8266.find(">")) {
ESP8266.print(getStr);
Serial.println(getStr);
delay(500);
String messageBody = "";
while (ESP8266.available()) {
String line = ESP8266.readStringUntil('\n');
if (line.length() == 1) {
messageBody = ESP8266.readStringUntil('\n');
}
}
Serial.print("MessageBody received: ");
Serial.println(messageBody);
return messageBody;
} else {
ESP8266.println("AT+CIPCLOSE");
Serial.println("AT+CIPCLOSE");
}
}
회로도
코드: https://github.com/imalwaysontheinternet/Weather-Stasion