สารบัญ:

เทอร์โมสตัทจาก Arduino: 6 ขั้นตอน
เทอร์โมสตัทจาก Arduino: 6 ขั้นตอน

วีดีโอ: เทอร์โมสตัทจาก Arduino: 6 ขั้นตอน

วีดีโอ: เทอร์โมสตัทจาก Arduino: 6 ขั้นตอน
วีดีโอ: (NTC replaces Thermostat)Temp control system of thermo pot w/ an Arduino ควบคุมอุณหภูมิกระติกน้ำร้อน 2024, กรกฎาคม
Anonim
ตัวควบคุมอุณหภูมิที่ใช้ Arduino
ตัวควบคุมอุณหภูมิที่ใช้ Arduino
ตัวควบคุมอุณหภูมิที่ใช้ Arduino
ตัวควบคุมอุณหภูมิที่ใช้ Arduino
ตัวควบคุมอุณหภูมิที่ใช้ Arduino
ตัวควบคุมอุณหภูมิที่ใช้ Arduino

คราวนี้เราจะสร้างเทอร์โมสตัทโดยใช้ Arduino เซ็นเซอร์อุณหภูมิและรีเลย์ คุณสามารถหาได้ใน github

ขั้นตอนที่ 1: การกำหนดค่า

การกำหนดค่า
การกำหนดค่า

การกำหนดค่าทั้งหมดถูกเก็บไว้ใน Config.h คุณสามารถเปลี่ยน PIN ที่ควบคุมรีเลย์ อุณหภูมิในการอ่าน เกณฑ์หรือเวลาได้

ขั้นตอนที่ 2: การกำหนดค่ารีเลย์

สมมติว่าเราต้องการมี 3 รีเลย์:

  • ID:0, PIN: 1, อุณหภูมิที่ตั้งไว้: 20
  • ID:1, PIN: 10, อุณหภูมิที่ตั้งไว้: 30
  • ID:2, PIN: 11, อุณหภูมิที่ตั้งไว้: 40

ก่อนอื่นคุณต้องตรวจสอบให้แน่ใจว่ายังไม่ได้ใช้ PIN ที่คุณเลือก พินทั้งหมดสามารถพบได้ใน Config.h ซึ่งถูกกำหนดโดยตัวแปรที่ขึ้นต้นด้วย DIG_PIN

คุณต้องแก้ไข Config.h และกำหนดค่า PIN เกณฑ์และจำนวนรีเลย์ เห็นได้ชัดว่ามีบางคุณสมบัติอยู่แล้ว ดังนั้นคุณต้องแก้ไข

const คงที่ uint8_t DIG_PIN_RELAY_0 = 1;const คงที่ uint8_t DIG_PIN_RELAY_1 = 10; const คงที่ uint8_t DIG_PIN_RELAY_2 = 11;

const คงที่ uint8_t RELAYS_AMOUNT = 3;

const คงที่ int16_t RELAY_TEMP_SET_POINT_0 = 20;

const คงที่ int16_t RELAY_TEMP_SET_POINT_1 = 30; const คงที่ int16_t RELAY_TEMP_SET_POINT_2 = 40;

ตอนนี้เราต้องตั้งค่ารีเลย์และคอนโทรลเลอร์ สิ่งนี้เกิดขึ้นใน RelayDriver.cpp

initRelayHysteresisController(0, DIG_PIN_RELAY_0, RELAY_TEMP_SET_POINT_0);initRelayHysteresisController(1, DIG_PIN_RELAY_1, RELAY_TEMP_SET_POINT_1); initRelayHysteresisController (2, DIG_PIN_RELAY_2, RELAY_TEMP_SET_POINT_2);

xxx

ขั้นตอนที่ 3: Hysteresis Controller

เป็นแบบที่เลือกในตัวอย่างข้างต้น มีการกำหนดค่าเพิ่มเติมเล็กน้อย:

const คงที่ uint32_t RELAY_DELAY_AFTER_SWITCH_MS = 300000; // 5 นาทีคงที่ uint32_t RHC_RELAY_MIN_SWITCH_MS = 360000;

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

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

ขั้นตอนที่ 4: ตัวควบคุม PID

ตัวควบคุม PID
ตัวควบคุม PID
ตัวควบคุม PID
ตัวควบคุม PID

นี่เป็นหัวข้อขั้นสูง การใช้ตัวควบคุมดังกล่าวเป็นเรื่องง่าย การค้นหาการตั้งค่าแอมพลิจูดที่เหมาะสมเป็นอีกเรื่องหนึ่ง

เพื่อที่จะใช้ตัวควบคุม PID คุณต้องเปลี่ยน initRelayHysteresisController(…..) เป็น initRelayPiDController(….) และคุณต้องค้นหาการตั้งค่าที่เหมาะสมสำหรับมัน ตามปกติคุณจะพบได้ใน Config.h

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

บนทั้งสองแปลงอุณหภูมิที่ต้องการตั้งไว้ที่ 30 (สีน้ำเงิน) อุณหภูมิปัจจุบันบ่งชี้บรรทัดการอ่าน รีเลย์มีสองสถานะเปิดและปิด เมื่อเปิดใช้งาน อุณหภูมิจะลดลง 1.5 เมื่อปิดใช้งาน อุณหภูมิจะเพิ่มขึ้น 0.5

ขั้นตอนที่ 5: ส่งข้อความถึง Bus

ข้อความบัส
ข้อความบัส
ข้อความบัส
ข้อความบัส
ข้อความบัส
ข้อความบัส
ข้อความบัส
ข้อความบัส

โมดูลซอฟต์แวร์ที่ต่างกันต้องสื่อสารกัน หวังว่าจะไม่ใช่ทั้งสองวิธี;)

ตัวอย่างเช่น:

  • โมดูลสถิติต้องรู้เมื่อรีเลย์เปิดและปิด
  • การกดปุ่มจะต้องเปลี่ยนเนื้อหาที่แสดง และยังต้องระงับบริการที่อาจใช้ CPU หลายรอบ เช่น การอ่านอุณหภูมิจากเซ็นเซอร์
  • หลังจากต้องอ่านอุณหภูมิใหม่เป็นระยะเวลาหนึ่ง
  • และอื่นๆ….

ทุกโมดูลเชื่อมต่อกับ Message Bus และสามารถลงทะเบียนสำหรับเหตุการณ์เฉพาะ และสามารถสร้างเหตุการณ์ใดๆ ได้ (แผนภาพแรก)

ในไดอะแกรมที่สอง เราจะเห็นการไหลของเหตุการณ์เมื่อกดปุ่ม

ส่วนประกอบบางอย่างมีงานบางอย่างที่จำเป็นต้องดำเนินการเป็นระยะ เราสามารถเรียกเมธอดที่เกี่ยวข้องจากลูปหลักได้ เนื่องจากเรามี Message Bus จึงจำเป็นต้องเผยแพร่เหตุการณ์ที่ถูกต้องเท่านั้น (แผนภาพที่สาม)

ขั้นตอนที่ 6: Libs

  • https://github.com/maciejmiklas/Thermostat
  • https://github.com/milesburton/Arduino-Temperature…
  • https://github.com/maciejmiklas/ArdLog.git

แนะนำ: