สารบัญ:

DIY Logging Thermometer พร้อมเซ็นเซอร์ 2 ตัว: 3 ขั้นตอน (พร้อมรูปภาพ)
DIY Logging Thermometer พร้อมเซ็นเซอร์ 2 ตัว: 3 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: DIY Logging Thermometer พร้อมเซ็นเซอร์ 2 ตัว: 3 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: DIY Logging Thermometer พร้อมเซ็นเซอร์ 2 ตัว: 3 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Arduino data logger with two temperature sensors (LM35DZ) from my 3D printing material in car test 2024, พฤศจิกายน
Anonim
เทอร์โมมิเตอร์บันทึก DIY พร้อมเซ็นเซอร์ 2 ตัว
เทอร์โมมิเตอร์บันทึก DIY พร้อมเซ็นเซอร์ 2 ตัว
เทอร์โมมิเตอร์บันทึก DIY พร้อมเซ็นเซอร์ 2 ตัว
เทอร์โมมิเตอร์บันทึก DIY พร้อมเซ็นเซอร์ 2 ตัว

โครงการนี้เป็นการปรับปรุงจากโครงการก่อนหน้าของฉัน "DIY Logging Thermometer" บันทึกการวัดอุณหภูมิไปยังการ์ด micro SD

การเปลี่ยนแปลงฮาร์ดแวร์

ฉันเพิ่มเซ็นเซอร์อุณหภูมิ DS18B20 ลงในโมดูลนาฬิกาแบบเรียลไทม์ซึ่งมีข้อกำหนดอยู่บนแผงวงจรพิมพ์สำหรับอุปกรณ์นี้ และเพิ่มสายที่เหมาะสมจากพิน "DS" ของ RTC ไปยัง D2 ของ Arduino

การเปลี่ยนแปลงซอฟต์แวร์

จากนั้นฉันก็เพิ่มและแก้ไขซอฟต์แวร์ การเปลี่ยนแปลงหลักคือ:

จอ LCD แสดงอุณหภูมิสองระดับ "เข้า" และ "ออก"

ไฟล์บันทึกที่บันทึกในการ์ด SD มีฟิลด์อุณหภูมิสองฟิลด์ "อุณหภูมิเข้า" และ "อุณหภูมิออก"

เนื่องจากบันทึกในการ์ด SD นานขึ้น บัฟเฟอร์สำหรับ EEPROM จึงมีขนาดใหญ่ขึ้น และด้วยเหตุนี้เอง ฉันจึงเริ่มมีปัญหาหน่วยความจำขัดแย้งกัน ฉันได้ทำการเปลี่ยนแปลงหลายอย่างเพื่อลดการใช้หน่วยความจำแบบไดนามิก รวมถึงการใช้อาร์เรย์อักขระสำหรับสตริงทั้งหมดแทนออบเจ็กต์สตริง

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

จากการทดสอบที่ฉันทำ การระบุหัววัดอุณหภูมิ และการตอบสนองต่อการถอดและเปลี่ยนการ์ด SD ยังคงทำงานได้อย่างราบรื่น

ขั้นตอนที่ 1: การพัฒนาซอฟต์แวร์

ขั้นตอนนี้จะให้ซอฟต์แวร์ตัวเต็มสำหรับโครงการที่เสร็จสมบูรณ์ ฉันรวบรวมโดยใช้ Arduino IDE 1.6.12 ใช้หน่วยความจำโปรแกรม 21, 400 ไบต์ (69%) และหน่วยความจำแบบไดนามิก 1, 278 ไบต์ (62%)

ฉันได้ใส่ความคิดเห็นในโค้ดโดยหวังว่าจะทำให้ชัดเจนว่าเกิดอะไรขึ้น

ขั้นตอนที่ 2: การทำงานกับเซ็นเซอร์อุณหภูมิสองตัว - รายละเอียด

ซอฟต์แวร์นี้ใช้ไลบรารี "OneWire" ไม่ใช้ "DallasTemperature" หรือไลบรารีที่คล้ายกัน แทนคำสั่งและข้อมูลจากเซ็นเซอร์อุณหภูมิจะทำโดยภาพร่างและสามารถมองเห็นและเข้าใจได้ค่อนข้างง่าย ฉันพบรายการคำสั่งห้องสมุด OneWire ที่มีประโยชน์ที่

www.pjrc.com/teensy/td_libs_OneWire.html

เมื่อมีเซ็นเซอร์อุณหภูมิสองตัว (หรือมากกว่า) จำเป็นต้องระบุว่าตัวไหนเป็นตัวไหน

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

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

ความตั้งใจของฉันคือซอฟต์แวร์ควรระบุเซ็นเซอร์โดยอัตโนมัติและจัดสรรให้ "เข้า" และ "ออก" อย่างถูกต้อง ทำได้ง่ายโดยวางบนพิน Arduino แยกกัน ในโปรเจ็กต์นี้ A0 ถึง A3 และ A6 และ A7 ทั้งหมดไม่ได้ใช้ ดังนั้นจึงสามารถใช้หนึ่งในนั้นในกรณีนี้ อย่างไรก็ตาม ฉันประสบความสำเร็จในการให้การระบุอัตโนมัติทำงานกับเซ็นเซอร์ทั้งสองบนบัส OneWire เดียวกันได้

มันทำงานเช่นนี้

ไลบรารี OneWire มีคำสั่ง "OneWireObject.search(address)" โดยที่ "address" เป็นอาร์เรย์ขนาด 8 ไบต์ และ "OneWireObject" เป็นชื่อของอินสแตนซ์ของวัตถุ OneWire ที่สร้างขึ้นก่อนหน้านี้ สามารถมีชื่อใดก็ได้ที่คุณชอบ ของฉันเรียกว่า "ds" เมื่อคุณออกคำสั่ง "ค้นหา" นี้ ไลบรารี OneWire จะส่งสัญญาณบางอย่างบนบัสสายเดียว หากพบเซ็นเซอร์ตอบสนอง จะส่งคืนค่าบูลีน "TRUE" และเติมอาร์เรย์ "ที่อยู่" ด้วยตัวระบุที่ไม่ซ้ำกันขนาด 8 ไบต์ของเซ็นเซอร์ ตัวระบุนี้มีรหัสครอบครัว (ตอนต้น) และผลรวมของเช็ค (ตอนท้าย) ในระหว่างนั้นมีขนาด 6 ไบต์ที่ระบุเซ็นเซอร์ภายในตระกูลโดยเฉพาะ

จะได้รับผลลัพธ์หนึ่งรายการ (ที่อยู่และส่งคืน TRUE) ทุกครั้งที่ได้รับคำสั่งนี้ โดยวนผ่านอุปกรณ์ทั้งหมดบนบัส OneWire เมื่ออุปกรณ์ทุกเครื่องตอบรับแล้ว ในครั้งถัดไปที่ออก "การค้นหา" การส่งคืนจะเป็น "FALSE" ซึ่งแสดงว่าอุปกรณ์ทั้งหมดบนรถบัสได้ตอบกลับแล้ว หากมีการออก "การค้นหา" อีกครั้ง อุปกรณ์เครื่องแรกจะตอบสนองอีกครั้ง และอื่นๆ อย่างไม่มีกำหนด อุปกรณ์จะตอบสนองในลำดับเดียวกันเสมอ ลำดับของการตอบสนองจะขึ้นอยู่กับตัวระบุของอุปกรณ์บนบัส OneWire ดูเหมือนว่าจะเป็นการค้นหาแบบไบนารีโดยเริ่มจากบิตที่มีนัยสำคัญน้อยที่สุดของตัวระบุอุปกรณ์ โปรโตคอลที่ใช้ค้นหาตัวระบุเหล่านี้ค่อนข้างซับซ้อน และอธิบายไว้ในหน้า 51 - 54 ของเอกสาร "Book of iButton Standards" ซึ่งเป็นเอกสาร pdf ที่ https://pdfserv.maximintegrated.com/en/an/AN937.pd …

ฉันทดสอบกระบวนการค้นหานี้ด้วยเซ็นเซอร์ 1 ถึง 11 ตัวบนรถบัสคันเดียว และพบว่าลำดับการตอบสนองสำหรับชุดอุปกรณ์ที่กำหนดนั้นเหมือนกันเสมอ แต่เมื่อฉันเพิ่มอุปกรณ์ใหม่ที่ส่วนท้ายของรถบัส ไม่มีทาง ฉันสามารถคาดเดาได้ว่าโฆษณาจะปรากฏที่ใดในลำดับการค้นหา ตัวอย่างเช่น เซ็นเซอร์ตัวที่ 11 ที่ฉันเพิ่มเข้ามาที่ตำแหน่งที่ 5; และเซ็นเซอร์ตัวแรกที่ฉันใส่ไว้บนรถบัส ก็ไม่อยู่ในลำดับการค้นหาสุดท้าย

ในโครงการนี้มีเซ็นเซอร์สองตัว หนึ่งในนั้นจะถูกบัดกรีเข้าที่บนโมดูล RTC อีกอันเสียบปลั๊กโดยใช้ส่วนหัวของตัวผู้บนกระดานและส่วนหัวของตัวเมียบนสายเคเบิล สามารถถอดออกได้ง่าย

เมื่อถอดเซ็นเซอร์บนสายเคเบิล (เซ็นเซอร์ "ออก") คำสั่ง "ค้นหา" จะสร้าง "TRUE" และ "FALSE" สลับกัน

เมื่อต่อเซ็นเซอร์เข้ากับสายเคเบิล คำสั่ง "search" จะสร้างวงจร 3 ขั้นตอน โดยจะส่ง "TRUE" สองครั้งและ "FALSE" หนึ่งรายการกลับมา

ขั้นตอนของฉันคือการออกคำสั่ง "ค้นหา" 1, 2 หรือ 3 คำสั่ง จนกว่าจะได้ผลลัพธ์ FALSE จากนั้นฉันก็ออกคำสั่ง "ค้นหา" อีก 2 คำสั่ง หากตัวที่สองล้มเหลว (เช่น FALSE) ฉันรู้ว่ามีเซ็นเซอร์เพียงตัวเดียวบนรถบัสและเป็นเซ็นเซอร์ "ใน" ข้อมูลประจำตัวของอุปกรณ์จะถูกบันทึกและจัดสรรให้กับเซ็นเซอร์ "ใน"

ในเวลาต่อมา หากการส่งคืนครั้งแรกและครั้งที่สองเป็นจริง ฉันรู้ว่ามีเซ็นเซอร์สองตัวบนรถบัส ฉันตรวจสอบว่าตัวใดตัวหนึ่งมีตัวตนเท่ากับเซ็นเซอร์ "ใน" และจัดสรรอีกอันให้เป็นเซ็นเซอร์ "ออก"

อีกประเด็นรองคือการรวบรวมผลลัพธ์จากเซ็นเซอร์สองตัวนั้นทำได้โดยส่ง "การแปลงเริ่มต้น" โดยคำสั่ง "ข้าม ROM" เรามีตัวเลือกในการส่งคำสั่งไปยังอุปกรณ์เครื่องเดียว (โดยใช้ตัวระบุที่ไม่ซ้ำกัน) หรือไปยังอุปกรณ์ทั้งหมดบนบัส (ข้าม ROM) รหัสมีลักษณะดังนี้:

ds.รีเซ็ต(); //

// ส่งคำสั่ง "skip ROM" (เพื่อให้คำสั่งถัดไปใช้งานได้ในเซ็นเซอร์ทั้งสอง) ds.write(0xCC); // ข้ามคำสั่ง ROM ds.write(0x44, 0); // เริ่มการแปลงในโพรบทั้งสอง temperature_state = wait_convert; // ไปที่สถานะล่าช้า

เมื่อผ่านเวลาหน่วงที่ต้องการแล้ว อุณหภูมิจะได้รับจากเซ็นเซอร์แต่ละตัวแยกกัน นี่คือรหัสสำหรับเซ็นเซอร์ตัวที่สอง (เช่น เซ็นเซอร์ OUT)

ถ้า (flag2) {

ปัจจุบัน = ds.reset(); ds.select(DS18B20_addr_out); ds.write(0xBE); // อ่าน Scratchpad ของข้อมูลโพรบ "ออก" [0] = ds.read(); ข้อมูล[1] = ds.read(); temperature_out = (ข้อมูล[1] << 8) + data[0]; temperature_out = (6 * temperature_out) + temperature_out / 4; // คูณด้วย 6.25 } else { // ไม่ใช่ flag2 - เช่น Out sensor ไม่ได้เชื่อมต่อ temperature_out = 30000; // แก้ไขที่ 300.00 C หากเซ็นเซอร์อุณหภูมิไม่ทำงาน } // สิ้นสุด if (flag2)

ฉันทำงานส่วนใหญ่ของซอฟต์แวร์นี้ในแบบร่างแบบสแตนด์อโลนที่มีเซ็นเซอร์อุณหภูมิอยู่ในนั้น โดยไม่ต้องยุ่งยากกับการรองรับ LCD, RTC และการ์ด SD ร่างการพัฒนานี้อยู่ในไฟล์ด้านล่าง

ขั้นตอนที่ 3: ผลลัพธ์เบื้องต้น

ผลการศึกษาเบื้องต้น
ผลการศึกษาเบื้องต้น

แผนภูมินี้เป็นการผสมผสานระหว่างสองวันแรกของการอ่าน

แนะนำ: