- ส่วนประกอบที่ต้องการ: -
- DS18B20 เซ็นเซอร์อุณหภูมิ:
- แผนภูมิวงจรรวม:-
- ขั้นตอนหรือขั้นตอนของรหัส: -
- คำอธิบายรหัส:
- การรับข้อมูลจากเซ็นเซอร์อุณหภูมิ DS18B20:
โดยทั่วไปแล้วเซ็นเซอร์วัดอุณหภูมิ LM35 จะใช้กับไมโครคอนโทรลเลอร์เพื่อวัดอุณหภูมิเนื่องจากมีราคาถูกและหาได้ง่าย แต่ LM35 ให้ค่าอนาล็อกและเราจำเป็นต้องแปลงเป็นดิจิทัลโดยใช้ ADC (Analog to Digital Converter) แต่วันนี้เราใช้เซ็นเซอร์อุณหภูมิ DS18B20ซึ่งเราไม่จำเป็นต้องมีการแปลง ADC เพื่อให้ได้อุณหภูมิ ที่นี่เราจะใช้PIC ไมโครคอนโทรลเลอร์กับ DS18B20 เพื่อวัดอุณหภูมิ
ดังนั้นที่นี่เรากำลังสร้างเทอร์โมมิเตอร์ที่มีคุณสมบัติดังต่อไปนี้โดยใช้ไมโครคอนโทรลเลอร์ PIC16F877Aจากไมโครชิป
- จะแสดงอุณหภูมิเต็มช่วงตั้งแต่ -55 องศาถึง +125 องศา
- จะแสดงอุณหภูมิก็ต่อเมื่ออุณหภูมิเปลี่ยนแปลง + / -.2 องศา
ส่วนประกอบที่ต้องการ: -
- Pic16F877A - แพ็คเกจ PDIP40
- คณะกรรมการขนมปัง
- Pickit-3
- อะแดปเตอร์ 5V
- จอ LCD JHD162A
- DS18b20 เซ็นเซอร์อุณหภูมิ
- สายเชื่อมต่ออุปกรณ์ต่อพ่วง
- ตัวต้านทาน 4.7k - 2 ชิ้น
- หม้อ 10k
- คริสตัล 20mHz
- 2 ชิ้น 33pF ตัวเก็บประจุเซรามิก
DS18B20 เซ็นเซอร์อุณหภูมิ:
DS18B20 เป็นเซ็นเซอร์ที่ยอดเยี่ยมในการตรวจจับอุณหภูมิได้อย่างแม่นยำ เซ็นเซอร์นี้ให้ความละเอียด 9 บิตถึง 12 บิตในการตรวจจับอุณหภูมิ เซ็นเซอร์นี้สื่อสารด้วยสายไฟเพียงเส้นเดียวและไม่จำเป็นต้องใช้ ADC ใด ๆ ในการรับอุณหภูมิอะนาล็อกและแปลงเป็นดิจิทัล
ข้อกำหนดของเซ็นเซอร์คือ: -
- วัดอุณหภูมิตั้งแต่ -55 ° C ถึง + 125 ° C (-67 ° F ถึง + 257 ° F)
- ± 0.5 ° C ความแม่นยำตั้งแต่ -10 ° C ถึง + 85 ° C
- ความละเอียดที่ตั้งโปรแกรมได้ตั้งแต่ 9 Bits ถึง 12 Bits
- ไม่จำเป็นต้องมีส่วนประกอบภายนอก
- เซ็นเซอร์ใช้ 1-Wire® Interface
หากเราดูภาพ pinout ด้านบนจากแผ่นข้อมูลเราจะเห็นว่าเซ็นเซอร์มีลักษณะเหมือนกับแพ็คเกจ BC547 หรือ BC557, TO-92 พินแรกคือกราวด์พินที่สองคือ DQ หรือข้อมูลและพินที่สามคือ VCC
ด้านล่างนี้เป็นข้อมูลจำเพาะทางไฟฟ้าจาก Datasheet ซึ่งจำเป็นสำหรับการออกแบบของเรา แรงดันไฟฟ้าที่กำหนดสำหรับเซ็นเซอร์คือ + 3.0V ถึง + 5.5V นอกจากนี้ยังต้องดึงแรงดันไฟฟ้าซึ่งเหมือนกับแรงดันไฟฟ้าที่ระบุไว้ข้างต้น
นอกจากนี้ยังมีขอบความแม่นยำซึ่งอยู่ที่ + -0.5 องศาเซลเซียสสำหรับช่วง -10 องศา C ถึง +85 องศาเซลเซียสและความแม่นยำจะเปลี่ยนไปสำหรับระยะขอบเต็มช่วงซึ่งคือ + -2 องศาสำหรับ -55 องศาถึง + ช่วง 125 องศา
หากเราดูแผ่นข้อมูลอีกครั้งเราจะเห็นข้อกำหนดการเชื่อมต่อของเซ็นเซอร์ เราสามารถเชื่อมต่อเซ็นเซอร์ในโหมดพลังงานปรสิตที่สองสายที่มีความจำเป็น, ข้อมูลและ GND หรือเราสามารถเชื่อมต่อเซ็นเซอร์โดยใช้แหล่งจ่ายไฟภายนอกที่สายแยกสามเส้นที่มีความจำเป็นเราจะใช้การกำหนดค่าที่สอง
เนื่องจากตอนนี้เราคุ้นเคยกับการจัดอันดับพลังงานของเซ็นเซอร์และพื้นที่ที่เกี่ยวข้องกับการเชื่อมต่อตอนนี้เราจึงสามารถมุ่งเน้นไปที่การสร้างแผนผัง
แผนภูมิวงจรรวม:-
ถ้าเราเห็นแผนภาพวงจรเราจะเห็นว่า: -
LCD 16x2 ตัวอักษรเชื่อมต่อผ่านไมโครคอนโทรลเลอร์ PIC16F877A ซึ่ง RB0, RB1, RB2 เชื่อมต่อกับขา LCD RS, R / W และ E และ RB4, RB5, RB6 และ RB7 เชื่อมต่อผ่าน 4 พิน D4, D5, D6 ของ LCD D7. LCD เชื่อมต่อในโหมด 4 บิตหรือโหมดแทะ
ออสซิลเลเตอร์คริสตัล 20MHz พร้อมตัวเก็บประจุเซรามิกสองตัวที่ 33pF เชื่อมต่อผ่านขา OSC1 และ OSC2 จะให้ความถี่สัญญาณนาฬิกาคงที่ 20Mhz ให้กับไมโครคอนโทรลเลอร์
DS18B20 ยังเชื่อมต่อตามการกำหนดค่าพินและด้วยตัวต้านทานแบบดึงขึ้น 4.7k ตามที่กล่าวไว้ก่อนหน้านี้ ฉันเชื่อมต่อทั้งหมดนี้ในเขียงหั่นขนมแล้ว
หากคุณยังใหม่กับไมโครคอนโทรลเลอร์ PIC มากกว่าให้ทำตามบทช่วยสอนไมโครคอนโทรลเลอร์ PIC ของเราที่ระบุด้วยการเริ่มต้นใช้งานไมโครคอนโทรลเลอร์ PIC
ขั้นตอนหรือขั้นตอนของรหัส: -
- ตั้งค่าคอนฟิกของไมโครคอนโทรลเลอร์ซึ่งรวมถึงคอนฟิกูเรชันออสซิลเลเตอร์
- ตั้งค่าพอร์ตที่ต้องการสำหรับ LCD รวมถึง TRIS register
- ทุกรอบที่มีเซ็นเซอร์ ds18b20 เริ่มต้นด้วยการรีเซ็ตดังนั้นเราจะรีเซ็ต ds18b20 และรอการแสดงผลชีพจร
- เขียนแผ่นขูดและตั้งค่าความละเอียดของเซ็นเซอร์ 12 บิต
- ข้ามการอ่าน ROM ตามด้วยพัลส์รีเซ็ต
- ส่งคำสั่งแปลงอุณหภูมิ
- อ่านอุณหภูมิจากแผ่นขูด
- ตรวจสอบค่าอุณหภูมิว่าเป็นลบหรือบวก
- พิมพ์อุณหภูมิบนจอ LCD 16x2
- รอให้อุณหภูมิเปลี่ยนแปลง +/- 20 องศาเซลเซียส
คำอธิบายรหัส:
รหัสเต็มรูปแบบสำหรับดิจิตอลเทอร์โมมิเตอร์นี้จะได้รับในตอนท้ายของการกวดวิชานี้กับที่วิดีโอสาธิตคุณจะต้องใช้ไฟล์ส่วนหัวเพื่อเรียกใช้โปรแกรมนี้ซึ่งสามารถดาวน์โหลดได้จากที่นี่
ขั้นแรกเราต้องตั้งค่าบิตการกำหนดค่าในไมโครคอนโทรลเลอร์ pic จากนั้นเริ่มต้นด้วย ฟังก์ชัน หลักที่เป็นโมฆะ
จากนั้นสี่บรรทัดด้านล่างจะใช้สำหรับการรวมทั้งห้องสมุดไฟล์ส่วนหัว, lcd.h และds18b20.h และ xc.h ใช้ สำหรับไฟล์ส่วนหัวของไมโครคอนโทรลเลอร์
# รวม
คำนิยามเหล่านี้จะใช้สำหรับการส่งคำสั่งเซ็นเซอร์อุณหภูมิคำสั่งแสดงอยู่ในแผ่นข้อมูลของเซ็นเซอร์
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
ตารางที่ 3 จากแผ่นข้อมูลของเซ็นเซอร์แสดงคำสั่งทั้งหมดที่ใช้มาโครเพื่อส่งคำสั่งตามลำดับ
อุณหภูมิจะแสดงในหน้าจอก็ต่อเมื่ออุณหภูมิเปลี่ยนแปลง +/- .20องศา เราสามารถเปลี่ยนช่องว่างอุณหภูมินี้ได้จากมาโคร temp_gap นี้ เมื่อเปลี่ยนค่าที่มาโครนี้ข้อกำหนดจะเปลี่ยนไป
ตัวแปรลอยอีกสองตัวที่ใช้สำหรับจัดเก็บข้อมูลอุณหภูมิที่แสดงและแยกความแตกต่างด้วยช่องว่างของอุณหภูมิ
# กำหนด temp_gap 20 float pre_val = 0, aft_val = 0;
ในฟังก์ชัน void main () , lcd_init () ; เป็นฟังก์ชันในการเริ่มต้น LCD นี้ lcd_init () ฟังก์ชั่นที่เรียกว่าจากlcd.hห้องสมุด
ทริสรีจิสเตอร์ใช้เพื่อเลือกพิน I / O เป็นอินพุตหรือเอาต์พุต สองตัวแปรสั้นที่ไม่ได้ลงชื่อ TempL และ TempH ถูกนำมาใช้สำหรับการจัดเก็บข้อมูลที่มีความละเอียด 12 บิตจากเซ็นเซอร์อุณหภูมิ
โมฆะ main (โมฆะ) {TRISD = 0xFF; ทริซ่า = 0x00; ทริสบี = 0x00; //TRISDbits_t.TRISD6 = 1; TempL สั้นที่ไม่ได้ลงนาม TempH; int ไม่ได้ลงนาม t, t2; ลอยแตกต่าง 1 = 0, ความแตกต่าง 2 = 0; lcd_init ();
มาดู while loop ที่นี่เรากำลังแบ่ง while (1) loop เป็นชิ้นเล็ก ๆ
เส้นเหล่านี้ใช้เพื่อตรวจจับว่าเซ็นเซอร์อุณหภูมิเชื่อมต่ออยู่หรือไม่
ในขณะที่ (ow_reset ()) {lcd_com (0x80); lcd_puts ("กรุณาเชื่อมต่อ"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
ด้วยการใช้รหัสส่วนนี้เราจะเริ่มต้นเซ็นเซอร์และส่งคำสั่งเพื่อแปลงอุณหภูมิ
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (ความละเอียด _12 บิต); // ความละเอียด 12 บิต ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
รหัสนี้ใช้สำหรับจัดเก็บข้อมูลอุณหภูมิ 12 บิตในตัวแปรสั้นสองตัวที่ไม่ได้ลงชื่อ
ในขณะที่ (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
จากนั้นหากคุณตรวจสอบรหัสทั้งหมดด้านล่างเราได้สร้างเงื่อนไข if-else เพื่อค้นหาสัญญาณอุณหภูมิว่าเป็นบวกหรือลบ
ด้วยการใช้รหัสคำสั่ง If เราจัดการข้อมูลและดูว่าอุณหภูมิเป็นลบหรือไม่และตรวจสอบว่าการเปลี่ยนแปลงอุณหภูมิอยู่ในช่วง +/-.20 องศาหรือไม่ และในส่วน อื่น เราตรวจสอบว่าอุณหภูมิเป็นบวกหรือไม่และการตรวจจับการเปลี่ยนแปลงอุณหภูมิ
รหัส
การรับข้อมูลจากเซ็นเซอร์อุณหภูมิ DS18B20:
มาดูช่องว่างเวลาของอินเทอร์เฟซ 1-Wire® เราใช้คริสตัล 20Mhz หากเราดูภายในไฟล์ ds18b20.c เราจะเห็นไฟล์
# กำหนด _XTAL_FREQ 20000000
คำจำกัดความนี้ใช้สำหรับรูทีนหน่วงเวลาคอมไพเลอร์ XC8 20Mhz ถูกตั้งค่าเป็นความถี่คริสตัล
เราทำหน้าที่ห้าอย่าง
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
โปรโตคอล1-Wire ®ต้องการช่องที่เกี่ยวข้องกับเวลาที่เข้มงวดในการสื่อสาร ภายในแผ่นข้อมูลเราจะได้รับข้อมูลที่เกี่ยวข้องกับช่วงเวลาที่สมบูรณ์แบบ
ภายในฟังก์ชันด้านล่างเราได้สร้างช่วงเวลาที่แน่นอน สิ่งสำคัญคือต้องสร้างการหน่วงเวลาที่แน่นอนสำหรับการระงับและปล่อยและควบคุมบิต TRIS ของพอร์ตของเซ็นเซอร์
ถ่านไม่ได้ลงนาม ow_reset (โมฆะ) {DQ_TRIS = 0; // Tris = 0 (เอาต์พุต) DQ = 0; // ตั้งค่าพิน # เป็นต่ำ (0) __delay_us (480); // 1 สายต้องหน่วงเวลา DQ_TRIS = 1; // Tris = 1 (อินพุต) __delay_us (60); // 1 สายต้องหน่วงเวลาถ้า (DQ == 0) // หากมีการแสดงตน {__delay_us (480) กลับ 0; // ส่งคืน 0 (1-wire คือการแสดงตน)} else {__delay_us (480); กลับ 1; // return 1 (1-wire ไม่ใช่สถานะ)}} // 0 = การแสดงตน 1 = ไม่มีส่วน
ตอนนี้ตามคำอธิบายช่วงเวลาด้านล่างที่ใช้ในการอ่านและเขียนเราได้สร้างฟังก์ชัน อ่าน และ เขียน ตามลำดับ
ถ่าน read_bit ที่ไม่ได้ลงชื่อ (โมฆะ) {ถ่านที่ไม่ได้ลงนาม i; DQ_TRIS = 1; DQ = 0; // ดึง DQ ให้ต่ำเพื่อเริ่มไทม์สลอต DQ_TRIS = 1; DQ = 1; // จากนั้นกลับสูงสำหรับ (i = 0; i <3; i ++); // หน่วงเวลา 15us จากจุดเริ่มต้นของการคืนค่า timeslot (DQ); // ส่งกลับค่าของ DQ line} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // ดึง DQ ให้ต่ำเพื่อเริ่มช่วงเวลาถ้า (bitval == 1) DQ = 1; // ส่งคืน DQ สูงถ้าเขียน 1 __delay_us (5); // ระงับค่าสำหรับช่วงเวลาที่เหลือ DQ_TRIS = 1; DQ = 1; } // Delay ให้ 16us ต่อลูปบวก 24us ดังนั้นความล่าช้า (5) = 104us
นอกจากนี้การตรวจสอบทั้งหมดที่เกี่ยวข้องกับส่วนหัวและส่วน.c ไฟล์ที่นี่
ดังนั้นนี่คือวิธีการที่เราสามารถใช้เซ็นเซอร์ DS18B20 เพื่อให้ได้อุณหภูมิที่มีไมโครคอนโทรลเลอร์
หากคุณต้องการสร้างเครื่องวัดอุณหภูมิดิจิตอลอย่างง่ายด้วย LM35ให้ชำระเงินด้านล่างโครงการที่มีไมโครคอนโทรลเลอร์อื่น ๆ:
- การวัดอุณหภูมิห้องด้วย Raspberry Pi
- เครื่องวัดอุณหภูมิดิจิตอลโดยใช้ Arduino และ LM35
- เครื่องวัดอุณหภูมิดิจิตอลโดยใช้ LM35 และ 8051
- การวัดอุณหภูมิโดยใช้ไมโครคอนโทรลเลอร์ LM35 และ AVR