วัดอุณหภูมิอย่างแม่นยำด้วย Arduino


10

ฉันพยายามสร้างเทอร์โมสตัลด้วย Arduino ฉันต้องการพลังงานโดยใช้แบตเตอรี่โทรศัพท์ / เครื่องชาร์จซึ่งทำให้แรงดันไฟฟ้าของระบบค่อนข้างผันแปร ตอนนี้ฉันใช้ Arduino Uno แต่เมื่อเสร็จแล้วฉันจะพอร์ตไปยัง Lilypad

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

การใช้การอ้างอิง 5 โวลต์ในตัวสำหรับเซ็นเซอร์อะนาล็อกนั้นใช้งานไม่ได้เลย - แม้จะใช้พลังงานจาก + 5V ของ USB arduino เป็นจริงแล้ว + 4.8V (ซึ่งเปลี่ยนอุณหภูมิที่วัดได้เพียงไม่กี่องศา) เมื่อบอร์ดขับเคลื่อนจากแบตเตอรี่แรงดันไฟฟ้าจะลดลงประมาณ 4V และวัดอุณหภูมิจรวดของท้องฟ้า ฉันพยายามใช้ + 3.3V จากบอร์ดเป็นข้อมูลอ้างอิง ดูเหมือนว่าจะมีเสถียรภาพมากขึ้นเมื่อบอร์ดขับเคลื่อนจาก USB แต่แรงดันไฟฟ้าลดลงเมื่อแบตเตอรี่หมด

มีวิธีอื่นอีกไหมในการวัดแรงดันเอาต์พุตของเซ็นเซอร์

สำหรับขั้นตอนที่สองฉันวางแผนที่จะใช้เทอร์มิสเตอร์ เพิ่งสั่งคู่ของเหล่า 20K เทอร์มิสเตอร์

จากสิ่งที่ฉันเข้าใจสิ่งเหล่านี้ควรจะวัดได้ง่ายขึ้นถ้าฉันสร้างตัวแบ่งแรงดันและใช้ V_in เป็นแรงดันอ้างอิงสำหรับ ADC

คำถามสองสามข้อเกี่ยวกับพวกเขา:

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

กรุณาโพสต์รหัสการแปลงอุณหภูมิของคุณ
geometrikal

โปรดระบุความหมายโดย "แม่นยำ" คุณพยายามที่จะบรรลุความละเอียดของอุณหภูมิและความแม่นยำระดับใด
Joe Hass

ฉันหวังว่าจะได้รับความละเอียดประมาณ 1-2 องศา ข้อผิดพลาดในการปรับเทียบที่สมบูรณ์แบบที่ 1-2 องศาก็น่าจะใช้ได้เช่นกัน จากสิ่งที่ฉันเข้าใจมันค่อนข้างง่ายที่จะได้รับจุดอ้างอิงที่ 0C และฉันคิดว่าฉันจะได้จุดที่สอง (หยาบกว่ามาก) ที่อุณหภูมิห้องโดยใช้เซ็นเซอร์ปรับเทียบข้าม
Usov

1-2 องศาสำหรับอุณหภูมิในช่วง 5-25C
Usov

@geometrikal ฉันไม่มีมันอยู่ในมือตอนนี้ แต่โดยพื้นฐานแล้วมันก็เหมือนกับคนอื่น ๆ : วางตัวอย่างแรกรอสักสองสามมิลลิวินาทีตัวอย่างอีกสองสามครั้งและตัวอย่างเฉลี่ย จากนั้นให้คุณลดระดับแรงดันอ้างอิงของคุณ
Usov

คำตอบ:


2

ดูเหมือนว่าคุณรู้ปัญหาเกี่ยวกับการเปลี่ยนแปลงแรงดันอ้างอิงและถ้าคุณใช้อุปกรณ์เช่น TMP36 (คงที่ 10mV / degC) ไม่มีอะไรที่คุณสามารถทำได้นอกเหนือจากการใช้แรงดันอ้างอิงจากชิปเพื่อทำให้สิ่งต่าง ๆ มีเสถียรภาพ

อย่างไรก็ตามหากคุณใช้ RTD หรือเทอร์มิสเตอร์แล้วปัญหาจะไม่เกิดขึ้น คุณ ADC กำลังทำการวัด ratiometric - มันเปรียบเทียบอินพุต ADC กับแรงดันอ้างอิง แต่ถ้าคุณใช้กำลัง RTD หรือเทอร์มิสเตอร์ (ผ่านตัวต้านทานที่เหมาะสม) จากแรงดันอ้างอิงเดียวกันจะไม่มีผลต่อการอ่าน ถ้าค่าอ้างอิงเพิ่มขึ้น 10% แรงดันจะเข้าสู่ ADC


4

ฉันคิดว่าคุณควรพิจารณาใช้เซ็นเซอร์วัดอุณหภูมิแบบดิจิตอลเช่น DS18B20 / DS18S20 เพราะมันไม่ได้ขึ้นอยู่กับความถูกต้องของ ATmega ADC ของคุณในการวัดสัญญาณ anaolg ใช้โปรโตคอลดิจิตอล 1 สายเพื่อรายงานอุณหภูมิ

อ้างถึงบทเรียนต่อไปนี้
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino


2
คำตอบนี้ไม่เป็นประโยชน์เว้นแต่คุณจะอธิบายว่าเพราะเหตุใด OP จึงควรเปลี่ยนไปใช้เซ็นเซอร์ตัวอื่นและคุณไม่ได้ให้เหตุผลสำหรับเรื่องนั้น เพียงแค่ให้ลิงก์ในคำตอบไม่ใช่ความคิดที่ดีเพราะมันมักจะตายและเนื้อหาของคำตอบนั้นหายไป
Joe Hass

แทนที่จะเขียนคำตอบของฉันเองในบรรทัดเดียวกันฉันได้แก้ไข A นี้เพื่อแก้ไขข้อกังวลที่โจยกขึ้น
RedGrittyBrick

@JoeHass ทางเลือกเดียวนอกเหนือจากการลิงก์ไปยังบทความภายนอกคือการแนบรหัสในการตอบกลับ แต่ฉันไม่มีรหัสของตัวเองที่จะแนบและมันจะไม่ยุติธรรมที่จะแนบรหัสของคนอื่นโดยไม่ได้รับความยินยอม แม้ว่าการเชื่อมโยงจะไปห้องสมุดสำหรับ Arduino สามารถพบได้ง่ายโดยใช้ google และ DS18B20 เป็นคำหลัก เกี่ยวกับคำอธิบายมันเป็นความผิดพลาดของฉันฉันคิดว่าการระบุว่าเซ็นเซอร์เป็นแบบดิจิทัลจะอธิบายจุดของฉัน
alexan_e

ขอบคุณสำหรับความคิดเห็น ด้วยเหตุผลบางประการเซ็นเซอร์ดิจิตอลค่อนข้างหายาก ซัพพลายเออร์ในท้องถิ่น (Maplin) หรือผู้ชายออนไลน์ราคาถูก (ฉันใช้ Spiraltronics) ไม่ได้ขาย £ 3 การส่งป๊อป + ยังทำให้ตัวเลือกค่อนข้างแพง
Usov

@Usov การตัดสินจากลิงก์ที่คุณให้ฉันถือว่าคุณอยู่ในสหราชอาณาจักร ฉันมักจะซื้อส่วนประกอบเหล่านี้ราคาถูกจากประเทศจีน แต่ฉันก็พบพวกเขาในebay.uk ด้วยราคา£ 1.49 บางทีพวกเขาอาจจะเหมาะกับคุณ
alexan_e

3

การวัดของคุณจะดีเหมือนแรงดันอ้างอิงสำหรับ ADC ดี Arduino โดยค่าเริ่มต้นใช้แรงดันไฟฟ้าอุปทานเป็นแรงดันอ้างอิง แต่ในกรณีของคุณวิธีที่ถูกต้องที่จะใช้ Aref pin of arduino คุณต้องได้รับชิปพิเศษที่เรียกว่า "การอ้างอิงแรงดันไฟฟ้า" และเชื่อมต่อกับขา Aref แล้วตั้งค่า ADC เพื่อใช้การอ้างอิงภายนอกในรหัส Arduino ( analogReference(EXTERNAL))

ต้องเลือกแรงดันไฟฟ้าของการอ้างอิงเพื่อให้การแกว่งตัวเซ็นเซอร์อุณหภูมิของคุณพอดีกับแรงดันอ้างอิง TMP36 จะส่งออก ~ 1.5V @ 100C ดังนั้นคุณจะต้องใช้การอ้างอิงข้างต้น 1.5V สำหรับการวัดอุณหภูมิสูงถึง 100C คุณต้องการให้การอ้างอิงของคุณใกล้เคียงกับแรงดันไฟฟ้าสูงสุดที่วัดได้เพื่อให้ได้ความละเอียดมากที่สุด

Atmega328p มีการอ้างอิงภายในสองรายการที่สามารถใช้งานได้โดยไม่ต้องมีส่วนประกอบภายนอกใด ๆ หนึ่งอันคือ 1.1V, อีก 2.56V พวกเขามักจะมีความแม่นยำที่เลวร้ายยิ่งกว่าสิ่งที่คุณจะได้รับโดยใช้ส่วนประกอบเฉพาะภายนอก ตรวจสอบเอกสาร Arduino สำหรับanalogReferenceและ Atmega328p แผ่นข้อมูลเพื่อความถูกต้องอ้างอิงภายใน

หากคุณต้องการรับถั่วที่มีช่วงที่แตกต่างกันคุณสามารถใช้การอ้างอิงภายนอกจำนวนมากและสลับไปมาได้โดยใช้สวิตช์แบบอะนาล็อกเช่น 74hc4051 หรือคุณสามารถสลับระหว่างการอ้างอิงภายในสองรายการ

ด้วยเทอร์มิสเตอร์คุณจะได้ผลลัพธ์ที่ดีกว่าหากคุณตั้งค่าแหล่งจ่ายกระแสคงที่แทนการใช้ตัวต้านทานแบบใบ้ ในอีกด้านหนึ่ง - ตัวต้านทานใบ้ที่ขับเคลื่อนจากการอ้างอิงแรงดันไฟฟ้าที่เสถียรจะทำงานได้ดี

เมื่อเลือกข้อมูลอ้างอิงภายนอกตรวจสอบให้แน่ใจว่าคุณมีแรงดันไฟฟ้าเพียงพอที่จะรองรับแรงดันไฟฟ้าตกเมื่อเปิดเครื่องจากแบตเตอรี่และแบตเตอรี่แบน Vref + Vdropout <Vbat-min


ขอบคุณสำหรับความคิดเห็นของคุณ นี่เป็นความคิดเห็นเดียวกับที่ฉันได้รับในวันนี้ - สร้างแรงดันอ้างอิงของฉันเองบนซีเนอร์ไดโอดหรือรับตัวควบคุมแรงดันไฟฟ้าต่ำเฉพาะสำหรับ AREF
Usov

ทำไมถึงได้ผลลัพธ์ที่ดีขึ้นด้วยกระแสคงที่และเทอร์มิสเตอร์
geometrikal

2

การไม่มีการอ้างอิง ADC ที่มีเสถียรภาพนั้นเป็นอาการของปัญหาอื่นในวงจรของคุณ: คุณไม่ได้จ่ายแรงดันไฟฟ้าที่สูงพอให้กับบอร์ด นี่คือการระบุโดยอุปทาน 5V ลดลงถึง 4V และลดลง 3.3V เช่นกัน

ตัวควบคุมแรงดันไฟฟ้า (MC33269D-5.0 IIRC) บนบอร์ด Arduino มีแรงดันตกคร่อมประมาณ ~ 1.0V ดังนั้นคุณต้องจ่ายอย่างน้อย 6V เพื่อรับเอาท์พุท 5V ที่เสถียร แบตเตอรี่ AA เริ่มต้นที่ 1.5-1.6V และเกือบจะตายที่ 1.1V ดังนั้นคุณต้องจ่ายไฟให้กับบอร์ดอย่างน้อย 6 ก้อนเพื่อให้ได้ผลลัพธ์ที่มั่นคงตลอดอายุการใช้งานแบตเตอรี่

ขับเคลื่อนอย่างถูกต้องคุณสามารถใช้การอ้างอิง ADC ภายในหรือสาย 5V หรือ 3.3V เนื่องจากเซ็นเซอร์อุณหภูมิแตกต่างกันประมาณ 10mV ต่อองศาเซลเซียสคุณสามารถใช้ตัวแบ่งแรงดันไฟฟ้าเพื่อตั้งค่าแรงดันอ้างอิงเท่ากับแรงดันเอาท์พุทเซ็นเซอร์สูงสุดที่คาดหวัง (เช่น 50 องศา C) นี่จะทำให้การวัดแม่นยำยิ่งขึ้น

หากคุณต้องการที่จะใช้น้อยกว่า 6 แบตเตอรี่ AA ลองแปลงเพิ่ม DC-DC เช่นhttps://www.sparkfun.com/products/10968 ตัวอย่างที่เชื่อมโยงใช้เวลา 1V - 4V และสร้าง 5V เอาต์พุตจะถูกป้อนโดยตรงไปยังขา 5V ของ Arduino โดยผ่านตัวควบคุม

ในการทำให้บอร์ดทำงานโดยใช้แบตเตอรี่ได้นานขึ้นให้วาง MCU เพื่อพักระหว่างการอ่านเซ็นเซอร์ ห้องสมุดพลังงาน rocketscream ต่ำเป็นที่ดีสำหรับวัตถุประสงค์นี้ แต่มันมีประโยชน์จริง ๆ เมื่อใช้ตัวควบคุมที่มีประสิทธิภาพ / ตัวแปลง DC-DC เนื่องจากตัวควบคุม Arduino มาตรฐานใช้ 10mA เพียงแค่ด้วยตัวเอง!


1

คำตอบสำหรับคำถามมีวิธีอื่นอีกไหมในการวัดแรงดันเอาต์พุตของเซ็นเซอร์?

ADC ใช้แรงดันอ้างอิงสำหรับการแปลงจากอนาล็อกเป็นดิจิตอล ดังนั้นหากมีการเปลี่ยนแปลงของแรงดันอ้างอิงค่าที่แปลง (เช่นค่าดิจิตอล) จะเปลี่ยนไป ค่าดิจิตอลจะแตกต่างกันสำหรับอินพุตอะนาล็อกเดียวกันหากแรงดันไฟฟ้าอ้างอิงเปลี่ยนแปลง

ทางเลือกหนึ่งที่ง่ายคือการใช้แรงดันอ้างอิงภายในภายใน Arduino (เช่นคอนโทรลเลอร์ Atmega)

ดูลิงค์ด้านล่างซึ่งมีตัวอย่างโค้ดไว้ให้ใช้ภายใน ADC (ชื่อฟังก์ชั่น Arduino - analogReference (DEFAULT))

http://tronixstuff.com/2013/12/12/arduino-tutorials-chapter-22-aref-pin/

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


ฉันไม่แน่ใจว่า "Hacking Wifi finder" มีความเกี่ยวข้องอย่างไร - ฉันไม่พบสิ่งที่เกี่ยวข้องเลย เกี่ยวกับการอ้างอิง ADC ภายใน - ฉันเขียนถึงมัน มันไม่ทำงานแม้ว่า Arduino จะใช้พลังงานจาก USB และเมื่อบอร์ดใช้พลังงานจากแบตเตอรี่โทรศัพท์มือถือ (3.7 - 4.5V) มันยิ่งแย่ลงไปอีก
Usov

ขออภัยเป็นความผิดพลาดในการคัดลอก / วาง จะแก้ไขลิงก์ในไม่ช้า!
robomon

แก้ไขลิงก์ @Usov แล้ว!
robomon

1.1V ภายในสามารถลอยได้มากกว่า 10% ตามมาตรฐาน atmega328 ดูเหมือนว่านี่จะไม่ใช่ข้อมูลอ้างอิงที่น่าเชื่อถือมากเช่นกัน
Usov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.