- DHT11 - ข้อมูลจำเพาะและการทำงาน
- การสื่อสารกับ DHT11 Sensor
- ส่วนประกอบที่จำเป็น
- แผนผัง
- DHT11 พร้อมคำอธิบายรหัส PIC MPLABX
การวัดอุณหภูมิและความชื้นมักมีประโยชน์ในแอปพลิเคชั่นมากมายเช่นระบบอัตโนมัติในบ้าน, การตรวจสอบสภาพแวดล้อม, สถานีอากาศ ฯลฯ เซ็นเซอร์อุณหภูมิที่นิยมใช้มากที่สุดถัดจาก LM35 คือ DHT11 ซึ่งก่อนหน้านี้เราได้สร้างโครงการ DHT11 จำนวนมากโดยเชื่อมต่อกับ Arduino กับ Raspberry Pi และบอร์ดพัฒนาอื่น ๆ อีกมากมาย ในบทความนี้เราจะเรียนรู้วิธีการเชื่อมต่อDHT11 กับ PIC16F87Aซึ่งเป็นไมโครคอนโทรลเลอร์ PIC แบบ 8 บิต เราจะใช้ไมโครคอนโทรลเลอร์นี้เพื่ออ่านค่าอุณหภูมิและความชื้นโดยใช้ DHT11และแสดงบนจอ LCD หากคุณยังใหม่กับการใช้ไมโครคอนโทรลเลอร์ PIC คุณสามารถใช้ชุดการสอน PIC ของเราเพื่อเรียนรู้วิธีการเขียนโปรแกรมและใช้ไมโครคอนโทรลเลอร์ PIC ตามที่กล่าวมาเริ่มกันเลย
DHT11 - ข้อมูลจำเพาะและการทำงาน
เซ็นเซอร์ DHT11 มีให้เลือกทั้งในรูปแบบโมดูลหรือแบบเซ็นเซอร์ ในบทช่วยสอนนี้เรากำลังใช้เซ็นเซอร์ข้อแตกต่างเพียงอย่างเดียวระหว่างทั้งสองอย่างคือในรูปแบบโมดูลเซ็นเซอร์มีตัวเก็บประจุกรองและตัวต้านทานแบบดึงขึ้นที่ติดอยู่กับขาเอาต์พุตของเซ็นเซอร์ ดังนั้นหากคุณใช้โมดูลคุณไม่จำเป็นต้องเพิ่มโมดูลเหล่านี้จากภายนอก DHT11 ในรูปแบบเซ็นเซอร์แสดงไว้ด้านล่าง
เซ็นเซอร์ DHT11 มาพร้อมกับปลอกสีฟ้าหรือสีขาว ภายในปลอกนี้เรามีส่วนประกอบสำคัญสองอย่าง ที่ช่วยให้เรารับรู้ความชื้นสัมพัทธ์และอุณหภูมิได้ องค์ประกอบแรกคือคู่ของขั้วไฟฟ้า; ความต้านทานไฟฟ้าระหว่างอิเล็กโทรดทั้งสองนี้ถูกกำหนดโดยพื้นผิวที่มีความชื้น ดังนั้นความต้านทานที่วัดได้จึงแปรผกผันกับความชื้นสัมพัทธ์ของสิ่งแวดล้อม ความชื้นสัมพัทธ์ที่สูงขึ้นจะเป็นค่าความต้านทานและในทางกลับกัน นอกจากนี้โปรดทราบว่าความชื้นสัมพัทธ์แตกต่างจากความชื้นจริง ความชื้นสัมพัทธ์วัดปริมาณน้ำในอากาศเทียบกับอุณหภูมิในอากาศ
ส่วนประกอบอื่น ๆ พื้นผิวติดตั้งกทช Thermistor คำว่า NTC ย่อมาจากค่าสัมประสิทธิ์อุณหภูมิเชิงลบสำหรับการเพิ่มขึ้นของอุณหภูมิค่าความต้านทานจะลดลง เอาต์พุตของเซ็นเซอร์ได้รับการปรับเทียบจากโรงงานดังนั้นในฐานะโปรแกรมเมอร์เราไม่จำเป็นต้องกังวลเกี่ยวกับการปรับเทียบเซ็นเซอร์ ผลลัพธ์ของเซ็นเซอร์ที่กำหนดโดยการสื่อสาร 1-Wireมาดูพินและแผนผังการเชื่อมต่อของเซ็นเซอร์นี้
ผลิตภัณฑ์อยู่ในแพ็คเกจแถวเดียว 4 พิน พินที่ 1 เชื่อมต่อผ่าน VDD และพินที่ 4 เชื่อมต่อผ่าน GND พินที่ 2 คือพินข้อมูลที่ใช้เพื่อการสื่อสาร พินข้อมูลนี้ต้องการตัวต้านทานแบบดึงขึ้น 5k อย่างไรก็ตามสามารถใช้ตัวต้านทานอื่น ๆ เช่น 4.7k ถึง 10k ได้ พินที่ 3 ไม่ได้เชื่อมต่อกับอะไรเลย ดังนั้นจึงถูกละเว้น
เอกสารข้อมูลระบุข้อกำหนดทางเทคนิครวมถึงการเชื่อมต่อข้อมูลที่สามารถดูได้ในตารางด้านล่าง -
จากตารางข้างต้นมีการแสดงอุณหภูมิและช่วงการวัดความชื้นและความถูกต้องสามารถวัดอุณหภูมิได้ตั้งแต่ 0-50 องศาเซลเซียสด้วยความแม่นยำ +/- 2 องศาเซลเซียสและความชื้นสัมพัทธ์ตั้งแต่ 20-90% RH ด้วยความแม่นยำ +/- 5% RH ข้อกำหนดรายละเอียดสามารถดูได้จากตารางด้านล่าง
การสื่อสารกับ DHT11 Sensor
ดังที่ได้กล่าวไว้ก่อนหน้านี้ในการอ่านข้อมูลจากDHT11 ด้วย PICเราต้องใช้PIC one wire Communication protocol รายละเอียดเกี่ยวกับวิธีการดำเนินการนี้สามารถเข้าใจได้จากแผนภาพการเชื่อมต่อของ DHT 11ซึ่งสามารถพบได้ในแผ่นข้อมูลดังที่ระบุไว้ด้านล่าง
DHT11 ต้องการสัญญาณเริ่มต้นจาก MCU เพื่อเริ่มการสื่อสาร ดังนั้นทุกครั้งที่ MCU จำเป็นต้องส่งสัญญาณเริ่มต้นไปยัง DHT11 Sensor เพื่อขอให้ส่งค่าของอุณหภูมิและความชื้น หลังจากเสร็จสิ้นสัญญาณเริ่มต้น DHT11 จะส่ง สัญญาณตอบสนองซึ่งรวมถึงข้อมูลอุณหภูมิและความชื้น การสื่อสารข้อมูลจะกระทำโดยรถบัสเดียวโปรโตคอลการสื่อสารข้อมูลความยาวข้อมูลเต็มคือ 40 บิตและเซ็นเซอร์จะส่งบิตข้อมูลที่สูงขึ้นก่อน
เนื่องจากตัวต้านทานแบบดึงขึ้นบรรทัดข้อมูลจะยังคงอยู่ที่ระดับ VCC เสมอระหว่างโหมดไม่ได้ใช้งาน MCU จำเป็นต้องดึงแรงดันไฟฟ้านี้ลงจากสูงไปต่ำเป็นระยะเวลาขั้นต่ำ 18ms ในช่วงเวลานี้เซ็นเซอร์ DHT11 จะตรวจจับสัญญาณเริ่มต้นและไมโครคอนโทรลเลอร์ทำให้สายข้อมูลสูงเป็นเวลา 20-40us เวลา 20-40us นี้เรียกว่าช่วงเวลารอคอยที่ DHT11 เริ่มตอบสนอง หลังจากช่วงเวลารอนี้ DHT11 จะส่งข้อมูลไปยังหน่วยไมโครคอนโทรลเลอร์
รูปแบบข้อมูลเซ็นเซอร์ DHT11
ข้อมูลประกอบด้วยทศนิยมและส่วนอินทิกรัลรวมกัน เซ็นเซอร์เป็นไปตามรูปแบบข้อมูลด้านล่าง -
ข้อมูล RH แบบอินทิกรัล 8 บิต + ข้อมูล RH ทศนิยม 8 บิต + ข้อมูล T ในตัว 8 บิต + ข้อมูล T ทศนิยม 8 บิต + การตรวจสอบ 8 บิต
สามารถตรวจสอบข้อมูลได้โดยตรวจสอบค่า checksumกับข้อมูลที่ได้รับ สิ่งนี้สามารถทำได้เนื่องจากหากทุกอย่างถูกต้องและหากเซ็นเซอร์ส่งข้อมูลที่เหมาะสมแล้วการตรวจสอบควรเป็นผลรวมของ “ ข้อมูล RH 8 บิตในตัว + ข้อมูล RHdata ทศนิยม 8 บิต + ข้อมูล T อินทิกรัล 8 บิต + ข้อมูล T ทศนิยม 8 บิต”
ส่วนประกอบที่จำเป็น
สำหรับโครงการนี้จำเป็นต้องมีสิ่งต่างๆด้านล่าง -
- การตั้งค่าการเขียนโปรแกรมไมโครคอนโทรลเลอร์ PIC (8 บิต)
- เขียงหั่นขนม
- หน่วยจ่ายไฟ 5V 500mA
- ตัวต้านทาน 4.7k 2pcs
- ตัวต้านทาน 1k
- PIC16F877A
- คริสตัล 20mHz
- 33pF คาปาซิเตอร์ 2 ชิ้น
- 16x2 ตัวอักษร LCD
- เซ็นเซอร์ DHT11
- สายจัมเปอร์
แผนผัง
แผนภาพวงจรสำหรับเชื่อมต่อDHT11 กับ PIC16F877Aแสดงไว้ด้านล่าง
เราใช้ LCD 16x2 เพื่อแสดงค่าอุณหภูมิและความชื้นที่เราวัดจาก DHT11 LCD เชื่อมต่อในโหมด 4 สายและทั้งเซ็นเซอร์และ LCD ใช้พลังงานจากแหล่งจ่ายไฟภายนอก 5V ฉันใช้เขียงหั่นขนมเพื่อทำการเชื่อมต่อที่จำเป็นทั้งหมดและใช้อะแดปเตอร์ 5V ภายนอก คุณยังสามารถใช้บอร์ดจ่ายไฟแบบเขียงหั่นขนมนี้เพื่อจ่ายไฟให้บอร์ดของคุณด้วย 5V
เมื่อวงจรพร้อมแล้วสิ่งที่เราต้องทำคืออัปโหลดรหัสที่ระบุไว้ที่ด้านล่างของหน้านี้และเราสามารถเริ่มอ่านอุณหภูมิและความชื้นได้ดังที่แสดงด้านล่าง หากคุณต้องการทราบว่าโค้ดเขียนอย่างไรและทำงานอย่างไรอ่านเพิ่มเติม นอกจากนี้คุณสามารถดูการทำงานทั้งหมดของโครงการนี้ได้ในวิดีโอที่ให้ไว้ที่ด้านล่างของหน้านี้
DHT11 พร้อมคำอธิบายรหัส PIC MPLABX
โค้ดนี้เขียนโดยใช้ MPLABX IDE และคอมไพล์โดยใช้คอมไพเลอร์ XC8 ซึ่งไมโครชิพจัดหาให้และดาวน์โหลดและใช้งานได้ฟรี โปรดดูบทช่วยสอนพื้นฐานเพื่อทำความเข้าใจพื้นฐานของการเขียนโปรแกรมเฉพาะฟังก์ชั่นสำคัญสามอย่างที่จำเป็นสำหรับการสื่อสารกับเซ็นเซอร์ DHT11 ดังที่กล่าวไว้ ฟังก์ชั่นคือ -
เป็นโมฆะ dht11_init (); เป็นโมฆะ find_response (); ถ่าน read_dht11 ();
ฟังก์ชั่นแรกจะใช้สำหรับสัญญาณการเริ่มต้นกับ dht11 ตามที่กล่าวไว้ก่อนหน้านี้การสื่อสารกับ DHT11 ทุกครั้งจะเริ่มต้นด้วยสัญญาณเริ่มต้นที่นี่ทิศทางของพินจะเปลี่ยนไปในตอนแรกเพื่อกำหนดค่าพินข้อมูลเป็นเอาต์พุตจากไมโครคอนโทรลเลอร์ จากนั้นสายข้อมูลจะถูกดึงให้ต่ำและรอ 18mS ต่อไป หลังจากนั้นอีกครั้งสายจะถูกสร้างขึ้นโดยไมโครคอนโทรลเลอร์และรอนานถึง 30us หลังจากเวลารอนั้นพินข้อมูลจะถูกกำหนดเป็นอินพุตไปยังไมโครคอนโทรลเลอร์เพื่อรับข้อมูล
เป็นโมฆะ dht11_init () { DHT11_Data_Pin_Direction = 0; // กำหนดค่า RD0 เป็นเอาต์พุต DHT11_Data_Pin = 0; // RD0 ส่ง 0 ไปยังเซ็นเซอร์ __delay_ms (18); DHT11_Data_Pin = 1; // RD0 ส่ง 1 ไปยังเซ็นเซอร์ __delay_us (30); DHT11_Data_Pin_Direction = 1; // กำหนดค่า RD0 เป็นอินพุต }
ฟังก์ชันถัดไปใช้สำหรับการตั้งค่าบิตตรวจสอบโดยขึ้นอยู่กับสถานะพินข้อมูล มันถูกใช้เพื่อตรวจสอบการตอบสนองจากเซ็นเซอร์ DHT11
เป็นโมฆะ find_response () { Check_bit = 0; __delay_us (40); ถ้า (DHT11_Data_Pin == 0) { __delay_us (80); ถ้า (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
ในที่สุดฟังก์ชั่นการอ่าน dht11; ที่นี่ข้อมูลจะอ่านเป็นรูปแบบ 8 บิตซึ่งข้อมูลจะถูกส่งกลับโดยใช้การดำเนินการกะบิตขึ้นอยู่กับสถานะพินข้อมูล
ถ่าน read_dht11 () { ข้อมูลถ่าน for_count; สำหรับ (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); ถ้า (DHT11_Data_Pin == 0) { data & = ~ (1 << (7 - for_count)); // ล้างบิต (7-b) } else { data- = (1 << (7 - for_count)); // ตั้งค่าบิต (7-b) ในขณะที่ (DHT11_Data_Pin); } } ส่งคืนข้อมูล; }
หลังจากนั้นทุกอย่างก็เข้าสู่ฟังก์ชันหลัก ขั้นแรกการเริ่มต้นระบบจะกระทำเมื่อเริ่มต้น LCD และกำหนดทิศทางพอร์ตพิน LCD ไปที่เอาต์พุต แอปพลิเคชันกำลังทำงานภายในฟังก์ชันหลัก
เป็นโมฆะ main () { system_init (); ในขณะที่ (1) { __delay_ms (800); dht11_init (); find_response (); ถ้า (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); สรุป = read_dht11 (); ถ้า (Summation == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { ความชื้น = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("อุณหภูมิ:"); // lcd_puts (""); lcd_data (48 + ((ความชื้น / 10)% 10)); lcd_data (48 + (ความชื้น% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("ความชื้น:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Checksum error"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("ข้อผิดพลาด !!!"); lcd_com (0xC0); lcd_puts ("ไม่มีการตอบสนอง"); } __delay_ms (1,000); } }
การสื่อสารกับเซ็นเซอร์ DHT11 จะกระทำภายในลูป while ซึ่งส่งสัญญาณเริ่มต้นไปยังเซ็นเซอร์ หลังจากนั้นฟังก์ชัน find_response จะถูกทริกเกอร์ หาก Check_bit เป็น 1 จะมีการสื่อสารเพิ่มเติมมิฉะนั้น LCD จะแสดงข้อความแสดงข้อผิดพลาด
ขึ้นอยู่กับข้อมูล 40 บิต read_dht11 เรียกว่า 5 ครั้ง (5 คูณ x 8 บิต) และจัดเก็บข้อมูลตามรูปแบบข้อมูลที่ให้ไว้ในแผ่นข้อมูล นอกจากนี้ยังมีการตรวจสอบสถานะการตรวจสอบและหากพบข้อผิดพลาดจะแจ้งใน LCD ด้วย สุดท้ายข้อมูลจะถูกแปลงและส่งไปยัง LCD 16x2 อักขระ
รหัสที่สมบูรณ์สำหรับการวัดอุณหภูมิและความชื้น PIC นี้สามารถดาวน์โหลดได้จากที่นี่ ตรวจสอบวิดีโอสาธิตด้านล่างด้วย
หวังว่าคุณจะเข้าใจโครงการและสนุกกับการสร้างสิ่งที่เป็นประโยชน์ หากคุณมีคำถามใด ๆ ทิ้งไว้ในส่วนความคิดเห็นด้านล่างหรือใช้ฟอรัมของเราสำหรับคำถามทางเทคนิคอื่น ๆ