Search Code

레슨 31/31: SunFounder 키트의 DHT11과 ESP01을 사용하여 Wi-Fi로 온도와 습도 측정하기

레슨 31/31: SunFounder 키트의 DHT11과 ESP01을 사용하여 Wi-Fi로 온도와 습도 측정하기

이 프로젝트 가이드는 ESP8266(ESP-01) 모듈과 DHT11 센서를 사용하여 무선 온습도 모니터링 시스템을 구축하는 과정을 안내합니다. 완료하면 자체 웹 서버를 생성하는 장치를 갖게 되어, 스마트폰, 태블릿, 컴퓨터 등 로컬 네트워크에 연결된 모든 기기에서 실시간 센서 판독값을 볼 수 있습니다. 이는 센서의 물리적 세계와 웹 인터페이스의 디지털 세계를 연결하는 방법을 보여주는 기초적인 IoT 프로젝트입니다.

ESP8266 ESP01 모듈

여기서 배우는 기술은 매우 활용도가 높습니다. 이 정확한 설정은 다음과 같은 다양한 실용적인 응용 분야에 적용할 수 있습니다:

  • 최적의 생육 조건을 보장하기 위한 온실이나 정원용 원격 모니터링 스테이션 구축.
  • 와인 저장고나 아기 방과 같은 특정 방의 기후를 모니터링하는 간단한 홈 자동화 시스템 만들기.
  • 학교 과학 프로젝트를 위한 저비용 환경 데이터 로거 설정.
  • 갑작스러운 온도 변화를 알려주는 기본적인 보안 또는 경보 시스템 개발.

하드웨어 및 부품

이 프로젝트를 따라 하려면 다음 부품이 필요합니다. 주요 부품은 ESP8266 모듈과 DHT11 센서이지만, 나머지 부품은 모듈을 프로그래밍하고 전원을 공급하는 데 필수적입니다.

  • ESP8266(ESP-01S) 모듈: Wi-Fi 기능이 내장된 핵심 마이크로컨트롤러.
  • DHT11 온습도 센서: 환경 데이터를 측정하는 센서.
  • Arduino Uno 보드(USB-시리얼 변환용): 이 프로젝트에서 메인 Arduino 보드는 처리 능력에 사용되지 않습니다. 대신 USB-시리얼 칩이 ESP8266 모듈을 프로그래밍하는 데 사용됩니다.
  • 330옴 저항: 초기 LED 점멸 테스트에서 전류를 제한하는 데 사용됩니다.
  • 1k옴 ~ 10k옴 저항: DHT11 센서의 데이터 라인용 풀업 저항.
  • LED 및 점퍼 와이어: 테스트 단계와 모든 필요한 연결을 만드는 데 사용됩니다.
  • 브레드보드: 회로 연결을 만드는 데 사용됩니다.

배선 가이드

Sunfounder 3-in-1 강좌 31과를 위한 esp8266 ESP01 및 DHT11 배선

배선 과정은 단계적으로 진행됩니다. 먼저 ESP-01을 프로그래밍하기 위한 기본 회로를 설정합니다. 여기에는 Arduino Uno를 프로그래머로 사용하는 것이 포함됩니다. 비디오에서 이 설정을 명확하게 보여줍니다. 주요 연결은 다음과 같습니다:

프로그래밍 모드로 전환하려면 IO1(GPIO1) 핀을 접지(GND)에 연결해야 합니다. 이렇게 하면 ESP8266이 새 펌웨어를 기다리게 됩니다. 프로그래밍을 위한 나머지 연결은 다음과 같습니다:

  • VCC(3.3V)를 EN(Enable)에 연결: 모듈을 활성화합니다.
  • GND를 GND에 연결: 회로의 공통 접지.
  • VCC(5V)를 VCC(5V)에 연결: 프로그래머 보드에 전원을 공급합니다.
  • RX(ESP)를 TX(Arduino)에 연결: 프로그래머에서 모듈로의 시리얼 통신용.
  • TX(ESP)를 RX(Arduino)에 연결: 모듈에서 프로그래머로의 시리얼 통신용.
  • RST(리셋)를 GND에 연결: 프로그래밍 후 모듈을 리셋하는 데 사용되는 임시 연결입니다.

ESP-01이 프로그래밍되면 센서 배선은 간단합니다. DHT11 센서는 안정적인 통신을 보장하기 위해 데이터 라인에 풀업 저항이 필요합니다.

센서 설정의 배선은 다음과 같습니다:

  • DHT11 VCC(핀 1)를 3.3V에 연결: 센서용 전원.
  • DHT11 DATA(핀 2)를 ESP-01의 GPIO2(IO2)에 연결: 센서 판독용 데이터 라인. 이 데이터 라인과 3.3V 전원 라인 사이에 1k옴 ~ 10k옴 풀업 저항을 연결해야 합니다.
  • DHT11 GND(핀 4)를 GND에 연결: 센서용 공통 접지.

Arduino IDE 준비

ESP8266을 프로그래밍하려면 먼저 Arduino IDE에 보드 지원을 추가해야 합니다. 이는 두 단계로 수행됩니다:

  1. 보드 매니저 URL 추가: 파일 > 기본 설정으로 이동합니다. "추가적인 보드 매니저 URLs" 필드에 다음 URL을 붙여넣습니다: http://arduino.esp8266.com/stable/package_esp8266com_index.json 그리고 "확인"을 클릭합니다.
  2. ESP8266 보드 패키지 설치: 도구 > 보드 > 보드 매니저...로 이동합니다. "esp8266"을 검색하고 "ESP8266 Community의 esp8266"을 찾아 "설치"를 클릭합니다. 설치 후 도구 > 보드 > ESP8266 Boards > Generic ESP8266 Module로 이동하여 보드를 선택할 수 있습니다.

DHT 센서 라이브러리 설치

코드는 DHT11 센서와 인터페이스하기 위해 라이브러리에 의존합니다. 이 라이브러리는 Arduino IDE에 설치해야 합니다.

  1. 도구 > 라이브러리 관리...로 이동합니다.
  2. "DHT sensor library"를 검색합니다.
  3. Adafruit의 라이브러리를 찾아 "설치"를 클릭합니다. 이 라이브러리는 센서에서 데이터를 읽는 과정을 단순화합니다.

프로젝트 1: LED 점멸 테스트

센서를 다루기 전에 ESP-01을 성공적으로 프로그래밍할 수 있는지 확인하는 것이 중요합니다. 이는 전형적인 "Blink" 예제를 통해 수행됩니다. 비디오는 컴파일된 바이너리를 내보내고 별도의 배치 파일을 사용하여 플래시하는 과정을 보여주며, 이는 특정 USB-직렬 설정에 대한 해결 방법입니다. 목표는 온보드 LED가 깜빡이는 것을 확인하여 프로그래밍 체인이 작동하는지 확인하는 것입니다. 프로그래밍 후 모듈을 실행하려면 IO1을 GND에 연결하는 전선을 분리한 다음 RST 핀을 GND에 잠시 연결하여 모듈을 리셋해야 합니다.

프로젝트 2: 직렬 모니터에서 DHT11 읽기

프로그래밍이 확인되면 다음 단계는 DHT11 센서를 연결하고 데이터를 읽는 것입니다. 이 프로젝트는 Adafruit DHT 센서 라이브러리의 DHTtester 예제를 사용합니다. 코드는 올바른 핀과 센서 유형을 사용하도록 구성되어 있습니다. 이 프로그램을 플래시한 후 직렬 모니터(9600 보드로 설정)를 열어 온도와 습도 판독값을 확인할 수 있습니다.

프로젝트 3: 웹 서버 설정

마지막 프로젝트는 모든 것을 결합합니다. ESP8266은 로컬 Wi-Fi 네트워크에 연결하고 간단한 웹 페이지를 호스팅하도록 프로그래밍됩니다. 이 페이지는 실시간 온도와 습도 판독값을 표시합니다. 코드는 ESP8266 "HelloServer" 예제의 수정된 버전입니다. 비디오는 동일한 네트워크에 연결된 모든 장치의 웹 브라우저에 장치의 IP 주소 또는 mDNS 이름(예: robojaxDHT.local)을 입력하여 이 데이터에 액세스하는 방법을 보여줍니다.

코드 설명

전체 프로그램은 다운로드할 수 있으므로, 이 섹션에서는 사용자가 자신의 네트워크와 선호도에 맞게 조정해야 하는 주요 사용자 구성 변수에 초점을 맞춥니다. 코드는 ESP8266 "HelloServer" 예제의 수정된 버전입니다. 핵심 로직은 센서를 읽고 데이터를 표시할 HTML 페이지를 구성하는 것입니다.

수정해야 할 코드의 중요한 부분은 다음과 같습니다:

// Wi-Fi 자격 증명 - 반드시 변경해야 합니다
const char* ssid = "YourWiFiSSID"; // Wi-Fi 네트워크 이름으로 교체
const char* password = "YourWiFiPassword"; // Wi-Fi 비밀번호로 교체

이것이 가장 중요한 변경 섹션입니다. ssidpassword 변수는 로컬 Wi-Fi 네트워크와 정확히 일치해야 합니다. Wi-Fi 이름은 대소문자를 구분하므로 올바르게 입력해야 합니다.

// DHT11 센서 구성
#define DHTPIN 2     // DHT 센서에 연결된 디지털 핀 (GPIO2)
#define DHTTYPE DHT11   // DHT 11 센서 유형

이 정의는 센서를 설정합니다. DHTPIN은 센서의 데이터 라인이 연결된 ESP8266의 GPIO 핀입니다(이 가이드에서는 GPIO2). DHTTYPE은 특정 센서 모델을 정의합니다. DHT22 센서를 사용하는 경우 DHT22 줄의 주석을 해제하고 DHT11 줄을 주석 처리하면 됩니다.

// 구성 가능한 변수
const long interval = 3000; // 센서 판독 사이의 밀리초
char temperature[] = "00.0";
char humidity[] = "00.0";

interval 변수는 센서를 읽고 웹 페이지를 업데이트하는 빈도를 제어합니다. 기본값은 3000밀리초(3초)입니다. 업데이트 빈도를 줄이려면 5000 또는 10000과 같은 더 높은 값으로 늘릴 수 있습니다.

코드에는 온도 판독값을 형식화하는 함수도 포함되어 있습니다. sendTemperature() 함수의 로직을 수정하여 온도를 섭씨 또는 화씨로 표시하도록 선택할 수 있습니다. 비디오는 Tvalue 변수가 섭씨 판독값을 보유하도록 설정되어 있지만, 대신 화씨 변수 F를 사용하도록 변경할 수 있다고 설명합니다.

라이브 프로젝트 데모

비디오에서 완성된 프로젝트가 시연됩니다. 코드가 플래시되고 모듈이 리셋된 후 Wi-Fi 네트워크에 연결됩니다. 직렬 모니터는 연결 상태와 장치의 IP 주소를 표시합니다. 웹 브라우저에서 이 IP 주소로 이동하면 현재 온도와 습도를 표시하는 간단한 페이지를 볼 수 있습니다. 데모는 판독값이 실시간으로 업데이트되는 것을 보여줍니다. DHT11 센서를 히트건으로 가열하면 웹 페이지의 온도 판독값이 그에 따라 증가합니다. 센서의 데이터 전선이 분리되면 페이지에 센서 값이 "None"으로 표시되며, 이는 유용한 문제 해결 기능입니다.

챕터

  • [00:00] 프로젝트 소개
  • [01:33] ESP8266 및 웹 서버 이해
  • [05:47] 프로그래밍을 위한 ESP-01 배선
  • [08:51] Arduino IDE에 ESP8266 보드 지원 설치
  • [11:47] 프로젝트 1: ESP8266으로 LED 깜빡이기
  • [20:28] DHT11 센서 배선
  • [22:34] DHT 센서 라이브러리 설치
  • [23:13] 프로젝트 2: 직렬 모니터에서 DHT11 읽기
  • [30:10] 웹 서버 프로젝트 코드 설명
  • [36:14] 프로젝트 3: 웹 서버 코드 플래시
  • [38:42] 데모: Wi-Fi를 통한 온도 확인
  • [41:43] 결론 및 문제 해결

이미지

ESP8266 ESP01 module
ESP8266 ESP01 module
esp8266 ESP01 and DHT11 wiring for lesson 31 Sunfounder 3-in-1 course
esp8266 ESP01 and DHT11 wiring for lesson 31 Sunfounder 3-in-1 course
895-Lesson 31/31: DHT11 and ESP01 over WiFi code
언어: C++

 /*
 * Display temperature using DHT11, DHT22 with NodeMCU ESP8266 
 * over WiFi in local network on computer o mobile devices
 * 
 * Written by Ahmad Shamshiri on Sep 27, 2019
 * in Ajax, Ontario, Canada
 * Watch video instruciton for this video: https://youtu.be/1A4-6hDARQc
 * 
 * I have combined DHT library of Adafruit with ESP8266 WebServer both links 
 * Adafruit DHT library on GitHub: https://github.com/adafruit/DHT-sensor-library
 * and 
 * ESP8266 on GitHub : https://github.com/esp8266/Arduino
 * Download and resource page https://robojax.com/RJT614

 * 
Get this code and other Arduono codes from Robojax.com


 * Code is available at https://robojax.com/RJT614
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>. 

*/

const int refresh=3;//3 seconds
// DHT settings starts
#include "DHT.h"
#define DHTPIN 2     // what digital pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
float tValue, hValue;// 
char *simipleName="robojaxDHT";//android
// ****** DHT settings end (Robojax.com )


#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#ifndef STASSID
#define STASSID "Robojax" // Your WiFi SSID
#define STAPSK  "100%Right" //Your WiFi password
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);


void sendTemp() {

  String page = "<!DOCTYPE html>";
  page +="    <meta http-equiv='refresh' content='";
  page += String(refresh);// how often temperature is read
  page +="'/>";  
  page +="<html dir=\"rtl\">";
  page +="<body>"; 
  page +="<h1>&#1585;&#1591;&#1608;&#1576;&#1578; &#1608; &#1581;&#1585;&#1575;&#1585;&#1578; &#1578;&#1608;&#1587;&#1591; &#1583;&#1740; &#1575;&#1670; &#1578;&#1740;</h1>";
      
  page +="<p style=\"font-size:150px;\">&#1581;&#1585;&#1575;&#1585;&#1578;<br/>";  
  page +="<span style=\"color:red; font-size:150px;\">";
  page += String(tValue, 2);
  page +="&#176C</p>";

  page +="<p style=\"font-size:150px;\">&#1585;&#1591;&#1608;&#1576;&#1578;<br/>";  
  page +="<span style=\"color:red; font-size:150px;\">";
  page += String(hValue, 2);
  page +="%</p>";  
      
  page +="</body>";  
  page +="</html>";  
 server.send(200,  "text/html",page);

}

void handleNotFound() {
 
  String message = "File Not Found";
  message += "URI: ";
  message += server.uri();
  message += "Method: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "Arguments: ";
  message += server.args();
  message += "";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "";
  }
  server.send(404, "text/plain", message);

}

void setup(void) {
  // Robojax.com code for ESP8266 and DHT11 DHT22
   dht.begin();
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  if (WiFi.status() == WL_CONNECTED)
  {
    uint8_t macAddr[6];
    WiFi.macAddress(macAddr);
    Serial.printf("Connected, mac address: %02x:%02x:%02x:%02x:%02x:%02x", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
  }  
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin(simipleName)) {
    Serial.print("or view http://");
    Serial.println(simipleName);
  }

  server.on("/", sendTemp);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  // Robojax.com code for ESP8266 and DHT11 DHT22
  server.handleClient();
  MDNS.update();//multicast DNS
  float c = dht.readTemperature();// Read temperature as Celsius (the default)
  float h = dht.readHumidity();// Reading humidity 
  float f = dht.readTemperature(true);// Read temperature as Fahrenheit (isFahrenheit = true)
    Serial.print(c);
    Serial.println(F("°C "));
 tValue =c;//save temperature for display
 hValue =h;//save humidity for display
  delay(300);// change this to larger value (1000 or more) if you don't need very often reading
  // Robojax.com code for ESP8266 and DHT11 DHT22
}

자원 및 참고자료

아직 자원이 없습니다.

파일📁

아두이노 코드 (.ino)

프리징 파일

사용자 매뉴얼