Mục lục:

Autostat: a Remote Thermostat: 8 bước (có hình ảnh)
Autostat: a Remote Thermostat: 8 bước (có hình ảnh)

Video: Autostat: a Remote Thermostat: 8 bước (có hình ảnh)

Video: Autostat: a Remote Thermostat: 8 bước (có hình ảnh)
Video: Programmable Thermostat 2024, Tháng bảy
Anonim
Autostat: một bộ điều nhiệt từ xa
Autostat: một bộ điều nhiệt từ xa

Câu hỏi mà bạn có thể đang đặt ra là "tại sao bạn lại chế tạo một bộ điều chỉnh nhiệt từ xa khác?"

Câu trả lời cho câu hỏi đó là, tôi buộc phải làm như vậy, và bộ điều nhiệt thông minh trên thị trường quá đắt.

Cảnh báo công bằng, đây là bản dựng "bằng chứng về khái niệm" sẽ yêu cầu một vài đầu ra bổ sung để thực sự điều khiển bộ điều nhiệt của bạn, nhưng phần lõi đã có sẵn và có thể được sửa đổi tùy thuộc vào trường hợp cụ thể của bạn. Ngoài ra, đây vẫn là một công việc đang được tiến hành, vì vậy hãy mong đợi một vài bản cập nhật và thay đổi (đặc biệt là đối với mã Matlab)

Để bắt đầu, tôi muốn cảnh báo bạn, điều này yêu cầu ba chương trình (một trong số chúng khá đắt), khá nhiều thư viện và gói hỗ trợ cho các chương trình và bạn cần phải có tất cả chúng nói chuyện với nhau. Thật là đau đầu. Với cảnh báo đó, chúng ta hãy bắt đầu với các tài liệu.

Phần cứng

  • arduino nano
  • arduino una (hoặc một nano khác, tôi chỉ sử dụng uni vì tôi có một cái nằm xung quanh)
  • dây nhảy các loại, một số dây nhảy nam / nam và hai bộ ba dây nhảy nam / nữ tham gia
  • Máy thu tần số vô tuyến (RF) 433MHz, tôi đã sử dụng MX-05V
  • Máy phát RF 433MHz, tôi đã sử dụng MX-FS-03V
  • Cảm biến độ ẩm và nhiệt kế có độ chính xác cao DHT11 (cái tôi đã sử dụng được lắp trên chip ba chấu với các điện trở cần thiết đã được lắp đặt sẵn)
  • breadboard (nếu bạn không muốn hàn tất cả những thứ này lại với nhau)
  • điện thoại có GPS (trong trường hợp này là iPhone 8, nhưng tôi cũng đã sử dụng Galaxy S8)
  • Hộp đựng được in 3D (không thực sự cần thiết, bất kỳ hộp đựng nào cũng sẽ hoạt động hoặc không có gì cả)

Phần mềm

  • Matlab từ MathWorks (Tôi có phiên bản 2018a, nhưng tôi cũng đã sử dụng phiên bản 2017a-b)
  • Matlab di động được cài đặt trên điện thoại của bạn
  • gói hỗ trợ arduino cho Matlab
  • Gói cảm biến iPhone cho Matlab
  • arduino IDE
  • Các gói hỗ trợ RadioHead và thư viện của arduino IDE
  • Thư viện DHT11 cho arduino IDE
  • python 3.7 (đảm bảo rằng thư viện pyserial hoặc thư viện nối tiếp được cài đặt, dành cho phiên bản 3.4 hoặc mới hơn)

Bước 1: Kết hợp tất cả lại với nhau

Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau

Trước hết, tôi sẽ đề nghị bạn thực hiện một vài hướng dẫn arduino xử lý các bộ phát RF chỉ để đảm bảo rằng các bộ phận của bạn đang hoạt động và hệ thống đấu dây chính xác. Có rất nhiều ví dụ có sẵn, với mã được bao gồm (đối với những người trong chúng ta không biết gì về C và C ++).

Làm theo các sơ đồ nối dây bên dưới để lắp ráp arduino và các cảm biến. Một điều cần lưu ý khi kết nối arduinos là các cổng dữ liệu tôi đã sử dụng không bắt buộc nhưng được khuyến nghị.

NẾU bạn quyết định thay đổi các cổng dữ liệu bạn sử dụng, bạn chỉ cần xác định các chân trong mã của mình. Cá nhân tôi nghĩ rằng việc gắn bó với các cổng mặc định mà các thư viện arduino nhận ra sẽ dễ dàng hơn.

Và chỉ để rõ ràng, nano và không có thể hoán đổi cho nhau, nhưng tôi đã sử dụng nano cho phía máy phát của dự án để giảm kích thước của màn hình nhiệt độ.

Lưu ý bên cạnh: khung màu xanh lá cây giữ nano là hộp đựng được in 3D.

Bước 2: Người nhận

Người nhận
Người nhận

Bước 3: Máy phát

Hệ thống điều khiển
Hệ thống điều khiển

Bước 4: Mã

Sau khi nối dây xong, bạn cần chạy tất cả các chương trình và cài đặt các thư viện (nếu bạn chưa cài đặt), tôi sẽ giả sử bạn có, bạn cần khởi động Matlab và chạy gói hỗ trợ iPhone. Tại thời điểm này, cả điện thoại và Matlab của bạn cần phải kết nối với cùng một mạng wifi.

Trong cửa sổ lệnh của Matlab viết:

kết nối trên

Thao tác này sẽ nhắc bạn nhập mật khẩu năm chữ số mà bạn sẽ sử dụng để kết nối trên iPhone của mình. Đảm bảo rằng bạn nhớ mật khẩu. Khi bạn nhập xong mật khẩu Matlab sẽ hiển thị một số thông tin, bao gồm cả địa chỉ IP của bạn. Sử dụng điều này trong bước tiếp theo, xuất phát từ hướng dẫn từ menu trợ giúp "Bắt đầu với cảm biến" trong Matlab mobile.

  • Làm theo các bước sau để gửi dữ liệu cảm biến tới MathWorks Cloud hoặc máy tính:
  • Nếu bạn đang gửi dữ liệu cảm biến đến máy tính và nếu dữ liệu đó chưa được cài đặt, hãy tải xuống và cài đặt Gói hỗ trợ MATLAB dành cho Bộ cảm biến Apple iOS trong MATLAB.
  • Kết nối MATLAB Mobile với MathWorks Cloud hoặc máy tính bằng Cài đặt.
  • Tạo đối tượng mobiledev trong MATLAB (trên máy tính của bạn), ví dụ: >> m = mobiledev
  • Chọn một hoặc nhiều cảm biến và nhấn Bắt đầu.

Làm theo các bước sau để ghi dữ liệu cảm biến cục bộ trên thiết bị của bạn:

  • Trên màn hình Cảm biến, chọn cảm biến mà bạn muốn thu thập dữ liệu.
  • Chọn Nhật ký.
  • Nhấn vào nút Bắt đầu.
  • Khi bạn thu thập xong dữ liệu, hãy nhấn vào nút Dừng.
  • Trong cửa sổ bật lên, nhập tên của nhật ký cảm biến.
  • Lặp lại các bước 1-5 nếu cần.

Phần này sẽ được đề cập lại trong Phần 4, vì vậy bạn chưa cần thực sự bắt đầu thu thập dữ liệu. Chỉ cần giữ điện thoại của bạn thuận tiện và Matlab di động đã sẵn sàng.

Bây giờ bạn cần tạo một thư mục ở đâu đó trong máy tính để chứa các tệp mã Matlab. Bạn sẽ có bốn tệp riêng biệt, hai tệp cho các chức năng nền (tệp.m) và một tệp mã Matlab cho GUI (.mlapp),.

Đầu tiên là tính toán khối lượng không khí trong nhà của bạn (điều này cho phép Matlab biết thời gian làm nóng / làm mát ngôi nhà của bạn)

function [Mass] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = đồng hồ; time_end = 0 trong khi runCalc <= 1 if T_ins == (Tmp_start + (7 * Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; else PwrCntr = P_out; runCalc = runCalc + 0,1 end end time_diag = time_end-time_start Mass = (P_out * time_diag) /7.035

Và cái thứ hai:

function [timestamps, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)

AutoStat = 1; i = 1; while AutoStat == 1 time_start = clock; m = mobiledev; t = csvread ('giá trị.csv', 0, 1); t = t (i); dấu thời gian = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i + 1; định dạng longg; Công thức% hasrsine để tính toán khoảng cách dựa trên vĩ độ và% longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)). ^ 2 + cosd (Lat_in). * cosd (m.latitude). * (sind ((m. Longitude-Lon_in)./ 2)). ^ 2; c_hav = 2. * atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371. * c_hav; Dist = d_hav. * 1000; % ước tính thời gian của bạn để trả về time_rtn = (Dist-r_pref)./ speed; % tính toán cài đặt bộ điều nhiệt cần thiết dựa trên việc mất điện của% máy điều hòa không khí và lưu lượng không khí của ngôi nhà. calcTmp_set = ((- 1. * P_out. * time_rtn)./ (khối lượng. * (1.005))) + T_pref; % xác định xem có cần thay đổi cài đặt bộ điều nhiệt hiện tại hay không nếu round (calcTmp_set) ~ = round (t) timeACon = clock; PwrCntr = P_out; timeACon = timeACon + clock-time_start; cost = P_out * timeACon * rate; else PwrCntr = 0 dấu thời gian kết thúc (end + 1, [1: 6]) = clock; pwr_usage (end + 1, 1) = PwrCntr; tạm dừng (5) kết thúc kết thúc

Cả hai tệp này đều là các hàm Matlab. Bạn sẽ không cần truy cập chúng trừ khi bạn có kế hoạch sửa đổi chúng cho các nhu cầu cụ thể, vì bạn sẽ gọi chúng từ GUI. Lưu cả hai tệp riêng biệt, tệp đầu tiên là CalcMass.m và tệp thứ hai là dist_cntrl.m, đó sẽ là các tên mà mã GUI sử dụng để gọi các hàm, vì vậy trừ khi bạn muốn chỉnh sửa phần còn lại của mã bên dưới, hãy gắn bó với quy ước đặt tên.

Trước khi nhập mã GUI, bạn cần mở trình thiết kế ứng dụng cho Matlab, bạn có thể mở trình thiết kế ứng dụng này bằng cách điều hướng trong thanh menu Matlab hoặc bằng phương pháp yêu thích của tôi là nhập lệnh sau vào cửa sổ lệnh Matlab:

appdesigner

Khi trình thiết kế ứng dụng mở, hãy mở một tệp ứng dụng mới (.mlapp) và xóa tất cả mã mặc định khỏi cửa sổ mã. Sau đó, thay thế tất cả bằng những thứ sau và nhấn nút chạy.

classdef Control_1 <matlab.apps. AppBase% Thuộc tính tương ứng với thuộc tính thành phần ứng dụng (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. nút EnergyEfficiencyRatingEditFieldLabel matlab.ui.control. Label EnergyEfficiencyRatingEditField matlab.ui.control. NumericEditField PowerOutputRatingEditFieldLabel matlab.ui.control. Label PowerOutputRatingEditField matlab.ui.control. NumericEditField AvgLocalSpeedEditFieldLabel matlab.ui.control. Label AvgLocalSpeedEditField matlab.ui.control. NumericEditField DesiredDistancefromHouseEditFieldLabel matlab.ui.control. ui.control. Spinner Temperature2SpinnerLabel matlab.ui.cont rol. Label Temperature2Spinner matlab.ui.control. Spinner Switch matlab.ui.control. Switch EditFieldLabel matlab.ui.control. Label tempnow matlab.ui.control. NumericEditField GaugeLabel matlab.ui.control. Label Gauge matlab.ui.control. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingselitField endcontrol.abeluield endcontrol endcontrol.

phương thức (Access = riêng tư)

% Giá trị đã thay đổi chức năng: tempnow

hàm tempnowValueChanged (ứng dụng, sự kiện) 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

% Giá trị đã thay đổi chức năng: Nhiệt độDirectionSwitch

function TemperatureDirectionSwitchValueChanged (app, event) way = app. Tempe HeatDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; end Chng_dir; kết thúc

% Giá trị đã thay đổi chức năng: DDFH

function DDFHValueChanged (app, event) r_pref = app. DDFH. Value; kết thúc

% Giá trị đã thay đổi chức năng: AvgLocalSpeedEditField

function AvgLocalSpeedEditFieldValueChanged (ứng dụng, sự kiện) speed = app. AvgLocalSpeedEditField. Value; kết thúc

% Giá trị đã thay đổi chức năng: PowerOutputRatingEditField

function PowerOutputRatingEditFieldValueChanged (app, event) value = app. PowerOutputRatingEditField. Value; kết thúc

% Giá trị đã thay đổi chức năng: EnergyEfficiencyRatingEditField

function EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; kết thúc

% Nút được đẩy chức năng: RunDiagnosticButton

function RunDiagnosticButtonPushing (app, event) way = app. TempeosystemDirectionSwitch. Value; way = uint8 (way) way = length (cách) nếu cách == 4 Chng_dir = -1; else Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

kết thúc

% Giá trị đã thay đổi chức năng: Nhiệt độ1Spinner

chức năng Nhiệt độ1SpinnerValueChanged (ứng dụng, sự kiện) giá trị = app. Tempe Heat1Spinner. Value; kết thúc

% Giá trị đã thay đổi chức năng: Nhiệt độ2Spinner

chức năng Nhiệt độ2SpinnerValueChanged (ứng dụng, sự kiện) giá trị = app. Tempentic2Spinner. Value; kết thúc

% Giá trị đã thay đổi chức năng: Chuyển đổi

function SwitchValueChanged (app, event) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Tempentic1Spinner. Value; tốc độ = m. Tốc độ; khối lượng = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, mass) end end

% Khởi tạo và xây dựng ứng dụng

phương thức (Access = riêng tư)

% Tạo UIFigure và các thành phần

function createComponents (ứng dụng)

% Tạo UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Hình giao diện người dùng';

% Tạo TabGroup

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

% Tạo SetupTab

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Thiết lập';

% Tạo RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushingFcn = createCallbackFcn (ứng dụng, @RunDiagnosticButtonPushing, true); app. RunDiagnosticButton. FontWeight = 'bold'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Chạy Chẩn đoán';

% Create EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'right'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Xếp hạng Hiệu quả Năng lượng';

% Create EnergyEfficiencyRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'số'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (ứng dụng, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'center'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% Tạo PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'right'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Đánh giá công suất đầu ra';

% Tạo PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'số'); app. PowerOutputRatingEditField. Limits = [0 Thông tin]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (ứng dụng, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'center'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% Tạo AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'right'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Trung bình Tốc độ địa phương ';

% Tạo AvgLocalSpeedEditField

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'số'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'center'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% Tạo Des mong muốnDistancefromHouseEditFieldLabel

app. DesnticDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesnticDistancefromHouseEditFieldLabel. HorizontalAlignment = 'right'; app. DesnticDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesnticDistancefromHouseEditFieldLabel. Text = {'Khoảng cách mong muốn'; 'from House'};

% Tạo DDFH

app. DDFH = uieditfield (app. SetupTab, 'số'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (ứng dụng, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'center'; app. DDFH. Position = [139 135 100 22];

% Tạo nhiệt độDirectionSwitchLabel

app. TempenticDirectionSwitchLabel = uilabel (app. SetupTab); app. Tempe HeatDirectionSwitchLabel. HorizontalAlignment = 'center'; app. TempenticDirectionSwitchLabel. Position = [410 343 124 22]; app. TempenticDirectionSwitchLabel. Text = 'Hướng nhiệt độ';

% Tạo nhiệt độ

app. Tempe HeatDirectionSwitch = uiswitch (app. SetupTab, 'slider'); app. Tempe HeatDirectionSwitch. Items = {'Lên', 'Xuống'}; app. Tempe HeatDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TempeosystemDirectionSwitchValueChanged, true); app. TempenticDirectionSwitch. Position = [449 380 45 20]; app. TempenticDirectionSwitch. Value = 'Lên';

% Tạo TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Nhiệt độ. Cài đặt ';

% Tạo nhiệt độ1SpinnerLabel

app. Tempentic1SpinnerLabel = uilabel (app. TempSettingsTab); app. Tempentic1SpinnerLabel. HorizontalAlignment = 'center'; app. Tempentic1SpinnerLabel. Position = [66 363 76 28]; app. Tempentic1SpinnerLabel. Text = {'Nhiệt độ'; '# 1'};

% Tạo Nhiệt độ1Spinner

app. Tempentic1Spinner = uispinner (app. TempSettingsTab); app. Tempentic1Spinner. Limits = [60 90]; app. Tempentic1Spinner. ValueChangedFcn = createCallbackFcn (ứng dụng, @ Nhiệt độ1SpinnerValueChanged, true); app. Tempentic1Spinner. Position = [157 346 100 68]; app. Tempentic1Spinner. Value = 60;

% Tạo Nhiệt độ2SpinnerLabel

app. Tempentic2SpinnerLabel = uilabel (app. TempSettingsTab); app. Tempentic2SpinnerLabel. HorizontalAlignment = 'center'; app. Tempentic2SpinnerLabel. Position = [66 248 76 28]; app. Tempentic2SpinnerLabel. Text = {'Nhiệt độ'; '# 2'};

% Tạo Nhiệt độ2Spinner

app. Tempentic2Spinner = uispinner (app. TempSettingsTab); app. Tempentic2Spinner. Limits = [60 90]; app. Tempentic2Spinner. ValueChangedFcn = createCallbackFcn (ứng dụng, @ Nhiệt độ2SpinnerValueChanged, true); app. Tempentic2Spinner. Position = [157 230 100 70]; app. Tempentic2Spinner. Value = 60;

% Tạo công tắc

app. Switch = uiswitch (app. TempSettingsTab, 'slider'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (app, @SwitchValueChanged, true); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';

% Tạo EditFieldLabel

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

% Tạo tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'số'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (app, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'center'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% Tạo GaugeLabel

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

% Tạo Gauge

app. Gauge = uigauge (app. TempSettingsTab, 'circle'); 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;

% Tạo SavingsTab

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Tiết kiệm';

% Tạo UIAxes

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Savings') xlabel (app. UIAxes, 'Month and Year') ylabel (app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0,606666666666667 0,606666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];

% Tạo ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'center'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Chi phí Tháng này';

% Tạo ThisMonthCostEditField

app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'số'); app. ThisMonthCostEditField. Limits = [0 Thông tin]; app. ThisMonthCostEditField. ValueDisplayFormat = '$% 7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'center'; app. ThisMonthCostEditField. Position = [417 39 137 58];

% Tạo TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'right'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Tổng tiết kiệm';

% Tạo TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'số'); app. TotalSavingsEditField. Limits = [0 Thông tin]; app. TotalSavingsEditField. ValueDisplayFormat = '$% 9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'center'; app. TotalSavingsEditField. Position = [88 39 137 58]; kết thúc cuối cùng

phương thức (Access = công khai)

% Xây dựng ứng dụng

ứng dụng chức năng = Control_1

% Tạo và cấu hình các thành phần

createComponents (ứng dụng)

% Đăng ký ứng dụng với App Designer

registerApp (app, app. UIFigure)

nếu nargout == 0

xóa kết thúc ứng dụng

% Mã thực thi trước khi xóa ứng dụng

chức năng xóa (ứng dụng)

% Xóa UIFigure khi ứng dụng bị xóa

xóa (app. UIFigure) end end end

Có thể bạn sẽ gặp lỗi, điều này không thành vấn đề. Chỉ cần đóng GUI được tạo sau khi bạn nhấn chạy, chúng tôi sẽ thu thập phần còn lại của các chương trình và dữ liệu cần thiết trong giây lát.

Vì Matlab được thiết lập, chúng ta có thể chuyển sang python. Trước tiên, hãy chạy chương trình python từ dấu nhắc lệnh của bạn (trên windows) hoặc bằng cách sử dụng tệp.exe trong thư mục python của bạn. Đảm bảo rằng tất cả các thư viện thích hợp đã được cài đặt bằng cách sử dụng lệnh nhập.

nhập nối tiếp

nhập thời gian nhập csv

Đây là ba thư viện bạn sẽ cần để bắt đầu, mặc dù chúng tôi sẽ sớm tạo thư viện của riêng mình. Nếu có một số lỗi xảy ra với các lệnh này, hãy quay lại và đảm bảo rằng các thư viện đã được cài đặt và nằm trong thư mục Lib trong thư mục python. Tiếp theo, chúng ta sẽ tạo thứ mà tôi gọi là thư viện pythonlogger. Tên này không cần thiết, bạn có thể gọi nó bất cứ thứ gì bạn muốn, nó chỉ là tên của tệp python (.py) mà bạn tạo.

Mở một trình soạn thảo văn bản, tôi sử dụng Sublime3 nhưng notepad hoạt động tốt, và nhập mã này.

def pythonprint ():

import pythonlogger import serial import time import csv ser = serial. Serial ('COM8') # COM8 là cổng nối tiếp của arduino, điều này có thể sẽ khác nhau đối với mỗi người dùng, tức là hãy kiểm tra cổng nối tiếp của bạn trong arduino IDE ser.flushInput () while Đúng: try: ser_bytes = ser.readline () print (ser_bytes) with open ("test_data.csv", "a") as f: writer = csv.writer (f, delimiter = ",") # đặt dữ liệu thành được nhập dưới dạng writer.writerow được phân tách bằng dấu phẩy ([time.time (), ser_bytes]) # ghi dữ liệu vào test_data.csv ngoại trừ: print ("Đã xảy ra lỗi") ngắt

Lưu văn bản dưới dạng "chèn tên thư viện bạn muốn".py trong thư mục Lib. Cũng lưu ý rằng dòng định nghĩa pythonprint () xác định tên của hàm bạn sẽ gọi, vì vậy bạn có thể thay đổi tên đó thành định nghĩa "chèn tên bạn muốn cho hàm của mình" (). Khi thư viện được lưu, chúng ta có thể chuyển sang mã arduino.

Mở arduino IDE và mở hai cửa sổ phác thảo mới. Lưu hai tệp phác thảo đó ở một nơi nào đó thuận tiện, tên của các tệp này không quan trọng. Sau đó xóa tất cả mã mặc định và thay thế bằng mã sau.

Đối với arduino nhận:

#bao gồm

#include #include #include // cái này không được sử dụng nhưng cần để biên dịch trình điều khiển RH_ASK; struct dataStruct {float temp; }dữ liệu của tôi; void setup () {Serial.begin (9600); // Chỉ sửa lỗi if (! Driver.init ()) Serial.println ("init fail"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Không chặn {int i; // Thông báo có tổng kiểm tra tốt đã nhận được, hãy kết xuất nó. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer…. dòng vv là mã kiểm tra. Không cần phải lo lắng về điều đó trừ khi bạn đang chẩn đoán và muốn tìm hiểu xem liệu bạn có thực sự nhận được dữ liệu hay không.

Đối với máy phát arduino

#bao gồm

#include #include #include // cái này không được sử dụng nhưng cần để biên dịch # include #include int pin = 4; DHT11 dht11 (pin); Trình điều khiển RH_ASK; struct dataStruct {float temp; }dữ liệu của tôi; byte tx_buf [sizeof (myData)] = {0}; // Vì vậy, các đối số là bitrate, truyền pin (tx), // nhận pin (rx), ppt pin, isInverse. 2 cuối cùng không được sử dụng.void setup () {Serial.begin (9600); // Chỉ sửa lỗi if (! Driver.init ()) Serial.println ("init fail"); } void loop () {int err; nổi tạm, humi; tin nhắn uint8_t; if ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); byte zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // tạm dừng thực thi cho đến khi tất cả dữ liệu được gửi đi chậm trễ (2000); // đợi 2 giây}}

Các lệnh bao gồm là đủ, nhưng nếu bạn gặp bất kỳ vấn đề nào sau này với việc truyền dữ liệu, bạn có thể muốn xem trong thư mục thư viện RadioHead và bao gồm phần còn lại của tên tệp, ở cùng một định dạng.

Bước 5: Làm cho nó hoạt động

Làm cho nó hoạt động
Làm cho nó hoạt động
Làm cho nó hoạt động
Làm cho nó hoạt động
Làm cho nó hoạt động
Làm cho nó hoạt động

Bây giờ chúng ta đã có tất cả mã cùng nhau và arduino đã được lắp ráp, chúng ta có thể kết nối arduino với máy tính của bạn và tải mã. Đảm bảo rằng bạn gửi mã chính xác đến bộ vi điều khiển nhận và truyền. Bạn có thể có cả hai arduino được kết nối với máy tính của mình trong khi điều này đang chạy nhưng bạn sẽ phải đảm bảo rằng bạn đã chọn đúng cổng khi di chuyển về phía trước hoặc bạn có thể ngắt kết nối arduino đang truyền và cấp nguồn cho nó từ một số nguồn khác sau khi mã được đã tải lên.

Nói về điều này, bạn nên chọn cổng được kết nối với arduino nhận của bạn từ menu công cụ IDE ngay bây giờ và chạy python.

Không mở màn hình nối tiếp trong khi bạn đang làm điều này, python không thể đọc nối tiếp trong khi màn hình đang mở. Khi python được mở, hãy gọi hàm pythonprint như sau.

pythonlogger.pythonprint ()

Thao tác này sẽ bắt đầu thu thập dữ liệu từ cổng nối tiếp arduino. Nếu bạn mở thư mục python của mình ngay bây giờ, bạn sẽ thấy rằng một tệp.csv mới đã được tạo có tên "test_data.csv", chứa tất cả thông tin về thời gian và nhiệt độ. Đây sẽ là tệp mà Matlab truy cập để thực hiện tất cả các tính toán và điều khiển của nó.

Một cảnh báo khác: không mở test_data.csv khi dữ liệu đang được truy cập hoặc ghi. Nếu bạn làm vậy, python và / hoặc mã Matlab sẽ bị lỗi và gửi lại lỗi

Nếu bạn quyết định mở.csv sau đó, bạn sẽ nhận thấy rằng cột thời gian chỉ là một chuỗi số rất lớn. Đó là vì lệnh time.time () ghi số giây kể từ ngày 1 tháng 1 năm 1970.

Tại thời điểm này, python sẽ in dữ liệu nhiệt độ mà nó đang đọc từ cổng nối tiếp. Nó sẽ trông giống như sau:

b'25.03 '/ r / n

Đừng lo lắng về các ký tự thừa, mã Matlab lập chỉ mục cho năm giá trị ở giữa trong cột thứ hai của tệp.csv.

Bây giờ tất cả các chương trình hỗ trợ đang hoạt động và dữ liệu đang được thu thập, chúng tôi có thể bắt đầu thu thập dữ liệu GPS từ chương trình di động Matlab đã được thiết lập trước đó và chạy mã Matlab GUI. Khi bạn đã ở trong tab cảm biến của Matlab mobile, hãy chọn GPS và nhấn nút bắt đầu.

Nếu bạn chưa quen với Matlab mobile, hãy quay lại bước 4 và xem ảnh chụp màn hình ở trên. Nếu bạn vẫn gặp sự cố, hãy đảm bảo rằng bạn đã kết nối với máy tính đã chọn trước đó (trong tab cài đặt) và sử dụng liên kết từ lệnh "connector on" để kiểm tra xem Matlab có trực tuyến hay không.

Bước 6: Sử dụng chương trình

Sử dụng chương trình
Sử dụng chương trình

Có nhiều thứ đang diễn ra ở chế độ nền trong hệ thống này. Dữ liệu nhiệt độ đang được thu thập và ghi lại bởi arduino và pyton, Matlab đang thu thập dữ liệu GPS từ điện thoại của bạn và chạy các tính toán để xem bạn ở bao xa so với ngôi nhà của mình và đặt bộ điều nhiệt dựa trên tất cả thông tin đó. Nơi bạn đến là cung cấp sở thích của bạn.

Chạy mã Matlab GUI. Mở tệp.mlapp và xem tab đầu tiên. Bạn sẽ cần phải tự mình thu thập thông tin cho việc này, đánh giá hiệu quả và công suất của thiết bị sưởi / làm mát của bạn thường có thể được tìm thấy trên chính thiết bị đó và tốc độ trung bình của bạn chỉ là một ước tính tốt về tốc độ bạn lái xe. Sau khi nhập các giá trị, hãy nhấn vào nút "Chạy chẩn đoán" và chương trình sẽ điều khiển bộ điều nhiệt của bạn để thu thập thông tin về ngôi nhà của bạn.

Chuyển sang menu tiếp theo.

Bước 7: Kiểm soát nhiệt độ

Kiểm soát nhiệt độ
Kiểm soát nhiệt độ

Menu này cho phép bạn chọn nhiệt độ ưa thích khi ở nhà và đi xa. Đặt Nhiệt độ # 1 thành nhiệt độ thoải mái của bạn và Nhiệt độ # 2 thành giá trị cao hoặc thấp để an toàn cho ngôi nhà của bạn (đảm bảo bạn không đặt ở 100 độ khi nuôi chó ở nhà, v.v.).

Bước 8: Dữ liệu lịch sử

Dữ liệu lịch sử
Dữ liệu lịch sử

Cuối cùng, bạn có thể xem mình tiết kiệm được bao nhiêu tiền bằng cách sử dụng điều khiển tự động. Về cơ bản, điều này ước tính lượng năng lượng sẽ được sử dụng nếu bộ điều nhiệt của bạn được đặt ở nhiệt độ ưa thích của bạn 24/7, sau đó trừ năng lượng thực tế của bạn đã sử dụng.

Chúc bạn xây dựng thành công.

Đề xuất: