สารบัญ:

Autostat: Remote Thermostat: 8 ขั้นตอน (พร้อมรูปภาพ)
Autostat: Remote Thermostat: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Autostat: Remote Thermostat: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Autostat: Remote Thermostat: 8 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Set Auto Restart on a Toshiba hard wired remote 2024, พฤศจิกายน
Anonim
Autostat: รีโมทเทอร์โมสตัท
Autostat: รีโมทเทอร์โมสตัท

คำถามที่คุณอาจถามคือ "ทำไมคุณถึงสร้างตัวควบคุมอุณหภูมิระยะไกลอีกตัวหนึ่ง"

คำตอบสำหรับคำถามนั้นคือ ฉันต้องทำ และเทอร์โมสแตทอัจฉริยะของตลาดก็แพงเกินไป

คำเตือนที่เป็นธรรม นี่คือการสร้าง "การพิสูจน์แนวคิด" ที่ต้องการเอาต์พุตเพิ่มเติมสองสามตัวเพื่อควบคุมเทอร์โมสตัทของคุณจริงๆ แต่แกนอยู่ในตำแหน่งและสามารถแก้ไขได้ขึ้นอยู่กับสถานการณ์เฉพาะของคุณ นอกจากนี้ ยังอยู่ในระหว่างดำเนินการ ดังนั้นคาดว่าจะมีการอัปเดตและการเปลี่ยนแปลงเล็กน้อย (โดยเฉพาะโค้ด Matlab)

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

ฮาร์ดแวร์

  • Arduino นาโน
  • arduino uno (หรือ nano ตัวอื่น ฉันเพิ่งใช้ uno เพราะมีอันหนึ่งวางอยู่รอบๆ)
  • สายจัมเปอร์แบบต่างๆ จัมเปอร์ชาย/ชายบางส่วน และชุดจัมเปอร์ชาย/หญิงจำนวนสองชุด
  • ตัวรับคลื่นความถี่วิทยุ (RF) 433MHz ฉันใช้ MX-05V
  • ตัวส่ง RF 433MHz ฉันใช้ MX-FS-03V
  • DHT11 เทอร์โมมิเตอร์และเซ็นเซอร์ความชื้นความแม่นยำสูง (อันที่ฉันใช้ติดตั้งบนชิปสามง่ามพร้อมตัวต้านทานที่จำเป็นติดตั้งไว้แล้ว)
  • เขียงหั่นขนม (ถ้าคุณไม่ต้องการที่จะประสานทั้งหมดนี้เข้าด้วยกัน)
  • โทรศัพท์ที่มี GPS (iPhone 8 ในกรณีนี้ แต่ฉันเคยใช้ Galaxy S8) ด้วย
  • คอนเทนเนอร์ที่พิมพ์ 3 มิติ (ไม่จำเป็นจริงๆ คอนเทนเนอร์ใดๆ จะใช้งานได้หรือไม่ใช้เลยก็ได้)

ซอฟต์แวร์

  • Matlab จาก MathWorks (ฉันมีรุ่น 2018a แต่ฉันเคยใช้รุ่น 2017a-b ด้วย)
  • Matlab มือถือที่ติดตั้งบนโทรศัพท์ของคุณ
  • แพ็คเกจรองรับ Arduino สำหรับ Matlab
  • แพ็คเกจเซ็นเซอร์ iPhone สำหรับ Matlab
  • Arduino IDE
  • RadioHead รองรับแพ็คเกจและไลบรารีของ arduino IDE
  • ไลบรารี DHT11 สำหรับ Arduino IDE
  • python 3.7 (ตรวจสอบให้แน่ใจว่าได้ติดตั้งไลบรารี pyserial หรือ serial library ซึ่งควรเป็นเวอร์ชัน 3.4 หรือใหม่กว่า)

ขั้นตอนที่ 1: นำทุกอย่างมารวมกัน

วางมันทั้งหมดเข้าด้วยกัน
วางมันทั้งหมดเข้าด้วยกัน
วางมันทั้งหมดเข้าด้วยกัน
วางมันทั้งหมดเข้าด้วยกัน
วางมันทั้งหมดเข้าด้วยกัน
วางมันทั้งหมดเข้าด้วยกัน

ก่อนอื่นฉันขอแนะนำให้คุณทำแบบฝึกหัด Arduino สองสามข้อเกี่ยวกับเครื่องส่งสัญญาณ RF เพื่อให้แน่ใจว่าชิ้นส่วนของคุณทำงานและเดินสายถูกต้อง มีตัวอย่างมากมายพร้อมทั้งโค้ด (สำหรับพวกเราที่ไม่ค่อยมีความรู้เกี่ยวกับ C และ C++)

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

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

เพื่อให้ชัดเจน นาโนและอูโน่ใช้แทนกันได้ แต่ฉันใช้นาโนสำหรับด้านเครื่องส่งสัญญาณของโครงการเพื่อลดขนาดของตัวตรวจสอบอุณหภูมิ

หมายเหตุด้านข้าง: อุปกรณ์สีเขียวที่ถือนาโนคือคอนเทนเนอร์ที่พิมพ์ 3 มิติ

ขั้นตอนที่ 2: ผู้รับ

ผู้รับ
ผู้รับ

ขั้นตอนที่ 3: เครื่องส่ง

เครื่องส่ง
เครื่องส่ง

ขั้นตอนที่ 4: รหัส

เมื่อการเดินสายเสร็จสิ้น คุณต้องเรียกใช้โปรแกรมทั้งหมดและติดตั้งไลบรารี่ (หากคุณยังไม่ได้ดำเนินการ) ฉันจะถือว่าคุณมี คุณต้องเริ่ม Matlab และเรียกใช้แพ็คเกจการสนับสนุน iPhone ทั้งโทรศัพท์และ Matlab ของคุณต้องอยู่ในเครือข่าย wifi เดียวกัน ณ จุดนี้

ในหน้าต่างคำสั่งของ Matlab เขียน:

ขั้วต่อบน

การดำเนินการนี้จะแจ้งให้คุณป้อนรหัสผ่านห้าหลักที่คุณจะใช้ในการเชื่อมต่อบน iPhone ของคุณ อย่าลืมจำรหัสผ่าน เมื่อคุณป้อนรหัสผ่าน Matlab จะแสดงข้อมูลบางอย่างรวมถึงที่อยู่ IP ของคุณ ใช้สิ่งนี้ในขั้นตอนต่อไป ซึ่งมาจากคำแนะนำจากเมนูช่วยเหลือ "การเริ่มต้นใช้งานเซ็นเซอร์" ใน Matlab mobile

  • ทำตามขั้นตอนเหล่านี้เพื่อส่งข้อมูลเซ็นเซอร์ไปยัง MathWorks Cloud หรือคอมพิวเตอร์:
  • หากคุณกำลังส่งข้อมูลเซ็นเซอร์ไปยังคอมพิวเตอร์และหากยังไม่ได้ติดตั้ง ให้ดาวน์โหลดและติดตั้ง MATLAB Support Package สำหรับ Apple iOS Sensors ใน MATLAB
  • เชื่อมต่อ MATLAB Mobile กับ MathWorks Cloud หรือคอมพิวเตอร์โดยใช้การตั้งค่า
  • สร้างวัตถุ mobiledev ใน MATLAB (บนคอมพิวเตอร์ของคุณ) เช่น >> m = mobiledev
  • เลือกเซ็นเซอร์อย่างน้อยหนึ่งตัวแล้วแตะเริ่ม

ทำตามขั้นตอนเหล่านี้เพื่อบันทึกข้อมูลเซ็นเซอร์ในอุปกรณ์ของคุณ:

  • บนหน้าจอเซนเซอร์ ให้เลือกเซนเซอร์ที่คุณต้องการรวบรวมข้อมูล
  • เลือก บันทึก
  • แตะปุ่มเริ่ม
  • เมื่อคุณรวบรวมข้อมูลเสร็จแล้ว ให้แตะปุ่ม หยุด
  • ในป๊อปอัป ให้ป้อนชื่อบันทึกเซ็นเซอร์
  • ทำซ้ำขั้นตอนที่ 1-5 หากจำเป็น

ส่วนนี้จะถูกอ้างอิงกลับไปในตอนที่ 4 ดังนั้นจึงไม่จำเป็นต้องเริ่มรวบรวมข้อมูลจริงๆ เพียงเตรียมโทรศัพท์ของคุณให้พร้อมและ Matlab บนมือถือให้พร้อม

ตอนนี้ คุณต้องสร้างโฟลเดอร์ในคอมพิวเตอร์ของคุณเพื่อเก็บไฟล์รหัส Matlab คุณจะมีไฟล์แยกกันสี่ไฟล์ สองไฟล์สำหรับฟังก์ชันพื้นหลัง (ไฟล์.m) และไฟล์โค้ด Matlab หนึ่งไฟล์สำหรับ GUI (.mlapp)

อย่างแรกคือการคำนวณมวลสำหรับอากาศในบ้านของคุณ (วิธีนี้ทำให้ Matlab รู้ว่าต้องใช้เวลานานแค่ไหนในการทำความร้อน/ความเย็นให้กับบ้านของคุณ)

ฟังก์ชัน [มวล]= CalcMass (T_ins, P_out, Chng_dir)

runCalc=0; Tmp_start=T_ins; time_start=นาฬิกา; time_end = 0 ในขณะที่ runCalc <= 1 ถ้า T_ins==(Tmp_start+(7*Chng_dir)) time_end=clock; PwrCntr = 0; runCalc=0; อื่น PwrCntr = P_out; runCalc=runCalc+0.1 สิ้นสุด time_diag= time_end-time_start Mass=(P_out*time_diag)/7.035

และอันที่สอง:

ฟังก์ชัน [ประทับเวลา, pwr_usage]= dist_cntrl (Lat_in, Lon_in, P_out, r_pref, ความเร็ว, T_pref, มวล)

สถิติอัตโนมัติ = 1; ผม = 1; ในขณะที่ AutoStat == 1 time_start=clock; m = mobiledev; t = csvread('values.csv', 0, 1); เสื้อ= เสื้อ(ผม); เวลาประทับ= [0, 0, 0, 0, 0, 0]; pwr_usage = 0; ผม = ผม+1; รูปแบบ longg; %haversine สูตรสำหรับคำนวณระยะทางตามละติจูดและ %ลองจิจูด a_hav=(sind((m. Lat_in)./2)).^2+cosd(Lat_in).*cosd(m.latitude).*(sind((ม.ลองจิจูด-Lon_in)./2)).^2; c_hav= 2.*atan2d(sqrt(a_hav), sqrt(1-a_hav)); d_hav= 6371.*c_hav; Dist=d_hav.*1000; % ประเมินเวลาของคุณเพื่อส่งคืน time_rtn=(Dist-r_pref)./speed; % คำนวณการตั้งค่าเทอร์โมสตัทที่จำเป็นโดยพิจารณาจากการจ่ายไฟออกของ %เครื่องปรับอากาศและมวลอากาศของบ้าน calcTmp_set=((-1.*P_out.*time_rtn)./(mass.*(1.005)))+T_pref; % กำหนดว่าจำเป็นต้องเปลี่ยนการตั้งค่าตัวควบคุมอุณหภูมิปัจจุบันหรือไม่ ถ้า round(calcTmp_set) ~= round(t) timeACon = clock; PwrCntr = P_out; timeACon= timeACon + นาฬิกา-time_start; ราคา=P_out*timeACon*อัตรา; อื่น PwrCntr = 0 สิ้นสุดการประทับเวลา (end+1, [1:6]) = นาฬิกา; pwr_usage(จบ+1, 1)= PwrCntr; หยุดชั่วคราว (5) สิ้นสุด สิ้นสุด

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

ก่อนที่คุณจะเข้าสู่โค้ด GUI คุณต้องเปิดตัวออกแบบแอปสำหรับ Matlab ซึ่งคุณสามารถเปิดได้โดยการนำทางในแถบเมนู Matlab หรือโดยวิธีการที่ฉันโปรดปรานซึ่งกำลังป้อนคำสั่งต่อไปนี้ในหน้าต่างคำสั่ง Matlab:

นักออกแบบแอป

เมื่อตัวออกแบบแอปเปิดขึ้น ให้เปิดไฟล์แอปใหม่ (.mlapp) และลบโค้ดเริ่มต้นทั้งหมดออกจากหน้าต่างโค้ด จากนั้นแทนที่ทั้งหมดด้วยสิ่งต่อไปนี้แล้วกดปุ่มเรียกใช้

classdef Control_1 < คุณสมบัติ matlab.apps. AppBase % ที่สอดคล้องกับคุณสมบัติของส่วนประกอบแอป (การเข้าถึง = สาธารณะ) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control ปุ่ม EnergyEfficiencyRatingEditFieldLabel matlab.ui.control. Label EnergyEfficiencyRatingEditField matlab.ui.control. NumericEdit Field PowerOutputRatingEditFieldLabel matlab.ui.control. Label PowerOutputRatingEditField matlab.ui.control. NumericEditField AvgLocalSpeedEdituiFieldLabel. Field matlab.ui.control. NumericEditField matlab.ui.control. Label DDFH matlab.ui.control. NumericEditField TemperatureDirectionSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlab.ui.container. Tab Temperature1SpinnerLabel matlab.ui.control. Label Temperature1 สปินเนอร์ matlab ui.control. Spinner Temperature2SpinnerLabel matlab.ui.cont rol. Label Temperature2Spinner matlab.ui.control. Spinner Switch matlab.ui.control.สวิตช์ EditFieldLabel matlab.ui.control. Label tempnow matlab.ui.control. NumericEditField GaugeLabel matlab.ui.control. Label Gauge matlab.ui.control แท็บประหยัดเกจ matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes เดือนนี้ค่าใช้จ่ายEditFieldLabel matlab.ui.control. Label ค่าใช้จ่ายเดือนนี้แก้ไขฟิลด์ matlab.ui.control. NumericEditField TotalSavingsEditFieldLabel matlab.ui.control. Label TotalSavingsEditriccontrolField mat

วิธีการ (การเข้าถึง = ส่วนตัว)

% ค่าการเปลี่ยนแปลงฟังก์ชัน: tempnow

ฟังก์ชั่น tempnowValueChanged (แอพ, เหตุการณ์) temp = app.tempnow. Value; temp=randi([60, 90], 1, 50) app. Gauge. Value = 0 for i = length(temp) app. Gauge. Value= temp(i) pause(1) end end

% ฟังก์ชันการเปลี่ยนแปลงค่า: TemperatureDirectionSwitch

ฟังก์ชั่น TemperatureDirectionSwitchValueChanged (แอพ, เหตุการณ์) วิธี = app. TemperatureDirectionSwitch. Value; ทาง= uint8(ทาง) ทาง = ความยาว(ทาง) ถ้าทาง == 4 Chng_dir = -1; อื่น Chng_dir = 1; จบ Chng_dir; จบ

% ค่าที่เปลี่ยนแปลงฟังก์ชัน: DDFH

ฟังก์ชัน DDFHValueChanged (แอป เหตุการณ์) r_pref = app. DDFH. Value; จบ

% ค่าที่เปลี่ยนแปลงฟังก์ชัน: AvgLocalSpeedEditField

ฟังก์ชัน AvgLocalSpeedEditFieldValueChanged (แอป เหตุการณ์) ความเร็ว = app. AvgLocalSpeedEditField. Value; จบ

ฟังก์ชันการเปลี่ยนแปลงค่า %: PowerOutputRatingEditField

ฟังก์ชัน PowerOutputRatingEditFieldValueChanged (แอป เหตุการณ์) ค่า = app. PowerOutputRatingEditField. Value; จบ

% ค่าการเปลี่ยนแปลงฟังก์ชัน: EnergyEfficiencyRatingEditField

ฟังก์ชั่น EnergyEfficiencyRatingEditFieldValueChanged (แอพ, เหตุการณ์) ค่า = app. EnergyEfficiencyRatingEditField. Value; จบ

ฟังก์ชันการกดปุ่ม %: RunDiagnosticButton

ฟังก์ชั่น RunDiagnosticButtonPushed (แอพ, เหตุการณ์) วิธี = app. TemperatureDirectionSwitch. Value; ทาง= uint8(ทาง) ทาง = ความยาว(ทาง) ถ้าทาง == 4 Chng_dir = -1; อื่น Chng_dir = 1; สิ้นสุด T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

จบ

% ฟังก์ชันเปลี่ยนค่า: Temperature1Spinner

ฟังก์ชั่น Temperature1SpinnerValueChanged (แอพ, เหตุการณ์) ค่า = app. Temperature1Spinner. Value; จบ

% ฟังก์ชันเปลี่ยนค่า: Temperature2Spinner

ฟังก์ชั่น Temperature2SpinnerValueChanged (แอพ, เหตุการณ์) ค่า = app. Temperature2Spinner. Value; จบ

% ค่าการเปลี่ยนแปลงฟังก์ชัน: Switch

ฟังก์ชัน SwitchValueChanged (แอป เหตุการณ์) m = mobiledev; Lat_in = ม.ละติจูด Lon_in = ม.ลองจิจูด P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; ความเร็ว = ม.ความเร็ว; มวล = 200; ความเร็ว = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, ความเร็ว, มวล) สิ้นสุด

% การเริ่มต้นและการสร้างแอป

วิธีการ (การเข้าถึง = ส่วนตัว)

% สร้าง UIFigure และส่วนประกอบ

ฟังก์ชั่น createComponents (แอพ)

% สร้าง UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'รูป UI';

% สร้าง TabGroup

app. TabGroup = uitabgroup (app. UIFigure); app. TabGroup. Position = [1 1 640 480];

% สร้าง SetupTab

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'ตั้งค่า';

% สร้าง RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'ดัน'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (แอพ, @RunDiagnosticButtonPushed, จริง); app. RunDiagnosticButton. FontWeight = 'ตัวหนา'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'เรียกใช้การวินิจฉัย';

% สร้าง EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'ขวา'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'การจัดอันดับประสิทธิภาพพลังงาน';

% สร้าง EnergyEfficiencyRatingEditField

app. ErgyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'ตัวเลข'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (แอพ, @EnergyEfficiencyRatingEditFieldValueChanged จริง); แอป. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'center'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% สร้าง PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel(app. SetupTab); แอป. app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'ขวา'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'อัตรากำลังไฟฟ้าขาออก';

% สร้าง PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'ตัวเลข'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (แอพ, @PowerOutputRatingEditFieldValueChanged, จริง); app. PowerOutputRatingEditField. HorizontalAlignment = 'ศูนย์'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% สร้าง AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel(app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'ขวา'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'เฉลี่ย ความเร็วท้องถิ่น';

% สร้าง AvgLocalSpeedEditField

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'ตัวเลข'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (แอพ, @AvgLocalSpeedEditFieldValueChanged จริง); app. AvgLocalSpeedEditField. HorizontalAlignment = 'center'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% สร้างระยะทางที่ต้องการจากHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'ขวา'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'ระยะทางที่ต้องการ '; 'จากบ้าน'};

% สร้าง DDFH

app. DDFH = uieditfield (app. SetupTab, 'ตัวเลข'); app. DDFH.จำกัด = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (แอพ @DDFHValueChanged จริง); app. DDFH. HorizontalAlignment = 'center'; app. DDFH.ตำแหน่ง = [139 135 100 22];

% สร้าง TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel(app. SetupTab); แอพ. TemperatureDirectionSwitchLabel app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'center'; แอป. อุณหภูมิDirectionSwitchLabel. HorizontalAlignment = 'center'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'อุณหภูมิทิศทาง';

% สร้าง TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'ตัวเลื่อน'); app. TemperatureDirectionSwitch. Items = {'ขึ้น', 'ลง'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (แอพ, @TemperatureDirectionSwitchValueChanged, จริง); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'ขึ้น';

% สร้าง TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'อุณหภูมิ การตั้งค่า';

% สร้าง Temperature1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'อุณหภูมิ '; '#1'};

% สร้าง Temperature1Spinner

app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (แอพ, @Temperature1SpinnerValueChanged จริง); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Value = 60;

% สร้าง Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'อุณหภูมิ'; '# 2'};

% สร้าง Temperature2Spinner

app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (แอพ, @Temperature2SpinnerValueChanged จริง); app. Temperature2Spinner. Position = [157 230 100 70]; app. Temperature2Spinner. Value = 60;

% สร้างสวิตช์

app. Switch = uiswitch (app. TempSettingsTab, 'ตัวเลื่อน'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn(แอพ, @SwitchValueChanged, จริง); app. Switch. FontName = 'Nyala'; แอพ Switch. FontSize = 28; แอป. Switch. Position = [522 21 74 32]; แอป. Switch. Value = '0';

% สร้าง EditFieldLabel

app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'ขวา'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = '';

% สร้าง tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'ตัวเลข'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (แอพ @tempnowValueChanged จริง); app.tempnow. HorizontalAlignment = 'center'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% สร้าง GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'center'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'วัด';

% สร้างเกจ

app. Gauge = uigauge (app. TempSettingsTab, 'วงกลม'); app. Gauge. Limits = [60 90]; app. Gauge. MajorTicks = [60 65 70 75 80 85 90]; app. Gauge. Position = [185 69 120 120]; app. Gauge. Value = 60;

% สร้างแท็บออมทรัพย์

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'ออมทรัพย์';

% สร้าง UIAxes

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'ออมทรัพย์') xlabel (app. UIAxes, 'เดือนและปี') ylabel (app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0.60666666666666667 0.606666666666667]; app. UIAxes. Color = [0.9412 0.9412 0.9412]; app. UIAxes. Position = [146 219 348 237];

% สร้างเดือนนี้CostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel(app. SavingsTab); แอป แอปเดือนนี้CostEditFieldLabel. HorizontalAlignment = 'center'; แอปเดือนนี้CostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'ค่าใช้จ่ายเดือนนี้';

% สร้างเดือนนี้CostEditField

app. ThisMonthCostEditField = uieditfield(app. SavingsTab, 'ตัวเลข'); app. ThisMonthCostEditField. Limits = [0 Inf]; แอปเดือนนี้CostEditField. Limits app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'center'; แอปเดือนนี้CostEditField. HorizontalAlignment = 'center'; แอปเดือนนี้CostEditField. Position = [417 39 137 58];

% สร้าง TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel(app. SavingsTab); แอป. app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'ขวา'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'เงินออมทั้งหมด';

% สร้าง TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'ตัวเลข'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'ศูนย์'; app. TotalSavingsEditField. Position = [88 39 137 58]; ปลาย ปลาย

วิธีการ (การเข้าถึง = สาธารณะ)

% สร้างแอป

แอปฟังก์ชัน = Control_1

% สร้างและกำหนดค่าส่วนประกอบ

createComponents (แอพ)

% ลงทะเบียนแอพด้วย App Designer

registerApp(แอพ, app. UIFigure)

ถ้า nargout == 0

ล้างจบสิ้นสิ้น

% รหัสที่รันก่อนการลบแอพ

ฟังก์ชั่นลบ (แอพ)

% ลบ UIFigure เมื่อแอพถูกลบ

ลบ (app. UIFigure) สิ้นสุด สิ้นสุด สิ้นสุด

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

เนื่องจาก Matlab ถูกตั้งค่า เราจึงสามารถย้ายไปที่ python ได้ ขั้นแรก ให้รันโปรแกรม python จากพรอมต์คำสั่งของคุณ (บน windows) หรือโดยใช้ไฟล์.exe ในโฟลเดอร์ python ของคุณ ตรวจสอบให้แน่ใจว่าได้ติดตั้งไลบรารีที่เหมาะสมทั้งหมดโดยใช้คำสั่งนำเข้า

นำเข้าซีเรียล

เวลานำเข้า นำเข้า csv

นี่คือห้องสมุดสามแห่งที่คุณต้องเริ่มต้น แม้ว่าเราจะสร้างห้องสมุดของเราเองในไม่ช้า หากมีข้อผิดพลาดบางอย่างกับคำสั่งเหล่านี้ ให้กลับไปและตรวจสอบให้แน่ใจว่าได้ติดตั้งไลบรารี่แล้วและอยู่ในโฟลเดอร์ Lib ในโฟลเดอร์ python ต่อไป เราจะสร้างสิ่งที่ฉันเรียกว่าไลบรารี pythonlogger ชื่อนี้ไม่จำเป็น คุณสามารถเรียกมันอะไรก็ได้ที่คุณต้องการ มันเป็นเพียงชื่อของไฟล์ python (.py) ที่คุณสร้างขึ้น

เปิดโปรแกรมแก้ไขข้อความ ฉันใช้ Sublime3 แต่แผ่นจดบันทึกทำงานได้ดี และป้อนรหัสนี้

def หลามพิมพ์ ():

นำเข้า pythonlogger นำเข้าเวลานำเข้าแบบอนุกรม นำเข้า csv ser = serial. Serial('COM8') # COM8 เป็นพอร์ตอนุกรมของ Arduino ซึ่งมีแนวโน้มว่าจะแตกต่างกันสำหรับผู้ใช้แต่ละคน เช่น ตรวจสอบพอร์ตอนุกรมของคุณใน arduino IDE ser.flushInput() ในขณะที่ จริง: ลอง: ser_bytes = ser.readline() print(ser_bytes) ด้วย open("test_data.csv", "a") เป็น f: writer = csv.writer(f, delimiter=", ") # ตั้งค่าข้อมูลเป็น ถูกป้อนเป็น writer.writerow([time.time(), ser_bytes]) ที่คั่นด้วยเครื่องหมายจุลภาค) #writes ข้อมูลไปยัง test_data.csv ยกเว้น: ตัวแบ่งการพิมพ์ ("ข้อผิดพลาดเกิดขึ้น")

บันทึกข้อความเป็น "insert the name of the library you want".py ในโฟลเดอร์ Lib นอกจากนี้ โปรดทราบว่าบรรทัด def pythonprint() กำหนดชื่อของฟังก์ชันที่คุณจะเรียกใช้ ดังนั้นคุณสามารถเปลี่ยนเป็น def "insert name you want for your function"() เมื่อบันทึกไลบรารีแล้วเราสามารถไปยังรหัส Arduino ได้

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

สำหรับ Arduino ที่ได้รับ:

#รวม

#include #include #include // ไม่ได้ใช้แต่จำเป็นต้องคอมไพล์ไดรเวอร์ RH_ASK โครงสร้าง dataStruct { อุณหภูมิลอยตัว; }ข้อมูลของฉัน; การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); // การดีบักก็ต่อเมื่อ (!driver.init()) Serial.println("init ล้มเหลว"); } วงเป็นโมฆะ () { uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = ขนาด (buf); if (driver.recv (buf, &buflen)) // ไม่ปิดกั้น { int i; // ข้อความที่ได้รับเช็คซัมดี ดัมพ์ทิ้ง //driver.printBuffer("ได้:", buf, buflen); memcpy(&myData, buf, sizeof(myData)); Serial.println(""); Serial.print (myData.temp); } }

ป.ล. ที่ //driver.printBuffer…. ฯลฯ บรรทัดคือรหัสทดสอบ ไม่ต้องกังวลไปเว้นแต่คุณจะทำการวินิจฉัยและต้องการทราบว่าคุณได้รับข้อมูลจริงหรือไม่

สำหรับเครื่องส่ง Arduino

#รวม

#include #include #include // ไม่ได้ใช้แต่จำเป็นต้องคอมไพล์#include #include int pin=4; DHT11 dht11 (พิน); ไดรเวอร์ RH_ASK; โครงสร้าง dataStruct { อุณหภูมิลอยตัว; }ข้อมูลของฉัน; ไบต์ tx_buf[sizeof(myData)] = {0}; //ดังนั้นอาร์กิวเมนต์คือบิตเรต, พินส่ง (tx), //รับพิน (rx), ppt pin, isInverse ไม่ใช้ 2 รายการสุดท้าย void setup() { Serial.begin(9600); // การดีบักก็ต่อเมื่อ (!driver.init()) Serial.println("init ล้มเหลว"); } วงเป็นโมฆะ () { int ผิดพลาด; อุณหภูมิลอย humi; uint8_t ผงชูรส; if((err=dht11.read(humi, temp))==0) myData.temp = temp; memcpy(tx_buf, &myData, sizeof(myData)); ไบต์ zize=sizeof(myData); { Serial.println (myData.temp); ไดรเวอร์.send((uint8_t *)tx_buf, zize); ไดรเวอร์. waitPacketSent(); //หยุดการทำงานจนกว่าข้อมูลทั้งหมดจะถูกส่งล่าช้า (2000); //รอ 2 วินาที } }

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

ขั้นตอนที่ 5: ทำให้มันใช้งานได้

ทำให้มันทำงาน
ทำให้มันทำงาน
ทำให้มันทำงาน
ทำให้มันทำงาน
ทำให้มันทำงาน
ทำให้มันทำงาน

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

เมื่อพูดถึงเรื่องนี้คุณควรเลือกพอร์ตที่เชื่อมต่อกับ Arduino ที่ได้รับจากเมนูเครื่องมือ IDE ทันทีและเรียกใช้ python

อย่าเปิดซีเรียลมอนิเตอร์ในขณะที่คุณทำเช่นนี้ python ไม่สามารถอ่านซีเรียลในขณะที่มอนิเตอร์เปิดอยู่ เมื่อเปิด python แล้ว ให้เรียกใช้ฟังก์ชัน pythonprint ดังนี้

pythonlogger.pythonprint()

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

คำเตือนอื่น: อย่าเปิด test_data.csv ในขณะที่มีการเข้าถึงหรือเขียนข้อมูล หากคุณทำเช่นนั้น python และ/หรือโค้ด Matlab จะขัดข้องและส่งข้อผิดพลาดกลับมา

หากคุณตัดสินใจที่จะเปิด.csv ในภายหลัง คุณจะสังเกตเห็นว่าคอลัมน์เวลาเป็นเพียงตัวเลขจำนวนมากเท่านั้น นั่นเป็นเพราะคำสั่ง time.time() เขียนจำนวนวินาทีตั้งแต่วันที่ 1 มกราคม 1970

ณ จุดนี้ python ควรพิมพ์ข้อมูลอุณหภูมิที่อ่านจากพอร์ตอนุกรม ควรมีลักษณะดังนี้:

ข'25.03'/r/n

ไม่ต้องกังวลกับอักขระพิเศษ โค้ด Matlab จะทำดัชนีสำหรับค่ากลางห้าค่าในคอลัมน์ที่สองของไฟล์.csv

ขณะนี้โปรแกรมสนับสนุนทั้งหมดกำลังทำงานและกำลังรวบรวมข้อมูล เราสามารถเริ่มรวบรวมข้อมูล GPS จากโปรแกรมมือถือ Matlab ที่ตั้งค่าไว้ก่อนหน้านี้และเรียกใช้รหัส Matlab GUI เมื่อคุณอยู่ในแท็บเซ็นเซอร์ของ Matlab mobile แล้ว ให้เลือก GPS แล้วกดปุ่มเริ่มต้น

หากคุณยังใหม่กับ Matlab mobile ให้ย้อนกลับไปที่ขั้นตอนที่ 4 และดูภาพหน้าจอด้านบน หากคุณยังคงประสบปัญหา ตรวจสอบให้แน่ใจว่าคุณได้เชื่อมต่อกับคอมพิวเตอร์ที่คุณเลือกไว้ก่อนหน้านี้ (ในแท็บการตั้งค่า) และใช้ลิงก์จากคำสั่ง "connector on" เพื่อตรวจสอบว่า Matlab ออนไลน์อยู่

ขั้นตอนที่ 6: การใช้โปรแกรม

การใช้โปรแกรม
การใช้โปรแกรม

มีหลายสิ่งที่เกิดขึ้นในเบื้องหลังในระบบนี้ ข้อมูลอุณหภูมิกำลังรวบรวมและบันทึกโดย Arduino และ pyton Matlab กำลังรวบรวมข้อมูล GPS จากโทรศัพท์ของคุณและทำการคำนวณเพื่อดูว่าคุณอยู่ห่างจากบ้านมากแค่ไหน และตั้งค่าตัวควบคุมอุณหภูมิตามข้อมูลทั้งหมดนั้น ที่ที่คุณเข้ามาคือการจัดเตรียมการตั้งค่าของคุณ

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

ไปที่เมนูถัดไป

ขั้นตอนที่ 7: การควบคุมอุณหภูมิ

การควบคุมอุณหภูมิ
การควบคุมอุณหภูมิ

เมนูนี้ให้คุณเลือกอุณหภูมิที่ต้องการได้ในขณะที่คุณอยู่ที่บ้านและนอกบ้าน ตั้งค่าอุณหภูมิ #1 เป็นอุณหภูมิที่คุณสบาย และอุณหภูมิ #2 เป็นค่าสูงหรือต่ำที่ปลอดภัยสำหรับบ้านของคุณ (ตรวจสอบให้แน่ใจว่าคุณไม่ได้ตั้งไว้ที่ 100 องศาในขณะที่คุณมีสุนัขอยู่ที่บ้าน ฯลฯ)

ขั้นตอนที่ 8: ข้อมูลย้อนหลัง

ข้อมูลทางประวัติศาสตร์
ข้อมูลทางประวัติศาสตร์

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

ขอให้โชคดีในการสร้าง

แนะนำ: