ค้นหาโค้ด

บทเรียน 31/31: วัดอุณหภูมิและความชื้นผ่าน Wi-Fi โดยใช้ DHT11 และ ESP01 ชุด SunFounder

บทเรียนนี้เป็นส่วนหนึ่งของ: หลักสูตร Arduino ที่ใช้ชุดการเรียนรู้ 3-in-1 ของ SunFounder

บทเรียน 31/31: วัดอุณหภูมิและความชื้นผ่าน Wi-Fi โดยใช้ DHT11 และ ESP01 ชุด SunFounder

คู่มือโปรเจกต์นี้จะพาคุณไปเรียนรู้การสร้างระบบตรวจวัดอุณหภูมิและความชื้นแบบไร้สายโดยใช้โมดูล ESP8266 (ESP-01) และเซนเซอร์ DHT11 เมื่อเสร็จสิ้น คุณจะได้อุปกรณ์ที่สร้างเว็บเซิร์ฟเวอร์ของตัวเอง ทำให้คุณสามารถดูค่าการวัดแบบเรียลไทม์จากอุปกรณ์ใดก็ได้ที่เชื่อมต่อกับเครือข่ายท้องถิ่นของคุณ เช่น สมาร์ทโฟน แท็บเล็ต หรือคอมพิวเตอร์ นี่คือโปรเจกต์ IoT พื้นฐานที่แสดงให้เห็นถึงการเชื่อมโยงโลกทางกายภาพของเซนเซอร์เข้ากับโลกดิจิทัลของอินเทอร์เฟซเว็บ
โมดูล ESP8266 ESP01

ทักษะที่คุณเรียนรู้ที่นี่สามารถนำไปประยุกต์ใช้ได้อย่างกว้างขวาง การตั้งค่านี้สามารถปรับใช้สำหรับการใช้งานจริงได้หลากหลายรูปแบบ เช่น:

  • สร้างสถานีตรวจสอบระยะไกลสำหรับเรือนกระจกหรือสวน เพื่อให้แน่ใจว่าสภาพการเจริญเติบโตเหมาะสมที่สุด
  • สร้างระบบสมาร์ทโฮมอย่างง่ายเพื่อตรวจสอบสภาพอากาศในห้องเฉพาะ เช่น ห้องเก็บไวน์หรือห้องเด็กอ่อน
  • ตั้งค่าระบบบันทึกข้อมูลสิ่งแวดล้อมต้นทุนต่ำสำหรับโปรเจกต์วิทยาศาสตร์ของโรงเรียน
  • พัฒนาระบบแจ้งเตือนหรือระบบรักษาความปลอดภัยพื้นฐานที่สามารถแจ้งให้คุณทราบเมื่ออุณหภูมิเปลี่ยนแปลงอย่างกะทันหัน

ฮาร์ดแวร์และอุปกรณ์ประกอบ

เพื่อทำตามโปรเจกต์นี้ คุณจะต้องมีอุปกรณ์ดังต่อไปนี้ อุปกรณ์หลักคือโมดูล ESP8266 และเซนเซอร์ DHT11 แต่อุปกรณ์อื่นๆ ก็จำเป็นสำหรับการเขียนโปรแกรมและการจ่ายไฟให้โมดูล

  • โมดูล ESP8266 (ESP-01S): ไมโครคอนโทรลเลอร์หลักที่มีความสามารถ Wi-Fi ในตัว
  • เซนเซอร์อุณหภูมิและความชื้น DHT11: เซนเซอร์ที่ใช้วัดข้อมูลสภาพแวดล้อม
  • บอร์ด Arduino Uno (สำหรับแปลง USB เป็น Serial): ในโปรเจกต์นี้ บอร์ด Arduino หลักไม่ได้ใช้เพื่อการประมวลผล แต่ใช้ชิปแปลง USB เป็น Serial เพื่อเขียนโปรแกรมให้โมดูล ESP8266
  • ตัวต้านทาน 330 โอห์ม: ใช้สำหรับการทดสอบไฟกระพริบ LED ครั้งแรกเพื่อจำกัดกระแส
  • ตัวต้านทาน 1k โอห์มถึง 10k โอห์ม: ตัวต้านทานแบบ Pull-up สำหรับสายข้อมูลของเซนเซอร์ DHT11
  • LED และสายจัมเปอร์: สำหรับขั้นตอนการทดสอบและการเชื่อมต่อที่จำเป็นทั้งหมด
  • เบรดบอร์ด: สำหรับสร้างการเชื่อมต่อวงจร

คู่มือการเดินสายไฟ

การเดินสายไฟ esp8266 ESP01 และ DHT11 สำหรับบทเรียนที่ 31 หลักสูตร 3-in-1 ของ Sunfounder

กระบวนการเดินสายไฟจะทำเป็นขั้นตอน ขั้นแรก เราจะตั้งวงจรพื้นฐานเพื่อเขียนโปรแกรมให้ ESP-01 ซึ่งเกี่ยวข้องกับการใช้ Arduino Uno เป็นตัวเขียนโปรแกรม วิดีโอสาธิตการตั้งค่านี้อย่างชัดเจน การเชื่อมต่อหลักมีดังนี้:

เพื่อเข้าสู่โหมดการเขียนโปรแกรม คุณต้องเชื่อมต่อพิน IO1 (GPIO1) เข้ากับกราวด์ (GND) ซึ่งจะบอกให้ ESP8266 รอรับเฟิร์มแวร์ใหม่ การเชื่อมต่ออื่นๆ สำหรับการเขียนโปรแกรมมีดังนี้:

  • VCC (3.3V) ไปยัง EN (Enable): เพื่อเปิดใช้งานโมดูล
  • GND ไปยัง GND: กราวด์ร่วมสำหรับวงจร
  • VCC (5V) ไปยัง VCC (5V): เพื่อจ่ายไฟให้บอร์ดเขียนโปรแกรม
  • RX (ESP) ไปยัง TX (Arduino): สำหรับการสื่อสารแบบ Serial จากตัวเขียนโปรแกรมไปยังโมดูล
  • TX (ESP) ไปยัง RX (Arduino): สำหรับการสื่อสารแบบ Serial จากโมดูลไปยังตัวเขียนโปรแกรม
  • RST (Reset) ไปยัง GND: นี่คือการเชื่อมต่อชั่วคราวที่ใช้เพื่อรีเซ็ตโมดูลหลังจากการเขียนโปรแกรม

เมื่อเขียนโปรแกรมให้ ESP-01 เสร็จแล้ว การเดินสายไฟสำหรับเซนเซอร์ก็ทำได้ง่าย เซนเซอร์ DHT11 ต้องใช้ตัวต้านทานแบบ Pull-up บนสายข้อมูลเพื่อให้การสื่อสารมีเสถียรภาพ

สำหรับการตั้งค่าเซนเซอร์ การเดินสายไฟมีดังนี้:

  • DHT11 VCC (พิน 1) ไปยัง 3.3V: จ่ายไฟให้เซนเซอร์
  • DHT11 DATA (พิน 2) ไปยัง GPIO2 (IO2) บน ESP-01: สายข้อมูลสำหรับการอ่านค่าจากเซนเซอร์ ควรเชื่อมต่อตัวต้านทานแบบ Pull-up ขนาด 1k โอห์มถึง 10k โอห์มระหว่างสายข้อมูลนี้กับสายไฟ 3.3V
  • DHT11 GND (พิน 4) ไปยัง GND: กราวด์ร่วมสำหรับเซนเซอร์

การเตรียม Arduino IDE

เพื่อเขียนโปรแกรมให้ ESP8266 คุณต้องเพิ่มการรองรับบอร์ดลงใน Arduino IDE ก่อน ซึ่งทำได้สองขั้นตอน:

  1. เพิ่ม URL ของ Board Manager: ไปที่ File > Preferences ในช่อง "Additional Boards Manager URLs" วาง URL ต่อไปนี้: http://arduino.esp8266.com/stable/package_esp8266com_index.json แล้วคลิก "OK"
  2. ติดตั้งแพ็คเกจบอร์ด ESP8266: ไปที่ Tools > Board > Boards Manager... ค้นหา "esp8266" หา "esp8266 by ESP8266 Community" แล้วคลิก "Install" หลังจากการติดตั้งเสร็จสิ้น คุณสามารถเลือกบอร์ดได้โดยไปที่ Tools > Board > ESP8266 Boards > Generic ESP8266 Module

การติดตั้งไลบรารีเซนเซอร์ DHT

โค้ดนี้ต้องอาศัยไลบรารีเพื่อเชื่อมต่อกับเซนเซอร์ DHT11 ไลบรารีนี้ต้องติดตั้งใน Arduino IDE ของคุณ

  1. ไปที่ Tools > Manage Libraries...
  2. ค้นหา "DHT sensor library"
  3. หาไลบรารีโดย Adafruit แล้วคลิก "Install" ไลบรารีนี้ช่วยให้การอ่านข้อมูลจากเซนเซอร์ง่ายขึ้น

โปรเจกต์ 1: การทดสอบไฟ LED กระพริบ

ก่อนที่จะลงลึกไปในเซนเซอร์ สิ่งสำคัญคือต้องตรวจสอบว่าคุณสามารถเขียนโปรแกรม ESP-01 ได้สำเร็จ ซึ่งทำได้ด้วยตัวอย่าง "Blink" แบบคลาสสิก วิดีโอแสดงขั้นตอนการส่งออกไบนารีที่คอมไพล์แล้วและการใช้ไฟล์แบตช์แยกต่างหากเพื่อแฟลช ซึ่งเป็นวิธีแก้ปัญหาสำหรับการตั้งค่า USB-to-serial ที่เฉพาะเจาะจง เป้าหมายคือการเห็น LED บนบอร์ดกระพริบ เพื่อยืนยันว่าสายการเขียนโปรแกรมทำงานได้ ในการรันโมดูลหลังจากการเขียนโปรแกรม คุณต้องถอดสายไฟที่เชื่อมต่อ IO1 กับ GND ออก แล้วจึงเชื่อมต่อพิน RST กับ GND ชั่วครู่เพื่อรีเซ็ตโมดูล

โปรเจกต์ 2: การอ่าน DHT11 บน Serial Monitor

เมื่อยืนยันการเขียนโปรแกรมแล้ว ขั้นตอนถัดไปคือการเชื่อมต่อเซนเซอร์ DHT11 และอ่านข้อมูล โปรเจกต์นี้ใช้ตัวอย่าง DHTtester จากไลบรารี Adafruit DHT sensor โค้ดถูกกำหนดค่าให้ใช้พินและประเภทเซนเซอร์ที่ถูกต้อง หลังจากแฟลชโปรแกรมนี้แล้ว คุณสามารถเปิด Serial Monitor (ตั้งค่าเป็น 9600 baud) เพื่อดูค่าอุณหภูมิและความชื้น

โปรเจกต์ 3: การตั้งค่าเว็บเซิร์ฟเวอร์

โปรเจกต์สุดท้ายรวมทุกอย่างเข้าด้วยกัน ESP8266 ถูกเขียนโปรแกรมให้เชื่อมต่อกับเครือข่าย Wi-Fi ในพื้นที่ของคุณและโฮสต์หน้าเว็บง่ายๆ หน้านี้แสดงค่าอุณหภูมิและความชื้นแบบเรียลไทม์ โค้ดนี้เป็นเวอร์ชันที่ดัดแปลงจากตัวอย่าง "HelloServer" ของ ESP8266 วิดีโอสาธิตวิธีการเข้าถึงข้อมูลนี้โดยการป้อนที่อยู่ IP ของอุปกรณ์หรือชื่อ mDNS (เช่น robojaxDHT.local) ลงในเว็บเบราว์เซอร์บนอุปกรณ์ใดๆ ที่เชื่อมต่อกับเครือข่ายเดียวกัน

คำอธิบายโค้ด

เนื่องจากโปรแกรมเต็มมีให้ดาวน์โหลด ส่วนนี้จึงเน้นที่ตัวแปรหลักที่ผู้ใช้สามารถกำหนดค่าได้ ซึ่งคุณจะต้องปรับเปลี่ยนสำหรับเครือข่ายและความต้องการของคุณเอง โค้ดนี้เป็นเวอร์ชันที่ดัดแปลงจากตัวอย่าง "HelloServer" ของ ESP8266 ตรรกะหลักเกี่ยวข้องกับการอ่านเซนเซอร์และการจัดรูปแบบหน้า HTML เพื่อแสดงข้อมูล

นี่คือส่วนสำคัญของโค้ดที่คุณจะต้องแก้ไข:

// ข้อมูลรับรอง Wi-Fi - คุณต้องเปลี่ยนสิ่งเหล่านี้
const char* ssid = "YourWiFiSSID"; // แทนที่ด้วยชื่อเครือข่าย Wi-Fi ของคุณ
const char* password = "YourWiFiPassword"; // แทนที่ด้วยรหัสผ่าน Wi-Fi ของคุณ

นี่คือส่วนที่สำคัญที่สุดที่ต้องเปลี่ยน ตัวแปร ssid และ password ต้องตรงกับเครือข่าย Wi-Fi ในพื้นที่ของคุณอย่างแน่นอน ชื่อ Wi-Fi คำนึงถึงตัวพิมพ์เล็กใหญ่ ดังนั้นโปรดตรวจสอบให้ถูกต้อง

// การกำหนดค่าเซนเซอร์ DHT11
#define DHTPIN 2     // พินดิจิทัลที่เชื่อมต่อกับเซนเซอร์ DHT (GPIO2)
#define DHTTYPE DHT11   // ประเภทเซนเซอร์ DHT 11

คำนิยามเหล่านี้ตั้งค่าเซนเซอร์ DHTPIN คือพิน GPIO บน ESP8266 ที่เชื่อมต่อสายข้อมูลของเซนเซอร์ (ซึ่งคือ 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 Serial Monitor แสดงสถานะการเชื่อมต่อและที่อยู่ IP ของอุปกรณ์ โดยการนำทางไปยังที่อยู่ IP นี้ในเว็บเบราว์เซอร์ คุณจะเห็นหน้าเว็บง่ายๆ ที่แสดงอุณหภูมิและความชื้นปัจจุบัน การสาธิตแสดงค่าที่อัปเดตแบบเรียลไทม์ เมื่อเซนเซอร์ DHT11 ถูกให้ความร้อนด้วยปืนความร้อน ค่าอุณหภูมิบนหน้าเว็บจะเพิ่มขึ้นตามไปด้วย หากสายข้อมูลของเซนเซอร์ถูกถอดออก หน้าจะแสดง "None" สำหรับค่าเซนเซอร์ ซึ่งเป็นคุณสมบัติที่มีประโยชน์สำหรับการแก้ไขปัญหา

บทต่างๆ

  • [00:00] แนะนำโปรเจกต์
  • [01:33] ทำความเข้าใจ ESP8266 และเว็บเซิร์ฟเวอร์
  • [05:47] การเดินสาย ESP-01 สำหรับการเขียนโปรแกรม
  • [08:51] การติดตั้งการรองรับบอร์ด ESP8266 ใน Arduino IDE
  • [11:47] โปรเจกต์ 1: การกระพริบ LED ด้วย ESP8266
  • [20:28] การเดินสายเซนเซอร์ DHT11
  • [22:34] การติดตั้งไลบรารี DHT Sensor
  • [23:13] โปรเจกต์ 2: การอ่าน DHT11 บน Serial Monitor
  • [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
}

แหล่งข้อมูลและเอกสารอ้างอิง

ยังไม่มีทรัพยากรเลย

ไฟล์📁

โค้ด Arduino (.ino)

ไฟล์ Fritzing

คู่มือผู้ใช้