본문 바로가기

ESP32

ESP32 DS18B20 온도 센서(단일, 다중, 웹 서버)

반응형

 

 

Arduino IDE를 사용한 ESP32 DS18B20 온도 센서(단일, 다중, 웹 서버)

 

이 가이드는 Arduino IDE를 사용한 ESP32를 사용한 DS18B20 온도 센서에 대한 심층 가이드입니다. 센서를 배선하고, 필요한 라이브러리를 설치하고, 하나 또는 여러 개의 센서에서 센서 판독값을 가져오는 코드를 작성하는 방법을 보여드리겠습니다. 마지막으로 센서 판독값을 표시하는 간단한 웹 서버를 빌드합니다.

 

 

Arduino IDE를 사용한 DS18B20 온도 센서가 있는 ESP32

 

다른 DS18B20 가이드도 읽어보시기를 바랍니다.

 

 

DS18B20 온도 센서 소개

 

DS18B20 온도 센서는 1선 디지털 온도 센서입니다. 즉, ESP32와 통신하려면 데이터 라인(및 GND) 하나만 있으면 됩니다.

 

외부 전원 공급 장치에서 전원을 공급받을 수도 있고 데이터 라인에서 전원을 공급받을 수도 있습니다("기생 모드"라고 함). 이렇게 하면 외부 전원 공급 장치가 필요 없습니다.

 

 

DS18B20 온도 센서 핀아웃 핀

 

각 DS18B20 온도 센서에는 고유한 64비트 직렬 코드가 있습니다. 이를 통해 여러 센서를 동일한 데이터 와이어에 연결할 수 있습니다. 따라서 GPIO 하나만 사용하여 여러 센서에서 온도를 얻을 수 있습니다.

 

DS18B20 온도 센서는 방수 버전으로도 제공됩니다.

 

 

DS18B20 온도 센서 방수 버전

 

다음은 DS18B20 온도 센서의 가장 관련성 있는 사양 요약입니다.

 

  • 1-wire 버스 통신을 통해 통신
  • 전원 공급 범위: 3.0V ~ 5.5V
  • 작동 온도 범위: -55ºC ~ +125 ºC
  • 정확도 +/-0.5 ºC(범위 -10 ºC ~ 85 ºC 사이)

자세한 내용은 DS18B20 데이터시트를 참조하세요.

 

필요한 부품: 이 튜토리얼을 따르려면 다음 부품이 필요합니다.

 

  • ESP32(최고의 ESP32 개발 보드 읽기)
  • DS18B20 온도 센서(하나 또는 여러 개의 센서) - 방수 버전
  • 4.7kΩ 저항기
  • 점퍼 와이어
  • 브레드보드

회로도 – ESP32

 

이전에 언급했듯이 DS18B20 온도 센서는 VDD 핀(일반 모드)을 통해 전원을 공급받을 수도 있고, 데이터 라인(기생 모드)에서 전원을 공급받을 수도 있습니다. 두 모드 중 하나를 선택할 수 있습니다.

 

ESP32를 사용하는 경우 다음 두 회로도 중 하나를 따르세요.

 

기생 모드

 

 

ESP32 기생 모드가 있는 DS18B20 온도 센서 배선 회로도

 

일반 모드

 

 

ESP32가 있는 DS18B20 온도 센서 일반 모드 배선 회로도

 

Arduino IDE 준비

 

Arduino IDE를 사용하여 ESP32를 프로그래밍하므로 진행하기 전에 ESP32 애드온이 설치되어 있는지 확인하세요.

Arduino IDE에 ESP32 보드 설치(Windows, Mac OS X 및 Linux 지침)

 

라이브러리 설치

 

DS18B20 온도 센서와 인터페이스 하려면 Paul Stoffregen의 One Wire 라이브러리와 Dallas Temperature 라이브러리를 설치해야 합니다. 다음 단계에 따라 라이브러리를 설치하세요.

 

1. Arduino IDE를 열고 Sketch > Include Library > Manage Libraries로 이동합니다. Library Manager가 열립니다.

 

2. 검색 상자에 "onewire"를 입력하고 Paul Stoffregen의 OneWire 라이브러리를 설치합니다.

 

Arduino IDE에 Paul Stoffregen의 OneWire 라이브러리 설치

 

3. 그런 다음 "Dallas"를 검색하고 Miles Burton의 DallasTemperature 라이브러리를 설치합니다. 의존성 메시지 창이 나타나면 모두 설치해 주시면 됩니다. 

 

Arduino IDE에 Miles Burton의 DallasTemperature 라이브러리 설치

 

라이브러리를 설치한 후 Arduino IDE를 다시 시작합니다.

 

코드(단일 DS18B20)

 

필요한 라이브러리를 설치한 후 코드를 ESP32에 업로드할 수 있습니다. 다음 코드는 DS18B20 온도 센서에서 온도를 읽고 Arduino IDE 직렬 모니터에 판독값을 표시합니다.

 

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com  
*********/

#include <OneWire.h>
#include <DallasTemperature.h>

// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;     

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

void setup() {
  // Start the Serial Monitor
  Serial.begin(115200);
  // Start the DS18B20 sensor
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures(); 
  float temperatureC = sensors.getTempCByIndex(0);
  float temperatureF = sensors.getTempFByIndex(0);
  Serial.print(temperatureC);
  Serial.println("ºC");
  Serial.print(temperatureF);
  Serial.println("ºF");
  delay(5000);
}

 

시리얼 모니터로 확인한 결과는 아래 화면과 같습니다.

 

시리얼 모니터 화면 출력

 

 

DS18B20 온도 센서에서 온도를 가져오는 방법은 여러 가지가 있습니다. 그러나 단일 센서만 사용하는 경우 이 방법이 가장 쉽고 간단합니다.

 

 

ESP32 및 Arduino IDE를 사용한 DS18B20 단일 OneWire 온도 센서

 

코드 작동 방식

 

먼저 OneWire 및 DallasTemperature 라이브러리를 포함합니다.

 

#include <OneWire.h>
#include <DallasTemperature.h>

 

온도 센서에 필요한 인스턴스를 만듭니다. 온도 센서는 GPIO 4에 연결됩니다.

 

// DS18B20이 연결된 GPIO
const int oneWireBus = 4;
// OneWire 장치와 통신할 수 있도록 oneWire 인스턴스 설정
OneWire oneWire(oneWireBus);
// oneWire 참조를 Dallas Temperature 센서에 전달
DallasTemperature sensor(&oneWire);

 

 

setup()에서 시리얼 모니터를 115200의 전송 속도로 초기화합니다.

 

Serial.begin(115200);

 

DS18B20 온도 센서를 초기화합니다.

 

sensors.begin();

 

실제로 온도를 얻기 전에 requestTemperatures() 메서드를 호출해야 합니다.

 

sensor.requestTemperatures();

 

그런 다음 아래에 표시된 대로 getTempCByIndex() 메서드를 사용하여 섭씨온도를 가져옵니다.

 

float temperatureC = sensor.getTempCByIndex(0);

 

또는 getTempFByIndex()를 사용하여 화씨온도를 가져옵니다.

 

float temperatureF = sensor.getTempFByIndex(0);

 

getTempCByIndex() 및 getTempFByIndex() 메서드는 온도 센서의 인덱스를 허용합니다. 센서를 하나만 사용하므로 인덱스는 0입니다. 두 개 이상의 센서를 읽으려면 한 센서에는 인덱스 0을 사용하고 다른 센서에는 인덱스 1을 사용하는 식으로 합니다.

 

마지막으로 직렬 모니터에 결과를 인쇄합니다.

 

Serial.print(temperatureC);
Serial.println("ºC");
Serial.print(temperatureF);
Serial.println("ºF");

 

 

5초마다 새로운 온도 판독값이 요청됩니다.

 

delay(5000);

 

데모

 

코드를 업로드한 후 직렬 모니터에 센서 판독값이 표시되어야 합니다.

 

Arduino IDE 직렬 모니터에서 DS18B20 온도 판독값

 

 

여러 DS18B20 온도 센서에서 온도 가져오기

 

DS18B20 여러 온도 센서 OneWire with ESP32 및 Arduino IDE

 

DS18B20 온도 센서는 1와이어 프로토콜을 사용하여 통신하며 각 센서에는 고유한 64비트 직렬 코드가 있으므로 단일 GPIO만 사용하여 여러 센서의 온도를 읽을 수 있습니다. 다음 회로도에 표시된 대로 모든 데이터 라인을 함께 연결하기만 하면 됩니다.

 

DS18B20 ESP32 배선 회로도가 있는 여러 온도 센서

 

코드(여러 DS18B20)

 

그런 다음 코드를 업로드합니다. GPIO 4의 모든 장치를 스캔하여 각 장치의 온도를 인쇄합니다. (이 스케치는 DallasTemperature 라이브러리에서 제공하는 예제를 기반으로 합니다.)

 

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com  
*********/

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged TO GPIO 4
#define ONE_WIRE_BUS 4

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Number of temperature devices found
int numberOfDevices;

// We'll use this variable to store a found device address
DeviceAddress tempDeviceAddress; 

void setup(){
  // start serial port
  Serial.begin(115200);
  
  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  
  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // Loop through each device, print out address
  for(int i=0;i<numberOfDevices; i++){
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i)){
      Serial.print("Found device ");
      Serial.print(i, DEC);
      Serial.print(" with address: ");
      printAddress(tempDeviceAddress);
      Serial.println();
    } else {
      Serial.print("Found ghost device at ");
      Serial.print(i, DEC);
      Serial.print(" but could not detect address. Check power and cabling");
    }
  }
}

void loop(){ 
  sensors.requestTemperatures(); // Send the command to get temperatures
  
  // Loop through each device, print out temperature data
  for(int i=0;i<numberOfDevices; i++){
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i)){
      // Output the device ID
      Serial.print("Temperature for device: ");
      Serial.println(i,DEC);
      // Print the data
      float tempC = sensors.getTempC(tempDeviceAddress);
      Serial.print("Temp C: ");
      Serial.print(tempC);
      Serial.print(" Temp F: ");
      Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
    }
  }
  delay(5000);
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress) {
  for (uint8_t i = 0; i < 8; i++){
    if (deviceAddress[i] < 16) Serial.print("0");
      Serial.print(deviceAddress[i], HEX);
  }
}

 

데모

 

 

 

이 예제에서는 세 개의 DS18B20 온도 센서를 사용합니다. Arduino IDE 직렬 모니터에서 얻는 결과입니다.

 

 

ESP32 여러 DS18B20 온도 센서 직렬 모니터 인쇄 판독

 

여러 DS18B20 온도 센서를 EPS32에 연결하는 방법에 대한 전담 문서가 있습니다. 다음 튜토리얼을 따르세요.

 

 

여러 DS18B20 온도 센서가 있는 ESP32 Arduino IDE

 

 

 

웹 서버에 DS18B20 온도 판독값 표시

 

Arduino IDE를 사용하여 ESP32 웹 서버에 DS18B20 온도 판독값 표시

 

 

웹 서버를 빌드하기 위해 비동기 웹 서버를 빌드하는 쉬운 방법을 제공하는 ESPAsyncWebServer 라이브러리를 사용합니다. 비동기 웹 서버를 빌드하는 데는 여러 가지 이점이 있습니다. GitHub 페이지에서 라이브러리 설명서를 간단히 살펴보는 것이 좋습니다.

 

ESPAsyncWebServer 및 AsyncTCP 라이브러리 설치

 

이 프로젝트의 웹 서버를 빌드하려면 Arduino IDE에 다음 라이브러리를 설치해야 합니다.

 

ESPAsyncWebServer, AsynTCP 및 ESPAsyncTCP 라이브러리는 Arduino 라이브러리 관리자를 통해 설치할 수 없으므로 라이브러리 파일을 Arduino 설치 라이브러리 폴더에 복사해야 합니다. 또는 Arduino IDE에서 Sketch > 라이브러리 포함 > .zip 라이브러리 추가로 이동하여 방금 다운로드한 라이브러리를 선택할 수 있습니다.

 

코드(DS18B20 비동기 웹 서버)

 

Arduino IDE를 열고 다음 코드를 복사합니다.

 

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com  
*********/

// Import required libraries
#ifdef ESP32
  #include <WiFi.h>
  #include <ESPAsyncWebServer.h>
#else
  #include <Arduino.h>
  #include <ESP8266WiFi.h>
  #include <Hash.h>
  #include <ESPAsyncTCP.h>
  #include <ESPAsyncWebServer.h>
#endif
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is connected to GPIO 4
#define ONE_WIRE_BUS 4

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

// Variables to store temperature values
String temperatureF = "";
String temperatureC = "";

// Timer variables
unsigned long lastTime = 0;  
unsigned long timerDelay = 30000;

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

String readDSTemperatureC() {
  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
  sensors.requestTemperatures(); 
  float tempC = sensors.getTempCByIndex(0);

  if(tempC == -127.00) {
    Serial.println("Failed to read from DS18B20 sensor");
    return "--";
  } else {
    Serial.print("Temperature Celsius: ");
    Serial.println(tempC); 
  }
  return String(tempC);
}

String readDSTemperatureF() {
  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
  sensors.requestTemperatures(); 
  float tempF = sensors.getTempFByIndex(0);

  if(int(tempF) == -196){
    Serial.println("Failed to read from DS18B20 sensor");
    return "--";
  } else {
    Serial.print("Temperature Fahrenheit: ");
    Serial.println(tempF);
  }
  return String(tempF);
}

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .units { font-size: 1.2rem; }
    .ds-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
  </style>
</head>
<body>
  <h2>ESP DS18B20 Server</h2>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="ds-labels">Temperature Celsius</span> 
    <span id="temperaturec">%TEMPERATUREC%</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="ds-labels">Temperature Fahrenheit</span>
    <span id="temperaturef">%TEMPERATUREF%</span>
    <sup class="units">&deg;F</sup>
  </p>
</body>
<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperaturec").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperaturec", true);
  xhttp.send();
}, 10000) ;
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperaturef").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperaturef", true);
  xhttp.send();
}, 10000) ;
</script>
</html>)rawliteral";

// Replaces placeholder with DS18B20 values
String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATUREC"){
    return temperatureC;
  }
  else if(var == "TEMPERATUREF"){
    return temperatureF;
  }
  return String();
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);
  Serial.println();
  
  // Start up the DS18B20 library
  sensors.begin();

  temperatureC = readDSTemperatureC();
  temperatureF = readDSTemperatureF();

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  Serial.println("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  
  // Print ESP Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });
  server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", temperatureC.c_str());
  });
  server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", temperatureF.c_str());
  });
  // Start server
  server.begin();
}
 
void loop(){
  if ((millis() - lastTime) > timerDelay) {
    temperatureC = readDSTemperatureC();
    temperatureF = readDSTemperatureF();
    lastTime = millis();
  }  
}

 

다음 변수에 네트워크 자격 증명을 삽입하면 코드가 바로 작동합니다.

 

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

 

 

코드 작동 방식

 

다음 단락에서는 코드 작동 방식을 설명합니다. 자세히 알아보려면 계속 읽거나 "데모" 섹션으로 이동하여 최종 결과를 확인하세요.

 

라이브러리 가져오기

 

먼저 ESP32 보드에 필요한 라이브러리를 가져옵니다.

 

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>

 

DS18B20 센서 인스턴스화

DS18B20 데이터 핀이 연결된 GPIO를 정의합니다. 이 경우 GPIO 4에 연결됩니다.

 

#define ONE_WIRE_BUS 4

 

센서를 초기화하는 데 필요한 인스턴스를 인스턴스화합니다.

 

// OneWire 장치와 통신할 수 있도록 oneWire 인스턴스 설정
OneWire oneWire(ONE_WIRE_BUS);

// Dallas Temperature 센서에 oneWire 참조를 전달합니다.
DallasTemperature 센서(&oneWire);

 

네트워크 자격 증명 설정

 

다음 변수에 네트워크 자격 증명을 삽입하여 ESP8266이 로컬 네트워크에 연결할 수 있도록 합니다.

 

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

 

포트 80에서 AsyncWebServer 객체를 만듭니다.

 

AsyncWebServer server(80);

 

온도 함수 읽기

 

그런 다음 온도를 읽는 두 가지 함수를 만듭니다. readDSTemperatureC() 함수는 섭씨 온도로 판독값을 반환합니다.

 

String readDSTemperatureC() {
  // 버스의 모든 장치에 글로벌 온도 및 요청을 발행하기 위해 sensor.requestTemperatures()를 호출합니다.
  sensors.requestTemperatures(); 
  float tempC = sensors.getTempCByIndex(0);

  if(tempC == -127.00){
    Serial.println("Failed to read from DS18B20 sensor");
    return "--";
  } else {
    Serial.print("Temperature Celsius: ");
    Serial.println(tempC); 
  }
  return String(tempC);
}

 

센서가 유효한 판독값을 얻을 수 없는 경우 -127을 반환합니다. 따라서 센서가 판독값을 가져오지 못하는 경우 두 개의 대시(--)를 반환하는 if 문이 있습니다.

 

if(tempC == -127.00){ Serial.println("DS18B20 센서에서 읽지 못했습니다"); return "--";

 

reaDSTemperatureF() 함수는 비슷한 방식으로 작동하지만 화씨로 판독값을 반환합니다. 판독값은 문자열 유형으로 반환됩니다. 부동 소수점을 문자열로 변환하려면 String() 함수를 사용합니다.

 

return String(tempC);

 

웹 페이지 빌드

 

다음 단계는 웹 페이지를 빌드하는 것입니다. 웹 페이지를 빌드하는 데 필요한 HTML과 CSS는 index_html 변수에 저장됩니다.

 

HTML 텍스트에서 % 기호 사이에 TEMPERATUREC와 TEMPERATUREF가 있습니다. 이것은 온도 값의 플레이스홀더입니다.

 

즉, 이 %TEMPERATUREC% 텍스트는 센서의 실제 온도 값으로 대체되는 변수와 같습니다. HTML 텍스트의 플레이스홀더는 % 기호 사이에 있어야 합니다.

 

이전 튜토리얼에서 이 웹 서버에서 사용되는 HTML과 CSS가 어떻게 작동하는지 자세히 설명했습니다. 따라서 자세히 알아보려면 다음 프로젝트를 참조하세요.

 

Arduino IDE를 사용한 DHT11/DHT22 온도 및 습도 웹 서버

 

프로세서

 

이제 HTML 텍스트의 플레이스홀더를 실제 온도 값으로 대체하는 processor() 함수를 만들어야 합니다.

 

String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATUREC"){
    return readDSTemperatureC();
  }
  else if(var == "TEMPERATUREF"){
    return readDSTemperatureF();
  }
  return String();
}

 

웹 페이지가 요청되면 HTML에 플레이스홀더가 있는지 확인합니다. %TEMPERATUREC% 플레이스홀더를 찾으면 이전에 만든 readDSTemperatureC() 함수를 호출하여 섭씨 온도를 반환합니다.

 

if(var == "TEMPERATUREC"){
  return readDSTemperatureC();
}

 

자리 표시자가 %TEMPERATUREF%인 경우 화씨 단위의 온도를 반환합니다.

 

else if(var == "TEMPERATUREF"){
  return readDSTemperatureF();
}

 

setup()

 

setup()에서 디버깅 목적으로 직렬 모니터를 초기화합니다.

 

Serial.begin(115200);

 

DS18B20 온도 센서를 초기화합니다.

 

sensor.begin();

 

로컬 네트워크에 연결하고 ESP32 IP 주소를 인쇄합니다.

 

WiFi.begin(ssid, password);
Serial.println("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println();

// Print ESP8266 Local IP Address
Serial.println(WiFi.localIP());

 

 

마지막으로 웹 서버를 처리하기 위한 다음 코드 줄을 추가합니다.

 

server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html, processor);
});
server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", readDSTemperatureC().c_str());
});
server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", readDSTemperatureF().c_str());
});

 

 

루트 URL에서 요청을 하면 index_html 변수에 저장된 HTML 텍스트를 보냅니다. 또한 모든 플레이스홀더를 올바른 값으로 대체하는 프로세서 함수를 전달해야 합니다.

 

server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html, processor);
});

 

온도 판독값을 업데이트하려면 두 개의 추가 핸들러를 추가해야 합니다. /temperaturec URL에서 요청을 받으면 업데이트된 온도 값을 보내기만 하면 됩니다. 일반 텍스트이며 char로 보내야 하므로 c_str() 메서드를 사용합니다.

 

server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", readDSTemperatureC().c_str());
});

 

화씨 온도에 대해서도 동일한 프로세스를 반복합니다.

 

server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", readDSTemperatureF().c_str());
});

 

마지막으로 서버를 시작할 수 있습니다.

 

server.begin();

 

이것은 비동기 웹 서버이므로 loop()에 아무것도 쓸 필요가 없습니다.

 

void loop(){

}

 

이것이 코드의 작동 방식입니다.

 

데모

 

코드를 업로드한 후 Arduino IDE 직렬 모니터를 115200의 전송 속도로 엽니다. ESP32 온보드 RST 버튼을 누르면 몇 초 후에 IP 주소가 표시됩니다.

 

로컬 네트워크에서 브라우저를 열고 ESP32 IP 주소를 입력합니다.

 

이제 웹 서버에서 섭씨와 화씨로 온도를 볼 수 있습니다. 센서 판독값은 웹 페이지를 새로 고칠 필요 없이 자동으로 업데이트됩니다.

 

 

DS18B20 OneWire 온도 센서 Arduino IDE가 있는 ESP32 웹 서버

 

마무리

 

이 튜토리얼이 도움이 되었기를 바랍니다. ESP32와 함께 사용할 수 있는 다른 센서와 모듈에 대한 가이드가 있습니다.

 

 

읽어주셔서 감사합니다. 배움을 멈추지 마세요.

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^