Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 91视频在线观看网站,亚洲一区二区三区四区在线观看,亚洲欧洲日产国产最新

          整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢(xún)熱線(xiàn):

          ESP32 DHT11 / DHT22 Web服務(wù)器

          SP32 DHT11 / DHT22 Web服務(wù)器–使用Arduino IDE的溫度和濕度

          在本項(xiàng)目中,您將學(xué)習(xí)如何使用DHT11或DHT22來(lái)構(gòu)建異步ESP32 Web服務(wù)器,該服務(wù)器使用Arduino IDE顯示溫度和濕度。


          我們將構(gòu)建的網(wǎng)絡(luò)服務(wù)器無(wú)需刷新網(wǎng)頁(yè)即可自動(dòng)更新讀數(shù)。

          通過(guò)這個(gè)項(xiàng)目,您將學(xué)到:

          · 如何從DHT傳感器讀取溫度和濕度;

          · 使用ESPAsyncWebServer庫(kù)構(gòu)建異步Web服務(wù)器;

          · 自動(dòng)更新傳感器讀數(shù),而無(wú)需刷新網(wǎng)頁(yè)。


          異步Web服務(wù)器

          為了構(gòu)建Web服務(wù)器,我們將使用ESPAsyncWebServer庫(kù),該提供了一種構(gòu)建異步Web服務(wù)器的簡(jiǎn)便方法。如庫(kù)GitHub頁(yè)面中所述,構(gòu)建異步Web服務(wù)器具有多個(gè)優(yōu)點(diǎn),例如:

          · "同時(shí)處理多個(gè)連接";

          · "當(dāng)您發(fā)送響應(yīng)時(shí),當(dāng)服務(wù)器負(fù)責(zé)在后臺(tái)發(fā)送響應(yīng)時(shí),您將立即準(zhǔn)備處理其他連接";

          · "用于處理模板的簡(jiǎn)單模板處理引擎";

          · 以及更多。

          所需部件

          要完成本教程,您需要以下部分:

        1. ESP32開(kāi)發(fā)板
        2. DHT22 或 DHT11 溫濕度傳感器
        3. 4.7k歐姆電阻
        4. 面包板
        5. 跳線(xiàn)

        6. 原理圖

          進(jìn)入Web服務(wù)器之前,您需要按照以下示意圖所示將DHT11或DHT22傳感器連接到ESP32。

          在這種情況下,我們將數(shù)據(jù)引腳連接到GPIO 27,但是您可以將其連接到任何其他數(shù)字引腳。您可以將此示意圖用于DHT11和DHT22傳感器。



          (此原理圖使用帶有36個(gè)GPIO的ESP32 DEVKIT V1模塊版本–如果您使用的是其他型號(hào),請(qǐng)檢查所用電路板的引腳排列。)

          注意:如果您使用的模塊帶有DHT傳感器,則通常只有三個(gè)引腳。引腳上應(yīng)標(biāo)有標(biāo)簽,以便您知道如何進(jìn)行接線(xiàn)。此外,這些模塊中的許多模塊已經(jīng)帶有內(nèi)部上拉電阻,因此您無(wú)需在電路中增加一個(gè)。

          安裝庫(kù)

          您需要為此項(xiàng)目安裝幾個(gè)庫(kù):

          · DHT和Adafruit的統(tǒng)一傳感器驅(qū)動(dòng)器庫(kù)讀取DHT傳感器數(shù)據(jù)。

          · ESPAsyncWebServer和Async TCP庫(kù)可構(gòu)建異步Web服務(wù)器。

          按照以下說(shuō)明安裝這些庫(kù):

          安裝DHT傳感器庫(kù)

          要使用Arduino IDE讀取DHT傳感器,您需要安裝DHT傳感器庫(kù) 。請(qǐng)按照以下步驟安裝庫(kù)。

          1. 下載DHT-sensor-library-master .zip文件

          2. 解壓縮.zip文件夾,您應(yīng)該獲得 DHT-sensor-library-master 文件夾

          3. 重命名您的文件夾 到DHT_sensor

          4. 將DHT_sensor 文件夾移至Arduino IDE安裝庫(kù)文件夾

          5. 最后,重新打開(kāi)您的Arduino IDE

          安裝Adafruit統(tǒng)一傳感器驅(qū)動(dòng)程序

          您還需要安裝Adafruit統(tǒng)一傳感器驅(qū)動(dòng)程序庫(kù)才能使用DHT傳感器。請(qǐng)按照以下步驟安裝庫(kù)。

          1. 下載 Adafruit_sensor-master.zip文件

          2. 解壓縮.zip文件夾,您應(yīng)該獲得 Adafruit_sensor-master 文件夾

          3. 重命名您的文件夾 到 Adafruit_sensor

          4. 將Adafruit_sensor文件夾移至Arduino IDE安裝庫(kù)文件夾

          5. 最后,重新打開(kāi)您的Arduino IDE

          安裝ESPAsyncWebServer庫(kù)

          請(qǐng)按照以下步驟安裝 ESPAsyncWebServer庫(kù):

          1. 下載ESPAsyncWebServer-master.zip文件

          2. 解壓縮.zip文件夾,您應(yīng)該得到ESPAsyncWebServer-master文件夾

          3. 重命名您的文件夾 到ESPAsyncWebServer

          4. 將ESPAsyncWebServer 文件夾移至Arduino IDE安裝庫(kù)文件夾

          為ESP32安裝異步TCP庫(kù)

          該 ESPAsyncWebServer庫(kù)需要 AsyncTCP庫(kù)才能工作。請(qǐng)按照以下步驟安裝該庫(kù):

          1. 下載AsyncTCP-master.zip文件

          2. 解壓縮.zip文件夾,您應(yīng)該獲得AsyncTCP-master文件夾

          3. 重命名您的文件夾 到AsyncTCP

          4. 將AsyncTCP文件夾移至Arduino IDE安裝庫(kù)文件夾

          5. 最后,重新打開(kāi)您的Arduino IDE


          程序代碼

          我們將使用Arduino IDE對(duì)ESP32進(jìn)行編程,因此在繼續(xù)之前,請(qǐng)確保已安裝ESP32附加組件:

          打開(kāi)您的Arduino IDE并復(fù)制以下代碼。

          /*********

          Rui Santos

          Complete project details at https://randomnerdtutorials.com

          *********/

          // Import required libraries

          #include "WiFi.h"

          #include "ESPAsyncWebServer.h"

          #include <Adafruit_Sensor.h>

          #include <DHT.h>

          // Replace with your network credentials

          const char* ssid = "REPLACE_WITH_YOUR_SSID";

          const char* password = "REPLACE_WITH_YOUR_PASSWORD";

          #define DHTPIN 27 // Digital pin connected to the DHT sensor

          // Uncomment the type of sensor in use:

          //#define DHTTYPE DHT11 // DHT 11

          #define DHTTYPE DHT22 // DHT 22 (AM2302)

          //#define DHTTYPE DHT21 // DHT 21 (AM2301)

          DHT dht(DHTPIN, DHTTYPE);

          // Create AsyncWebServer object on port 80

          AsyncWebServer server(80);

          String readDHTTemperature() {

          // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

          // Read temperature as Celsius (the default)

          float t = dht.readTemperature();

          // Read temperature as Fahrenheit (isFahrenheit = true)

          //float t = dht.readTemperature(true);

          // Check if any reads failed and exit early (to try again).

          if (isnan(t)) {

          Serial.println("Failed to read from DHT sensor!");

          return "--";

          }

          else {

          Serial.println(t);

          return String(t);

          }

          }

          String readDHTHumidity() {

          // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

          float h = dht.readHumidity();

          if (isnan(h)) {

          Serial.println("Failed to read from DHT sensor!");

          return "--";

          }

          else {

          Serial.println(h);

          return String(h);

          }

          }

          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; }

          .dht-labels{

          font-size: 1.5rem;

          vertical-align:middle;

          padding-bottom: 15px;

          }

          </style>

          </head>

          <body>

          <h2>ESP32 DHT Server</h2>

          <p>

          <i class="fas fa-thermometer-half" style="color:#059e8a;"></i>

          <span class="dht-labels">Temperature</span>

          <span id="temperature">%TEMPERATURE%</span>

          <sup class="units">°C</sup>

          </p>

          <p>

          <i class="fas fa-tint" style="color:#00add6;"></i>

          <span class="dht-labels">Humidity</span>

          <span id="humidity">%HUMIDITY%</span>

          <sup class="units">%</sup>

          </p>

          </body>

          <script>

          setInterval(function ( ) {

          var xhttp = new XMLHttpRequest();

          xhttp.onreadystatechange = function() {

          if (this.readyState == 4 && this.status == 200) {

          document.getElementById("temperature").innerHTML = this.responseText;

          }

          };

          xhttp.open("GET", "/temperature", true);

          xhttp.send();

          }, 10000 ) ;

          setInterval(function ( ) {

          var xhttp = new XMLHttpRequest();

          xhttp.onreadystatechange = function() {

          if (this.readyState == 4 && this.status == 200) {

          document.getElementById("humidity").innerHTML = this.responseText;

          }

          };

          xhttp.open("GET", "/humidity", true);

          xhttp.send();

          }, 10000 ) ;

          </script>

          </html>)rawliteral";

          // Replaces placeholder with DHT values

          String processor(const String& var){

          //Serial.println(var);

          if(var == "TEMPERATURE"){

          return readDHTTemperature();

          }

          else if(var == "HUMIDITY"){

          return readDHTHumidity();

          }

          return String();

          }

          void setup(){

          // Serial port for debugging purposes

          Serial.begin(115200);

          dht.begin();

          // Connect to Wi-Fi

          WiFi.begin(ssid, password);

          while (WiFi.status() != WL_CONNECTED) {

          delay(1000);

          Serial.println("Connecting to WiFi..");

          }

          // Print ESP32 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("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){

          request->send_P(200, "text/plain", readDHTTemperature().c_str());

          });

          server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){

          request->send_P(200, "text/plain", readDHTHumidity().c_str());

          });

          // Start server

          server.begin();

          }

          void loop(){

          }

          將WIFI用戶(hù)名和密碼插入以下變量中,該代碼將立即生效。

          const char* ssid = "REPLACE_WITH_YOUR_SSID";

          const char* password = "REPLACE_WITH_YOUR_PASSWORD";

          代碼如何工作

          在下面的段落中,我們將解釋代碼的工作方式。

          導(dǎo)入庫(kù)

          首先,導(dǎo)入所需的庫(kù)。需要WiFi,ESPAsyncWebServer和ESPAsyncTCP來(lái)構(gòu)建Web服務(wù)器。Adafruit_Sensor和DHT是從DHT11或DHT22傳感器來(lái)讀取數(shù)據(jù)。

          #include "WiFi.h"

          #include "ESPAsyncWebServer.h"

          #include <ESPAsyncTCP.h>

          #include <Adafruit_Sensor.h>

          #include <DHT.h>

          設(shè)置您的WIFI網(wǎng)絡(luò)

          在以下變量中插入您的用戶(hù)名和密碼,以便ESP32可以連接到您的本地WIFI網(wǎng)絡(luò)。

          const char* ssid = "REPLACE_WITH_YOUR_SSID";

          const char* password = "REPLACE_WITH_YOUR_PASSWORD";

          變量定義

          定義DHT數(shù)據(jù)引腳連接的GPIO。在這種情況下,它已連接到GPIO 27。

          #define DHTPIN 27 // Digital pin connected to the DHT sensor

          然后,選擇您正在使用的DHT傳感器類(lèi)型。在我們的示例中,我們使用的是DHT22。如果您使用的是其他類(lèi)型,則只需要取消注釋傳感器并注釋所有其他傳感器即可。

          #define DHTTYPE DHT22 // DHT 22 (AM2302)

          使用我們之前定義的類(lèi)型和引腳實(shí)例化DHT對(duì)象。

          DHT dht(DHTPIN, DHTTYPE);

          在端口80上創(chuàng)建一個(gè)AsyncWebServer對(duì)象。

          AsyncWebServer server(80);

          讀取溫度和濕度函數(shù)

          我們創(chuàng)建了兩個(gè)函數(shù):一個(gè)讀取溫度(readDHTTemperature()),另一個(gè)讀取濕度(readDHTHumidity())。

          String readDHTTemperature() {

          // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

          // Read temperature as Celsius (the default)

          float t = dht.readTemperature();

          // Read temperature as Fahrenheit (isFahrenheit = true)

          //float t = dht.readTemperature(true);

          // Check if any reads failed and exit early (to try again).

          if (isnan(t)) {

          Serial.println("Failed to read from DHT sensor!");

          return "--";

          }

          else {

          Serial.println(t);

          return String(t);

          }

          }

          獲取傳感器讀數(shù)就像在dht對(duì)象上使用readTemperature()和readHumidity()方法一樣簡(jiǎn)單。

          float t = dht.readTemperature();

          float h = dht.readHumidity();

          如果傳感器無(wú)法獲得讀數(shù),我們還有一個(gè)條件返回兩個(gè)破折號(hào)(–)。

          if (isnan(t)) {

          Serial.println("Failed to read from DHT sensor!");

          return "--";

          }

          讀數(shù)以字符串類(lèi)型返回。要將float轉(zhuǎn)換為字符串,請(qǐng)使用String()函數(shù)。

          return String(t);

          默認(rèn)情況下,我們以攝氏度為單位讀取溫度。要獲取以華氏度為單位的溫度,請(qǐng)以攝氏度為單位注釋溫度,并以華氏度為注釋溫度,以便您具有以下條件:

          //float t = dht.readTemperature();

          // Read temperature as Fahrenheit (isFahrenheit = true)

          float t = dht.readTemperature(true);

          建立網(wǎng)頁(yè)

          進(jìn)入Web服務(wù)器頁(yè)面。

          如上圖所示,該網(wǎng)頁(yè)顯示一個(gè)標(biāo)題和兩個(gè)段落。有一段顯示溫度,另一段顯示濕度。還有兩個(gè)圖標(biāo)可以美化我們的頁(yè)面。

          讓我們看看如何創(chuàng)建此網(wǎng)頁(yè)。

          所有包含樣式的HTML文本都存儲(chǔ)在index_html變量中。現(xiàn)在,我們將遍歷HTML文本,并查看每個(gè)部分的作用。

          以下<meta>標(biāo)記使您的網(wǎng)頁(yè)在任何瀏覽器中都能響應(yīng)。

          <meta name="viewport" content="width=device-width, initial-scale=1">

          所述<鏈路>需要標(biāo)簽來(lái)從網(wǎng)站fontawesome加載的圖標(biāo)。

          <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">

          風(fēng)格樣式

          在<style> </ style>標(biāo)記之間,我們添加了一些CSS來(lái)設(shè)置網(wǎng)頁(yè)樣式。

          <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; }

          .dht-labels{

          font-size: 1.5rem;

          vertical-align:middle;

          padding-bottom: 15px;

          }

          </style>

          基本上,我們將HTML頁(yè)面設(shè)置為顯示Arial字體的文本,該文本以不帶邊距的塊顯示,并居中對(duì)齊。

          html {

          font-family: Arial;

          display: inline-block;

          margin: 0px auto;

          text-align: center;

          }

          我們?yōu)樽x數(shù)的標(biāo)題(h2),段落(p)和單位(.units)設(shè)置字體大小。

          h2 { font-size: 3.0rem; }

          p { font-size: 3.0rem; }

          .units { font-size: 1.2rem; }

          讀數(shù)的標(biāo)簽樣式如下所示:

          dht-labels{

          font-size: 1.5rem;

          vertical-align:middle;

          padding-bottom: 15px;

          }

          先前的所有標(biāo)記應(yīng)位于<head>和</ head>標(biāo)記之間。這些標(biāo)記用于包含用戶(hù)不直接可見(jiàn)的內(nèi)容,例如<meta>,<link>標(biāo)記和樣式。

          HTML主體

          在<body> </ body>標(biāo)記內(nèi)是我們添加網(wǎng)頁(yè)內(nèi)容的位置。

          該<h2> </ h2>標(biāo)簽標(biāo)題添加到網(wǎng)頁(yè)。在這種情況下," ESP32 DHT服務(wù)器"文本,但是您可以添加任何其他文本。

          <h2>ESP32 DHT Server</h2>

          然后,有兩個(gè)段落。一個(gè)顯示溫度,另一個(gè)顯示濕度。段落由<p>和</ p>標(biāo)記分隔。溫度的段落如下:

          <p>

          <i class="fas fa-thermometer-half" style="color:#059e8a;"</i>

          <span class="dht-labels">Temperature</span>

          <span id="temperature">%TEMPERATURE%</span>

          <sup class="units">°C</sup>

          </p>

          濕度的段落在以下摘要中:

          <p>

          <i class="fas fa-tint" style="color:#00add6;"></i>

          <span class="dht-labels">Humidity</span>

          <span id="humidity">%HUMIDITY%</span>

          <sup class="units">%</sup>

          </p>

          所述的<i>標(biāo)簽顯示fontawesome圖標(biāo)。

          如何顯示圖標(biāo)

          要選擇圖標(biāo),請(qǐng)?jiān)L問(wèn)。

          搜索您要查找的圖標(biāo)。例如,"溫度計(jì)"。

          單擊所需的圖標(biāo)。然后,您只需要復(fù)制提供的HTML文本。

          <i class="fas fa-thermometer-half">

          要選擇顏色,您只需要通過(guò)十六進(jìn)制傳遞顏色的樣式參數(shù),如下所示:

          <i class="fas fa-tint" style="color:#00add6;"></i>

          繼續(xù)HTML文本…

          下一行在網(wǎng)頁(yè)中寫(xiě)入"溫度"一詞。

          <span class="dht-labels">Temperature</span>

          %符號(hào)之間的TEMPERATURE文本是溫度值的占位符。

          <span id="temperature">%TEMPERATURE%</span>

          這意味著此%TEMPERATURE%文本就像一個(gè)變量,將被DHT傳感器的實(shí)際溫度值代替。HTML文本上的占位符應(yīng)位于%符號(hào)之間。

          最后,我們添加度數(shù)符號(hào)。

          <sup class="units">°C</sup>

          該<SUP> < / SUP>標(biāo)簽使文本標(biāo)。

          對(duì)于濕度段,我們使用相同的方法,但是使用不同的圖標(biāo)和%HUMIDITY%占位符。

          <p>

          <i class="fas fa-tint" style="color:#00add6;"></i>

          <span class="dht-labels">Humidity</span>

          <span id="humidity">%HUMIDITY%</span>

          <sup class="units">%</sup>

          </p>

          自動(dòng)更新

          最后,我們的網(wǎng)頁(yè)中有一些JavaScript代碼,每10秒自動(dòng)更新一次溫度和濕度。

          HTML文本中的腳本應(yīng)位于<script> </ script>標(biāo)記之間。

          <script>

          setInterval(function ( ) {

          var xhttp = new XMLHttpRequest();

          xhttp.onreadystatechange = function() {

          if (this.readyState == 4 && this.status == 200) {

          document.getElementById("temperature").innerHTML = this.responseText;

          }

          };

          xhttp.open("GET", "/temperature", true);

          xhttp.send();

          }, 10000 ) ;

          setInterval(function ( ) {

          var xhttp = new XMLHttpRequest();

          xhttp.onreadystatechange = function() {

          if (this.readyState == 4 && this.status == 200) {

          document.getElementById("humidity").innerHTML = this.responseText;

          }

          };

          xhttp.open("GET", "/humidity", true);

          xhttp.send();

          }, 10000 ) ;

          </script>

          要更新背景溫度,我們有一個(gè)setInterval()函數(shù),該函數(shù)每10秒運(yùn)行一次。

          基本上,它在/ temperature URL中發(fā)出請(qǐng)求以獲取最新的溫度讀數(shù)。

          xhttp.open("GET", "/temperature", true);

          xhttp.send();

          }, 10000 ) ;

          收到該值時(shí),它將更新id為temperature的HTML元素。

          if (this.readyState == 4 && this.status == 200) {

          document.getElementById("temperature").innerHTML = this.responseText;

          }

          總而言之,上一節(jié)負(fù)責(zé)異步更新溫度。對(duì)濕度讀數(shù)重復(fù)相同的過(guò)程。

          重要提示:由于DHT傳感器獲取讀數(shù)的速度非常慢,如果您計(jì)劃同時(shí)將多個(gè)客戶(hù)端連接到ESP32,建議您增加請(qǐng)求間隔或刪除自動(dòng)更新。

          處理器

          現(xiàn)在,我們需要?jiǎng)?chuàng)建processor()函數(shù),該函數(shù)將用實(shí)際的溫度和濕度值替換HTML文本中的占位符。

          String processor(const String& var){

          //Serial.println(var);

          if(var == "TEMPERATURE"){

          return readDHTTemperature();

          }

          else if(var == "HUMIDITY"){

          return readDHTHumidity();

          }

          return String();

          }

          當(dāng)請(qǐng)求網(wǎng)頁(yè)時(shí),我們檢查HTML是否具有任何占位符。如果找到%TEMPERATURE%占位符,則通過(guò)調(diào)用先前創(chuàng)建的readDHTTemperature()函數(shù)來(lái)返回溫度。

          if(var == "TEMPERATURE"){

          return readDHTTemperature();

          }

          如果占位符為%HUMIDITY%,則返回濕度值。

          else if(var == "HUMIDITY"){

          return readDHTHumidity();

          }

          設(shè)定()

          在setup()中,初始化串口監(jiān)視器以進(jìn)行調(diào)試。

          Serial.begin(115200);

          初始化DHT傳感器。

          dht.begin();

          連接到您的局域網(wǎng)并打印ESP32 IP地址。

          WiFi.begin(ssid, password);

          while (WiFi.status() != WL_CONNECTED) {

          delay(1000);

          Serial.println("Connecting to WiFi..");

          }

          最后,添加以下代碼行以處理Web服務(wù)器。

          server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){

          request->send_P(200, "text/html", index_html, processor);

          });

          server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){

          request->send_P(200, "text/plain", readDHTTemperature().c_str());

          });

          server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){

          request->send_P(200, "text/plain", readDHTHumidity().c_str());

          });

          當(dāng)我們?cè)诟鵘RL上發(fā)出請(qǐng)求時(shí),我們將發(fā)送存儲(chǔ)在index_html變量中的HTML文本。我們還需要傳遞處理器函數(shù),該函數(shù)將用正確的值替換所有占位符。

          server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){

          request->send_P(200, "text/html", index_html, processor);

          });

          我們需要添加兩個(gè)其他處理程序來(lái)更新溫度和濕度讀數(shù)。當(dāng)我們?cè)? temperature URL 上收到請(qǐng)求時(shí),我們只需要發(fā)送更新的溫度值。它是純文本,應(yīng)該以char形式發(fā)送,因此我們使用c_str()方法。

          server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){

          request->send_P(200, "text/plain", readDHTTemperature().c_str());

          });

          對(duì)濕度重復(fù)相同的過(guò)程。

          server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){

          request->send_P(200, "text/plain", readDHTHumidity().c_str());

          });

          最后,我們可以啟動(dòng)服務(wù)器。

          server.begin();

          因?yàn)檫@是一個(gè)異步Web服務(wù)器,所以我們不需要在loop()中編寫(xiě)任何內(nèi)容。

          void loop(){

          }

          以上就是代碼的工作原理。

          上載驗(yàn)證程序

          現(xiàn)在,將代碼上傳到ESP32。確保選擇了正確的板和COM端口。

          上傳后,以115200的波特率打開(kāi)串口監(jiān)視器。按ESP32復(fù)位按鈕。ESP32 IP地址應(yīng)在串口監(jiān)視器中打印。

          Web服務(wù)器演示

          打開(kāi)瀏覽器,輸入ESP32 IP地址。您的Web服務(wù)器應(yīng)顯示最新的傳感器讀數(shù)。

          請(qǐng)注意,溫度和濕度讀數(shù)會(huì)自動(dòng)更新,而無(wú)需刷新網(wǎng)頁(yè)。

          在本教程中,我們向您展示了如何使用ESP32構(gòu)建異步Web服務(wù)器以顯示來(lái)自DHT11或DHT22傳感器的傳感器讀數(shù)以及如何自動(dòng)更新讀數(shù)。

          代碼手機(jī)電腦管理類(lèi)軟件開(kāi)發(fā),其中可拖放使用的輸入框類(lèi)顯示元件包括:字符輸入框元件(Text Field)、多行文本輸入框元件(Text Area)、密碼輸入框元件(Password Field)、數(shù)字輸入框元件(Number Field)、日期輸入框元件(Date Field)、帶標(biāo)簽字符輸入框元件(Text Labeled Field)、帶標(biāo)簽數(shù)字輸入框元件(Number Labeled Field)、帶標(biāo)簽日期輸入框元件(Date Labeled Field)、帶標(biāo)簽下拉選擇菜單元件(Selection Labeled Field)

          各類(lèi)輸入框元件:主要是提供用戶(hù)在前端輸入信息用,即放即用,這些元件直接顯示在前端。

          1、屬性可以定義顯示的樣式,比如定義寬度大小、邊框顏色等,用法與其他元件一樣設(shè)定屬性的“html.style”值即可,同時(shí)也可以用“html.maxLength”定義輸入值的長(zhǎng)短,超過(guò)長(zhǎng)度則無(wú)法輸入:

          輸入框元件屬性中樣式設(shè)定

          2、輸入框因類(lèi)型不同,可輸入的數(shù)據(jù)形式固定,比如數(shù)字輸入框無(wú)法錄入文字字符;但字符輸入框可以輸入數(shù)字,數(shù)據(jù)是字符型的;密碼輸入框輸入時(shí)不顯示內(nèi)容但顯示占位符號(hào);日期選框會(huì)出現(xiàn)一個(gè)日期選項(xiàng)板(日期格式可改為中文):

          日期輸入框在前端的效果

          3、帶標(biāo)簽的輸入框只是提供了一個(gè)默認(rèn)的字符標(biāo)簽,命名后標(biāo)簽顯示名稱(chēng);這個(gè)標(biāo)簽本身是一個(gè)與輸入框并行放置的文本顯示元件;在使用時(shí)也可以直接放一個(gè)字符常量顯示元件,外加不帶標(biāo)簽的輸入框;也可以對(duì)標(biāo)簽單獨(dú)進(jìn)行樣式定義處理:

          帶標(biāo)簽的輸入框,標(biāo)簽顯示名稱(chēng)

          4、輸入框中可以添加一個(gè)“<On Change>”的行業(yè)處理,當(dāng)輸入完成后回車(chē)或TAB鍵或光標(biāo)移出點(diǎn)擊其他位置時(shí)可以觸發(fā)邏輯處理,比如檢查字符輸入時(shí)是否要求輸入的郵箱字符包含有@符號(hào),以及數(shù)字輸入時(shí)是否數(shù)字不為零,如果不包含或是零,則提示需重輸入:

          輸入框添加一個(gè)邏輯行為

          5、支持<Placeholder>、<Visible>、<Disabled>等H5標(biāo)簽使用:<Placeholder>是將一個(gè)常量文本放入,主要是提示輸入信息用;<Visible>可以用于復(fù)用模塊中,有些無(wú)需讓用戶(hù)看見(jiàn)或配合上第4點(diǎn)當(dāng)某個(gè)條件符合時(shí)隱去不顯示簡(jiǎn)化用戶(hù)作業(yè)讓界面也簡(jiǎn)單化,傳布爾值就可以(在常量元件中有是和否的常量);<Disabled>可以作為是否不讓輸入任何內(nèi)容用,布爾值傳值給他就行:

          輸入框中提示信息設(shè)定

          提示信息用戶(hù)前端顯示

          下拉選擇菜單元件(Selection Labeled Field):

          1、下拉選擇菜單元件與以上其他輸入元件一樣,沒(méi)有差別,可參考以上處理;

          2、下拉選框的中的<Options>是選項(xiàng),可放入多個(gè)內(nèi)容;可以為下拉框添加一個(gè)默認(rèn)的最常用的選項(xiàng),如下:

          下拉菜單選項(xiàng)設(shè)定

          一部分:HTML簡(jiǎn)介

          什么是HTML?

          HTML代表超文本標(biāo)記語(yǔ)言(Hypertext Markup Language)。它是一種用于構(gòu)建網(wǎng)頁(yè)的標(biāo)記語(yǔ)言。HTML文件包含一組標(biāo)簽,這些標(biāo)簽用于定義網(wǎng)頁(yè)的結(jié)構(gòu)和內(nèi)容。瀏覽器讀取HTML文件,并根據(jù)標(biāo)記中的指示呈現(xiàn)網(wǎng)頁(yè)內(nèi)容。

          HTML的主要作用是定義文本內(nèi)容、圖像、鏈接和其他媒體的排列方式,并提供交互元素,例如表單和按鈕。

          HTML的基本結(jié)構(gòu)

          每個(gè)HTML文檔都應(yīng)該遵循以下基本結(jié)構(gòu):

          <!DOCTYPE html>
          <html>
          <head>
              <title>網(wǎng)頁(yè)標(biāo)題</title>
          </head>
          <body>
              <!-- 內(nèi)容在這里 -->
          </body>
          </html>
          

          讓我們逐步解釋這個(gè)結(jié)構(gòu):

          • <!DOCTYPE html>:這是文檔類(lèi)型聲明,它告訴瀏覽器正在使用的HTML版本。<!DOCTYPE html>表示使用HTML5。
          • <html>:HTML文檔的根元素。所有其他元素都包含在<html>標(biāo)簽內(nèi)。
          • <head>:包含與文檔相關(guān)的元信息,如頁(yè)面標(biāo)題、字符集聲明和外部樣式表鏈接。
          • <title>:定義網(wǎng)頁(yè)的標(biāo)題,顯示在瀏覽器標(biāo)簽頁(yè)上。
          • <body>:包含網(wǎng)頁(yè)的主要內(nèi)容,如文本、圖像和其他媒體。

          HTML標(biāo)簽和元素

          HTML標(biāo)簽是由尖括號(hào)括起來(lái)的名稱(chēng),例如<p>表示段落,<img>表示圖像。標(biāo)簽通常成對(duì)出現(xiàn),有一個(gè)開(kāi)始標(biāo)簽和一個(gè)結(jié)束標(biāo)簽。例如:

          <p>這是一個(gè)段落。</p>
          

          <p>是開(kāi)始標(biāo)簽,</p>是結(jié)束標(biāo)簽,文本位于兩個(gè)標(biāo)簽之間。標(biāo)簽定義了元素的類(lèi)型和結(jié)構(gòu)。

          有些HTML標(biāo)簽是自封閉的,不需要結(jié)束標(biāo)簽,例如<img>用于插入圖像。

          HTML注釋

          在HTML中,你可以使用注釋來(lái)添加說(shuō)明性文字,注釋不會(huì)在瀏覽器中顯示。HTML注釋使用<!--開(kāi)頭和-->結(jié)尾,如下所示:

          <!-- 這是一個(gè)注釋 -->
          

          注釋通常用于添加文檔說(shuō)明、調(diào)試代碼或標(biāo)記未來(lái)的修改。

          第二部分:HTML基本元素

          文本

          HTML中的文本通常包含在段落、標(biāo)題、列表等元素中。以下是一些常見(jiàn)的文本元素:

          • <p>:定義一個(gè)段落。
          • <h1><h6>:定義標(biāo)題,<h1>是最高級(jí)別的標(biāo)題,<h6>是最低級(jí)別的標(biāo)題。
          • <strong>:定義強(qiáng)調(diào)文本,通常以粗體顯示。
          • <em>:定義強(qiáng)調(diào)文本,通常以斜體顯示。
          • <a>:定義超鏈接,允許用戶(hù)點(diǎn)擊跳轉(zhuǎn)到其他頁(yè)面。

          示例:

          <p>這是一個(gè)段落。</p>
          <h1>這是一個(gè)標(biāo)題</h1>
          <p><strong>這是強(qiáng)調(diào)文本。</strong></p>
          <p><em>這是斜體文本。</em></p>
          <p>訪(fǎng)問(wèn)<a href="https://www.example.com">示例網(wǎng)站</a></p>
          

          圖像

          要在網(wǎng)頁(yè)中插入圖像,可以使用<img>標(biāo)簽。它是一個(gè)自封閉標(biāo)簽,需要指定圖像的src屬性來(lái)指定圖像文件的路徑。

          示例:

          htmlCopy code
          <img src="image.jpg" alt="圖像描述">
          
          • src:指定圖像文件的路徑。
          • alt:提供圖像的替代文本,用于無(wú)法加載圖像時(shí)的文字描述。

          鏈接

          通過(guò)使用<a>標(biāo)簽,可以在網(wǎng)頁(yè)中創(chuàng)建鏈接。鏈接通常包含在文本或圖像中,并使用href屬性指定目標(biāo)URL。

          示例:

          <a href="https://www.example.com">訪(fǎng)問(wèn)示例網(wǎng)站</a>
          
          • href:指定鏈接的目標(biāo)URL。

          列表

          HTML支持有序列表(<ol>)、無(wú)序列表(<ul>)和定義列表(<dl>)。

          無(wú)序列表

          無(wú)序列表使用<ul>標(biāo)簽定義,每個(gè)列表項(xiàng)使用<li>標(biāo)簽。

          示例:

          <ul>
              <li>項(xiàng)目1</li>
              <li>項(xiàng)目2</li>
              <li>項(xiàng)目3</li>
          </ul>
          

          有序列表

          有序列表使用<ol>標(biāo)簽定義,每個(gè)列表項(xiàng)使用<li>標(biāo)簽。

          示例:

          <ol>
              <li>第一項(xiàng)</li>
              <li>第二項(xiàng)</li>
              <li>第三項(xiàng)</li>
          </ol>
          

          定義列表

          定義列表使用<dl>標(biāo)簽定義,每個(gè)定義項(xiàng)目使用<dt>標(biāo)簽定義術(shù)語(yǔ),使用<dd>標(biāo)簽定義描述。

          示例:

          <dl>
              <dt>術(shù)語(yǔ)1</dt>
              <dd>描述1</dd>
              <dt>術(shù)語(yǔ)2</dt>
              <dd>描述2</dd>
          </dl>
          

          第三部分:HTML表單

          HTML表單允許用戶(hù)與網(wǎng)頁(yè)進(jìn)行交互,提交數(shù)據(jù)。以下是HTML表單的基本元素:

          <form>元素

          <form>元素用于創(chuàng)建表單,可以包含文本字段、復(fù)選框、單選按鈕、下拉列表等。

          示例:

          <form action="submit.php" method="post">
              <!-- 表單元素在這里 -->
          </form>
          
          • action:指定表單數(shù)據(jù)提交的目標(biāo)URL。
          • method:指定提交方法,通常是"post"或"get"。

          輸入字段

          輸入字段用于接收用戶(hù)輸入的數(shù)據(jù),常見(jiàn)的輸入字段類(lèi)型包括文本框、密碼框、單選按鈕、復(fù)選框等。

          文本框

          文本框使用<input>標(biāo)簽,type屬性設(shè)置為"text"。

          示例:

          <input type="text" name="username" placeholder="用戶(hù)名">
          
          • type:指定字段類(lèi)型。
          • name:指定字段的名稱(chēng)。
          • placeholder:設(shè)置文本框的占位符文本。

          密碼框

          密碼框使用<input>標(biāo)簽,type屬性設(shè)置為"password"。

          示例:

          htmlCopy code
          <input type="password" name="password" placeholder="密碼">
          

          單選按鈕

          單選按鈕使用<input>標(biāo)簽,type屬性設(shè)置為"radio"。

          示例:

          <input type="radio" name="gender" value="male">男
          <input type="radio" name="gender" value="female">女
          
          • name:指定單選按鈕組的名稱(chēng)。
          • value:指定每個(gè)選項(xiàng)的值。

          復(fù)選框

          復(fù)選框使用<input>標(biāo)簽,type屬性設(shè)置為"checkbox"。

          示例:

          <input type="checkbox" name="subscribe" value="yes">訂閱新聞
          

          下拉列表

          下拉列表使用<select><option>標(biāo)簽創(chuàng)建。<select>定義下拉列表,而<option>定義選項(xiàng)。

          示例:

          <select name="country">
              <option value="us">美國(guó)</option>
              <option value="ca">加拿大</option>
              <option value="uk">英國(guó)</option>
          </select>
          
          • name:指定下拉列表的名稱(chēng)。
          • 每個(gè)<option>標(biāo)簽表示一個(gè)選項(xiàng),使用value屬性定義選項(xiàng)的值。

          第四部分:HTML樣式和CSS

          HTML用于定義網(wǎng)頁(yè)的結(jié)構(gòu)和內(nèi)容,但要使網(wǎng)頁(yè)看起來(lái)更吸引人,需要使用CSS(層疊樣式表)。CSS允許你定義字體、顏色、布局等樣式。

          內(nèi)聯(lián)樣式

          可以在HTML元素內(nèi)部使用style屬性來(lái)定義內(nèi)聯(lián)樣式。

          示例:

          <p style="color: blue; font-size: 16px;">這是一個(gè)藍(lán)色的段落。</p>
          

          外部樣式表

          外部樣式表將樣式規(guī)則保存在獨(dú)立的CSS文件中,并通過(guò)<link>標(biāo)簽將其鏈接到HTML文檔。

          示例(style.css):

          /* style.css */
          p {
              color: blue;
              font-size: 16px;
          }
          

          在HTML中鏈接外部樣式表:

          <link rel="stylesheet" type="text/css" href="style.css">
          

          這使得可以在整個(gè)網(wǎng)站上共享相同的樣式。

          總結(jié)

          HTML是構(gòu)建現(xiàn)代網(wǎng)頁(yè)的基礎(chǔ)。通過(guò)學(xué)習(xí)HTML的基本語(yǔ)法和元素,你可以創(chuàng)建吸引人且功能強(qiáng)大的網(wǎng)頁(yè)。無(wú)論是文本、圖像、鏈接還是表單,HTML提供了豐富的工具來(lái)呈現(xiàn)內(nèi)容和實(shí)現(xiàn)用戶(hù)交互。

          這篇文章提供了HTML的基礎(chǔ)知識(shí),但HTML是一個(gè)廣泛的主題,還有許多高級(jí)特性和技巧等待你探索。希望這篇文章對(duì)你入門(mén)HTML有所幫助,讓你能夠開(kāi)始創(chuàng)建自己的網(wǎng)頁(yè)。繼續(xù)學(xué)習(xí)和實(shí)踐,你將成為一個(gè)熟練的網(wǎng)頁(yè)開(kāi)發(fā)者。


          主站蜘蛛池模板: 日本高清天码一区在线播放| 无码人妻久久久一区二区三区 | 亚洲一区二区三区高清| 午夜视频在线观看一区二区| 日韩精品无码人妻一区二区三区 | 国产无线乱码一区二三区| 日韩免费一区二区三区| 伊人久久大香线蕉av一区| 日本免费一区尤物| 精品日韩一区二区| 成人精品一区二区电影| 国产精品福利一区二区| 2014AV天堂无码一区| 无码人妻精品一区二区三区9厂| 亚洲熟妇成人精品一区| 无码少妇一区二区三区| 国产天堂一区二区综合| 精品一区二区三区视频| 中文字幕在线一区二区三区| 日韩免费一区二区三区在线播放| 精品少妇一区二区三区视频| 成人一区二区免费视频| 久久精品国产一区| 亚洲国产精品综合一区在线| 亚洲国产精品无码第一区二区三区| 国产日产久久高清欧美一区| 精品久久久久久无码中文字幕一区| 2022年亚洲午夜一区二区福利| 国产成人一区二区动漫精品| 视频一区精品自拍| 美女福利视频一区| 极品人妻少妇一区二区三区| 国产一区二区三区在线免费观看| 国产精品免费一区二区三区| 中文字幕人妻AV一区二区| 亚洲国产日韩一区高清在线| 精品免费久久久久国产一区| 日本一区二区三区在线网| 日韩视频一区二区在线观看| 亚洲欧美国产国产综合一区| 日韩在线视频不卡一区二区三区|