Arduino IDE(OpenWeatherMap.org 및 ThingSpeak)를 사용한 ESP32 HTTP GET
이 가이드에서는 Arduino IDE가 있는 ESP32 보드를 사용하여 HTTP GET 요청을 하는 방법을 알아봅니다. OpenWeatherMap.org에서 JSON 데이터를 디코딩하고 ThingSpeak를 사용하여 차트에 값을 플로팅하는 방법을 보여드리겠습니다.
Arduino IDE(OpenWeatherMap ThingSpeak)를 사용한 ESP32 HTTP GET
권장: Arduino IDE(ThingSpeak 및 IFTTT.com)를 사용한 ESP32 HTTP POST
HTTP GET 요청 방법
HTTP(Hypertext Transfer Protocol)는 클라이언트와 서버 간의 요청-응답 프로토콜로 작동합니다. 다음은 예입니다.
- ESP32(클라이언트)는 HTTP 요청을 서버(예: OpenWeatherMap.org 또는 ThingSpeak)에 제출합니다.
- 서버는 ESP32(클라이언트)에 응답을 반환합니다.
- 마지막으로 응답에는 요청에 대한 상태 정보가 포함되며 요청된 콘텐츠도 포함될 수 있습니다.
HTTP GET
GET은 지정된 리소스에서 데이터를 요청하는 데 사용됩니다. 종종 API에서 값을 가져오는 데 사용됩니다.
예를 들어 간단한 요청을 사용하여 값이나 JSON 객체를 반환할 수 있습니다.
GET /weather?countryCode=PT
또한 GET 요청을 만들어 값을 업데이트할 수도 있습니다(ThingSpeak에서처럼). 예를 들어 다음을 사용할 수 있습니다.
GET /update?field1=value1
쿼리 문자열(name = field1, value = value1)이 HTTP GET 요청의 URL로 전송됩니다.
(HTTP GET을 사용하면 URL 요청의 모든 사람이 데이터를 볼 수 있습니다.)
필수 조건
이 튜토리얼을 진행하기 전에 다음 필수 조건을 완료했는지 확인하세요.
Arduino IDE 설치
Arduino IDE를 사용하여 ESP32를 프로그래밍하므로 ESP32 애드온이 설치되어 있는지 확인하세요.
Arduino IDE(Windows, Mac OS X, Linux)에 ESP32 보드 설치
Arduino_JSON 라이브러리
Arduino_JSON 라이브러리도 설치해야 합니다. Arduino IDE 라이브러리 관리자에서 이 라이브러리를 설치할 수 있습니다. 스케치 > 라이브러리 포함 > 라이브러리 관리로 이동하여 다음과 같이 라이브러리 이름을 검색하기만 하면 됩니다.
Arduino JSON 라이브러리 설치 Arduino IDE
기타 웹 서비스 또는 API
이 가이드에서는 ESP32 보드를 설정하여 OpenWeatherMap.org 및 ThingSpeak에 HTTP 요청을 수행하는 방법을 알아봅니다. 로컬 솔루션으로 학습하는 것을 선호하는 경우 Node-RED와 함께 HTTP를 사용할 수 있습니다. 이 가이드에 제시된 모든 예제는 다른 API에서도 작동합니다.
요약하자면, 이 가이드를 모든 서비스와 호환되도록 하려면 서비스 API 문서를 검색해야 합니다. 그런 다음 서버 이름(URL 또는 IP 주소)과 요청에서 보낼 매개변수(URL 경로 또는 요청 본문)가 필요합니다. 마지막으로, 사용하려는 모든 API와 통합하도록 예제를 수정합니다.
1. ESP32 HTTP GET: JSON 데이터(OpenWeatherMap.org)
이 예제에서는 데이터에 액세스하기 위한 API 요청을 하는 방법을 알아봅니다. 예를 들어 OpenWeatherMap API를 사용하겠습니다. 이 API는 무료 플랜이 있으며 전 세계 거의 모든 지역의 날씨에 대한 유용한 정보를 많이 제공합니다.
HTTP GET Open Weather Map ESP32
OpenWeatherMap API 사용
API(애플리케이션 프로그래밍 인터페이스)는 소프트웨어 개발자가 누구나 데이터나 서비스를 사용할 수 있도록 작성한 함수 집합입니다. OpenWeatherMap 프로젝트에는 사용자가 날씨 데이터를 요청할 수 있는 API가 있습니다.
OpenWeatherMap API 로고
이 프로젝트에서는 해당 API를 사용하여 선택한 위치의 하루 날씨 예보를 요청합니다. API를 사용하는 방법을 배우는 것은 현재 주가, 환율, 최신 뉴스, 교통 상황 업데이트, 트윗 등과 같이 끊임없이 변화하는 다양한 정보에 액세스할 수 있기 때문에 훌륭한 기술입니다.
참고: API 키는 사용자에게 고유하며 누구와도 공유해서는 안 됩니다.
OpenWeatherMap의 무료 플랜은 이 프로젝트를 완료하는 데 필요한 모든 것을 제공합니다. API를 사용하려면 APIID라고 하는 API 키가 필요합니다. APIID를 얻으려면:
- 브라우저를 열고 https://openweathermap.org/appid/로 이동합니다.
- 가입 버튼을 누르고 무료 계정을 만듭니다.
- 이 링크로 이동합니다: https://home.openweathermap.org/api_keys API 키를 가져옵니다.
OpenWeatherMap API 키 복사
4. API 키 탭에서 기본 키(위 그림에서 빨간색 사각형으로 강조 표시됨)가 표시됩니다. 이것은 사이트에서 정보를 가져오는 데 필요한 고유 키입니다. 이 키를 어딘가에 복사하여 붙여넣습니다. 곧 필요할 것입니다.
5. 선택한 위치의 날씨에 대한 정보를 가져오려면 다음 URL을 입력하세요.
http://api.openweathermap.org/data/2.5/weather?q=yourCityName,yourCountryCode&APPID=yourUniqueAPIkey
http://api.openweathermap.org/data/2.5/weather?q=yourCityName,yourCountryCode&APPID=yourUniqueAPIkey
yourCityName을 데이터를 원하는 도시로, yourCountryCode를 해당 도시의 국가 코드로, yourUniqueAPIkey를 4단계의 고유 API 키로 바꾸세요. 예를 들어 포르투갈 포르투의 업데이트된 API URL은 다음과 같습니다.
http://api.openweathermap.org/data/2.5/weather?q=Porto,
PT&APPID=801d2603e9f2e1c70e042e4f5f6e0---
http://api.openweathermap.org/data/2.5/weather?q=Porto,PT&APPID=801d2603e9f2e1c70e042e4f5f6e0---
6. URL을 브라우저에 복사하면 API가 지역 날씨에 해당하는 정보를 반환합니다. 이 튜토리얼을 작성한 날 포르투갈 포르투의 날씨에 대한 다음 정보를 얻었습니다.
{"coord":{"lon":-8.611,"lat":41.1496},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"stations","main":{"temp":294.58,"feels_like":294.95,"temp_min":293.82,"temp_max":295.65,"pressure":1016,"humidity":83},"visibility":10000,"wind":{"speed":8.94,"deg":180,"gust":8.94},"clouds":{"all":75},"dt":1666877635,"sys":{"type":2,"id":2009460,"country":"PT","sunrise":1666853957,"sunset":1666892227},"timezone":3600,"id":2735943,"name":"Porto","cod":200}
더 나은 가독성을 위해 들여쓰기를 적용한 모습입니다.
{
"coord": {
"lon": -8.611,
"lat": 41.1496
},
"weather": [
{
"id": 803,
"main": "Clouds",
"description": "broken clouds",
"icon": "04d"
}
],
"base": "stations",
"main": {
"temp": 294.58,
"feels_like": 294.95,
"temp_min": 293.82,
"temp_max": 295.65,
"pressure": 1016,
"humidity": 83
},
"visibility": 10000,
"wind": {
"speed": 8.94,
"deg": 180,
"gust": 8.94
},
"clouds": {
"all": 75
},
"dt": 1666877635,
"sys": {
"type": 2,
"id": 2009460,
"country": "PT",
"sunrise": 1666853957,
"sunset": 1666892227
},
"timezone": 3600,
"id": 2735943,
"name": "Porto",
"cod": 200
}
다음으로 이 정보를 사용하여 온도, 습도, 기압, 풍속 등과 같은 특정 데이터를 가져오는 방법을 살펴보겠습니다.
코드 ESP32 HTTP GET OpenWeatherMap.org
필요한 보드 애드온과 라이브러리를 설치한 후 다음 코드를 Arduino IDE에 복사하지만 아직 업로드하지 마세요. 작동하도록 하려면 몇 가지 변경이 필요합니다.
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Your Domain name with URL path or IP address with path
String openWeatherMapApiKey = "REPLACE_WITH_YOUR_OPEN_WEATHER_MAP_API_KEY";
// Example:
//String openWeatherMapApiKey = "bd939aa3d23ff33d3c8f5dd1dd435";
// Replace with your country code and city
String city = "Porto";
String countryCode = "PT";
// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 10 seconds (10000)
unsigned long timerDelay = 10000;
String jsonBuffer;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
}
void loop() {
// Send an HTTP GET request
if ((millis() - lastTime) > timerDelay) {
// Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
Serial.println(jsonBuffer);
JSONVar myObject = JSON.parse(jsonBuffer);
// JSON.typeof(jsonVar) can be used to get the type of the var
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
Serial.print("JSON object = ");
Serial.println(myObject);
Serial.print("Temperature: ");
Serial.println(myObject["main"]["temp"]);
Serial.print("Pressure: ");
Serial.println(myObject["main"]["pressure"]);
Serial.print("Humidity: ");
Serial.println(myObject["main"]["humidity"]);
Serial.print("Wind Speed: ");
Serial.println(myObject["wind"]["speed"]);
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
String httpGETRequest(const char* serverName) {
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
http.begin(client, serverName);
// Send HTTP POST request
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
http.end();
return payload;
}
네트워크 자격 증명 설정
다음 줄을 네트워크 자격 증명으로 수정합니다. SSID 및 비밀번호. 코드에는 변경해야 할 위치에 대한 주석이 잘 설명되어 있습니다.
// 네트워크 자격 증명으로 대체
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
OpenWeatherMap.org API 키 설정
다음과 같이 API 키를 삽입합니다.
String openWeatherMapApiKey = "REPLACE_WITH_YOUR_OPEN_WEATHER_MAP_API_KEY";
도시 및 국가 설정
다음 변수에 데이터를 가져오려는 도시와 국가 코드를 입력합니다.
// 국가 코드와 도시로 대체
String city = "Porto";
String countryCode = "PT";
이러한 변경을 한 후 코드를 보드에 업로드할 수 있습니다. 계속 읽어서 코드 작동 방식을 알아보세요.
HTTP GET 요청(JSON 객체)
loop()에서 httpGETRequest() 함수를 호출하여 HTTP GET 요청을 합니다.
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
httpGETRequest() 함수는 OpenWeatherMap에 요청을 하고 해당 도시의 날씨에 대한 모든 정보가 포함된 JSON 객체가 있는 문자열을 검색합니다.
String httpGETRequest(const char* serverName) {
HTTPClient http;
// Your IP address with path or Domain name with URL path
http.begin(serverName);
// Send HTTP POST request
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
http.end();
return payload;
}
JSON 객체 디코딩
값에 액세스하려면 JSON 객체를 디코딩하고 모든 값을 jsonBuffer 배열에 저장합니다.
JSONVar myObject = JSON.parse(jsonBuffer);
// JSON.typeof(jsonVar) can be used to get the type of the var
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
Serial.print("JSON object = ");
Serial.println(myObject);
Serial.print("Temperature: ");
Serial.println(myObject["main"]["temp"]);
Serial.print("Pressure: ");
Serial.println(myObject["main"]["pressure"]);
Serial.print("Humidity: ");
Serial.println(myObject["main"]["humidity"]);
Serial.print("Wind Speed: ");
Serial.println(myObject["wind"]["speed"]);
HTTP GET 데모
코드를 업로드한 후 직렬 모니터를 열면 다음 JSON 데이터를 수신하는 것을 볼 수 있습니다.
{"coord":{"lon":-8.61,"lat":41.15},"weather":[{"id":801,"main":"Clouds","description":"few clouds","icon":"02d"}],"base":"stations","main":{"temp":294.44,"feels_like":292.82,"temp_min":292.15,"temp_max":297.04,"pressure":1008,"humidity":63},"visibility":10000,"wind":{"speed":4.1,"deg":240},"clouds":{"all":20},"dt":1589288330,"sys":{"type":1,"id":6900,"country":"PT","sunrise":1589260737,"sunset":1589312564},"timezone":3600,"id":2735943,"name":"Porto","cod":200}
그런 다음 Arduino IDE 직렬 모니터에 디코딩된 JSON 객체를 인쇄하여 온도(켈빈), 압력, 습도 및 풍속 값을 가져옵니다.
ESP32 ESP8266 NodeMCU HTTP GET 및 Arduino IDE OpenWeatherMap 응답
데모 목적으로 10초마다 새 데이터를 요청합니다. 그러나 장기 프로젝트의 경우 타이머를 늘리거나 시간/분당 API 호출 제한을 확인하여 차단/금지되는 것을 방지해야 합니다.
2. ESP32 HTTP GET: 값 업데이트(ThingSpeak)
이 예에서 ESP32는 ThingSpeak에서 판독값을 업데이트하기 위해 HTTP GET 요청을 합니다.
HTTP GET ThingSpeak ESP32
ThingSpeak API 사용
ThingSpeak에는 HTTP를 사용하여 데이터를 저장하고 검색할 수 있는 무료 API가 있습니다. 이 튜토리얼에서는 ThingSpeak API를 사용하여 어디에서나 차트에 데이터를 게시하고 시각화합니다. 예를 들어, 임의의 값을 게시하지만 실제 애플리케이션에서는 실제 센서 판독값을 사용합니다.
ESP와 함께 ThingSpeak를 사용하려면 API 키가 필요합니다. 다음 단계를 따르세요.
1. ThingSpeak.com으로 이동하여 무료 계정을 만듭니다.
2. 그런 다음 채널 탭을 엽니다.
3. 새 채널을 만듭니다.
ESP32 ESP8266 NodeMCU ThingSpeak 새 채널 만들기
4. 새로 만든 채널을 열고 API 키 탭을 선택하여 쓰기 API 키를 복사합니다.
ESP32 ESP8266 NodeMCU ThingSpeak API 키 보기 쓰기 복사
코드 ESP32 HTTP GET ThingSpeak
다음 스케치를 Arduino IDE에 복사합니다(SSID, 비밀번호, API 키 입력):
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// REPLACE WITH THINGSPEAK.COM API KEY
String serverName = "http://api.thingspeak.com/update?api_key=REPLACE_WITH_YOUR_API_KEY";
// EXAMPLE:
//String serverName = "http://api.thingspeak.com/update?api_key=7HQJM49R8JAPR";
// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 10 seconds (10000)
unsigned long timerDelay = 10000;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
// Random seed is a number used to initialize a pseudorandom number generator
randomSeed(analogRead(33));
}
void loop() {
// Send an HTTP GET request
if ((millis() - lastTime) > timerDelay) {
// Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
WiFiClient client;
HTTPClient http;
String serverPath = serverName + "&field1=" + String(random(40));
// Your Domain name with URL path or IP address with path
http.begin(client, serverPath.c_str());
// Send HTTP GET request
int httpResponseCode = http.GET();
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String payload = http.getString();
Serial.println(payload);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
네트워크 자격 증명 설정
다음 줄을 네트워크 자격 증명으로 수정합니다: SSID와 비밀번호. 코드에는 변경해야 할 위치에 대한 주석이 잘 달려 있습니다.
// 네트워크 자격 증명으로 바꾸기
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
serverName(API 키) 설정
API 키를 포함하도록 serverName 변수를 수정합니다.
String serverName = "http://api.thingspeak.com/update?api_key=REPLACE_WITH_YOUR_API_KEY";
이제 코드를 보드에 업로드하면 바로 작동할 것입니다. HTTP GET 요청을 하는 방법을 알고 싶다면 다음 섹션을 읽어보세요.
HTTP GET 요청
In the loop()는 10초마다 임의의 값으로 HTTP GET 요청을 하는 곳입니다.
String serverPath = serverName + "&field1=" + String(random(40));
// Your Domain name with URL path or IP address with path
http.begin(serverPath.c_str());
// Send HTTP GET request
int httpResponseCode = http.GET();
String serverPath = serverName + "&field1=" + String(random(40));
// URL 경로가 있는 도메인 이름 또는 경로가 있는 IP 주소
http.begin(serverPath.c_str());
// HTTP GET 요청 보내기
int httpResponseCode = http.GET();
ESP32는 다음 URL에서 새 요청을 하여 센서 field1을 새 값(30)으로 업데이트합니다.
http://api.thingspeak.com/update?api_key=REPLACE_WITH_YOUR_API_KEY&field1=30
그런 다음 다음 코드 줄은 서버에서 HTTP 응답을 저장합니다.
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String payload = http.getString();
Serial.println(payload);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
Arduino IDE 직렬 모니터에서 HTTP 응답 코드 200이 표시되어야 합니다(요청이 성공했음을 의미).
ESP32 ESP8266 NodeMCU HTTP POST Arduino IDE 직렬 모니터 응답
ThingSpeak 대시보드(Private View 탭 아래)는 10초마다 새 판독값을 수신해야 합니다.
ESP32 ESP8266 NodeMCU HTTP GET 및 HTTP POST와 Arduino IDE ThingSpeak 차트
마지막 적용의 경우 타이머를 늘리거나 시간/분당 API 호출 제한을 확인하여 차단/금지되는 것을 방지해야 할 수 있습니다.
마무리
이 튜토리얼에서는 HTTP GET 요청을 사용하여 ESP32를 웹 서비스와 통합하는 방법을 알아보았습니다. ESP32로 HTTP POST 요청을 할 수도 있습니다.
ESP8266 보드를 사용하는 경우 다음을 읽어보세요.
- ESP8266 NodeMCU HTTP GET 요청 가이드
- ESP8266 NodeMCU HTTP POST 요청 가이드
다음도 읽어보세요.
- [과정] Arduino IDE로 ESP32 배우기
- PHP 스크립트를 사용하여 ESP32/ESP8266 이메일 알림 보내기
- 전 세계 어디에서나 센서 판독값 시각화
- ESP32 릴레이 모듈 웹 서버
이 프로젝트가 마음에 들었으면 좋겠습니다. 질문이 있으면 아래에 댓글을 남겨주세요. 최대한 빨리 답변해드리겠습니다.
ESP32가 마음에 드셨다면 "Arduino IDE로 ESP32 배우기" 과정에 등록하는 것을 고려해 보세요. 여기에서 무료 ESP32 리소스에 액세스할 수도 있습니다.
읽어주셔서 감사합니다. 배움을 멈추지 마세요.
'ESP32' 카테고리의 다른 글
ESP32 슬라이더가 있는 웹 서버: LED 밝기 제어(PWM) (0) | 2025.01.15 |
---|---|
ESP32 이벤트 사용 Web Server(센서값 자동 업데이트) (0) | 2025.01.14 |
HTTP POST Web APIs, ThingSpeak 및 IFTTT.com (0) | 2025.01.14 |
ESP32 Bluetooth Classic과 Arduino IDE (1) | 2025.01.14 |
ESP32 HTTP GET 및 HTTP POST와 JSON, URL 인코딩, 텍스트 (0) | 2025.01.13 |
ESP32 SIM800L 문자 메시지(SMS 알림) 보내기 (0) | 2025.01.10 |
ESP32 SMTP 서버를 사용하여 이메일 보내기 (0) | 2025.01.10 |
ESP32 및 ESP8266을 사용한 ESP-MESH 시작하기 (1) | 2025.01.09 |
더욱 좋은 정보를 제공하겠습니다.~ ^^