תוכן עניינים:

אוטוסטט: תרמוסטט מרחוק: 8 שלבים (עם תמונות)
אוטוסטט: תרמוסטט מרחוק: 8 שלבים (עם תמונות)

וִידֵאוֹ: אוטוסטט: תרמוסטט מרחוק: 8 שלבים (עם תמונות)

וִידֵאוֹ: אוטוסטט: תרמוסטט מרחוק: 8 שלבים (עם תמונות)
וִידֵאוֹ: רכב מארה"ב. איך זה עובד מא' עד ת'. 2024, יולי
Anonim
אוטוסטט: תרמוסטט מרחוק
אוטוסטט: תרמוסטט מרחוק

השאלה שאתה בוודאי שואל היא "מדוע אתה מכין עוד תרמוסטט מרחוק?"

התשובה לשאלה זו היא, שהייתי חייב, והתרמוסטטים החכמים בשוק יקרים מדי.

אזהרה הוגנת, זהו מבנה "הוכחת קונספט" הדורש כמה יציאות נוספות לשליטה בפועל על התרמוסטט שלך, אך הליבה נמצאת במקומה וניתנת לשינוי בהתאם לנסיבות הספציפיות שלך. כמו כן, זו עדיין עבודה בתהליך, אז צפה לכמה עדכונים ושינויים (במיוחד בקוד Matlab)

כדי להתחיל אני רוצה להזהיר אותך, זה דורש שלוש תוכנות (אחת מהן די יקרה), לא מעט ספריות וחבילות תמיכה לתוכניות, ואתה צריך שכולם ידברו אחד עם השני. זה כאב ראש. עם האזהרה הזו מהדרך אפשר להתחיל עם החומרים.

חוּמרָה

  • ארדואינו ננו
  • arduino uno (או ננו אחר, פשוט השתמשתי באונו כיוון שהיה לי אחד כזה)
  • כבלי מגשר מגוונים, כמה זכר/זכר ושתי סטים של שלושה מגשרים/נקבות מחוברים
  • מקלט תדר רדיו (RF) 433MHz, השתמשתי ב- MX-05V
  • משדר RF 433MHz, השתמשתי ב- MX-FS-03V
  • מדחום וחיישן לחות דיוק גבוה DHT11 (זה שהשתמשתי בו מותקן על שבב שלושה שיניים כאשר הנגדים הנדרשים מותקנים כבר)
  • קרש לחם (אם אתה לא רוצה להלחים את הכל ביחד)
  • טלפון עם GPS (אייפון 8 במקרה זה, אך השתמשתי גם ב- Galaxy S8)
  • מיכל מודפס בתלת מימד (לא ממש הכרחי, כל מיכל יעבוד או בכלל לא)

תוֹכנָה

  • Matlab מ- MathWorks (יש לי את מהדורת 2018a, אבל השתמשתי גם במהדורות 2017a-b)
  • Matlab Mobile מותקן בטלפון שלך
  • חבילת תמיכה arduino עבור Matlab
  • חבילת חיישני אייפון למאטלב
  • arduino IDE
  • חבילות תמיכה וספריות של RadioHead של ה- arduino IDE
  • ספריית DHT11 עבור arduino IDE
  • python 3.7 (ודא שהספרייה הפיסרית או הספרייה הטורית מותקנות, כפי שהיא אמורה להיות עבור גירסה 3.4 ואילך)

שלב 1: חיבור הכל ביחד

לשים את הכל ביחד
לשים את הכל ביחד
לשים את הכל ביחד
לשים את הכל ביחד
לשים את הכל ביחד
לשים את הכל ביחד

קודם כל הייתי מציע לך לעשות כמה הדרכות ארדואינו העוסקות במשדרי RF רק כדי לוודא שהחלקים שלך עובדים והחיווט תקין. יש הרבה דוגמאות זמינות, עם הקוד כלול (לאלו מאיתנו בחוץ שלא יודעים כלום על C ו- C ++).

עקוב אחר תרשימי החיווט להלן כדי להרכיב את הארדואינו והחיישנים. דבר אחד שיש לזכור בעת חיבור הארדואינים הוא שיציאות הנתונים בהן השתמשתי אינן נדרשות אך מומלצות.

אם תחליט לשנות את יציאות הנתונים שבהן אתה משתמש, עליך רק להגדיר את הסיכות בקוד שלך. באופן אישי, אני חושב שקל יותר להישאר ביציאות ברירת המחדל שספריות הארדואינו מזהות.

ורק כדי להיות ברור, הננו והונו ניתנים להחלפה, אך השתמשתי בננו עבור צד המשדר של הפרויקט כדי להקטין את גודל צג הטמפרטורה.

הערה צדדית: המתקן הירוק שמחזיק את הננו הוא המיכל המודפס בתלת מימד.

שלב 2: מקלט

מַקְלֵט
מַקְלֵט

שלב 3: משדר

מַשׁדֵר
מַשׁדֵר

שלב 4: הקוד

לאחר סיום החיווט עליך להפעיל את כל התוכנות ולהתקין את הספריות (אם עדיין לא עשית זאת), אני רק מניח שיש לך, עליך להפעיל את Matlab ולהפעיל את חבילת התמיכה של iPhone. גם הטלפון שלך וגם Matlab צריכים להיות באותה רשת wifi בשלב זה.

בחלון הפקודה של Matlab כתוב:

מחבר מופעל

פעולה זו תנחה אותך להזין סיסמה בת חמש ספרות שתשתמש בה לחיבור ב- iPhone שלך. הקפד לזכור את הסיסמה. לאחר הזנת הסיסמה Matlab תציג מידע כלשהו, כולל כתובת ה- IP שלך. השתמש בזה בשלב הבא, המגיע מההוראות מתפריט העזרה "תחילת העבודה עם חיישנים" ב- Matlab Mobile.

  • בצע את השלבים הבאים כדי לשלוח נתוני חיישנים ל- MathWorks Cloud או למחשב:
  • אם אתה שולח נתוני חיישנים למחשב ואם הם עדיין לא מותקנים, הורד והתקן את חבילת התמיכה של MATLAB עבור חיישני Apple iOS ב- MATLAB.
  • חבר את MATLAB Mobile ל- MathWorks Cloud או למחשב באמצעות הגדרות.
  • צור אובייקט mobiledev ב- MATLAB (במחשב שלך), למשל: >> m = mobiledev
  • בחר אחד או יותר חיישנים והקש על התחל.

בצע את השלבים הבאים לרישום נתוני חיישנים באופן מקומי במכשיר שלך:

  • במסך החיישנים, בחר את החיישנים שמהם ברצונך לאסוף נתונים.
  • בחר יומן.
  • הקש על כפתור התחל.
  • לאחר שתסיים לאסוף נתונים, הקש על לחצן עצור.
  • בחלון המוקפץ, הזן את שם יומן החיישנים.
  • חזור על שלבים 1-5 במידת הצורך.

סעיף זה יופנה בחזרה בחלק 4, כך שאין צורך להתחיל לאסוף נתונים עדיין. פשוט שמור את הטלפון שלך נוח ומנייד Matlab מוכן.

עכשיו אתה צריך ליצור תיקייה איפשהו במחשב שלך כדי להכיל את קבצי הקוד של Matlab. יהיו לך ארבעה קבצים נפרדים, שניים עבור פונקציות הרקע (קבצי m) וקובץ קוד אחד של Matlab עבור ה- GUI (.mlapp),.

ראשית הוא חישוב המסה לאוויר בביתך (זה מאפשר ל- Matlab לדעת כמה זמן לוקח לחמם/לקרר את הבית שלך)

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

runCalc = 0; Tmp_start = T_ins; time_start = שעון; time_end = 0 while runCalc <= 1 if 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

והשני:

function [חותמות זמן, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, massa)

AutoStat = 1; i = 1; בעוד AutoStat == 1 time_start = שעון; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); חותמות זמן = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; פורמט longg; %נוסחת חיסרון לחישוב מרחק על בסיס קו הרוחב ו- %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m.latitude).*(sind ((מ '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; %מעריך את הזמן שלך להחזרת time_rtn = (Dist-r_pref)./ מהירות; %מחשב את ההגדרה הדרושה של התרמוסטט על סמך כיבוי החשמל של %המזגן ואוויר האוויר של הבית. calcTmp_set = ((-1.*P_out.*time_rtn)./ (מסה*(1.005))))+T_pref; %קובע אם יש צורך לשנות את הגדרת התרמוסטט הנוכחית אם עגול (calcTmp_set) ~ = עגול (t) timeACon = שעון; PwrCntr = P_out; timeACon = timeACon + clock-time_start; cost = P_out*timeACon*rate; אחרת PwrCntr = 0 חותמות זמן סיום (סוף+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 % מאפיינים התואמים למאפייני רכיבי אפליקציות (Access = public) 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. 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. Label DDFH matlab.ui.control. NumericEditField TemperatureDirectionSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettings Tab matlab.ui.container. Tab. Tab. ui.control. Spinner טמפרטורה 2SpinnerLabel 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. ServingsEdl. FuelLabel. ServingsEdl. F.

שיטות (גישה = פרטית)

הפונקציה ששינתה את הערך: tempnow

function tempnowValueChanged (יישום, אירוע) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 עבור i = length (temp) app. Gauge. Value = temp (i) הפסקה (1) סוף סוף

הפונקציה % ערך שונה: TemperatureDirectionSwitch

function TemperatureDirectionSwitchValueChanged (app, event) way = app. TemperatureDirectionSwitch. Value; דרך = uint8 (דרך) דרך = אורך (דרך) אם דרך == 4 Chng_dir = -1; אחר Chng_dir = 1; סיום Chng_dir; סוֹף

הפונקציה ששינתה את הערך: DDFH

פונקציה DDFHValueChanged (אפליקציה, אירוע) r_pref = app. DDFH. Value; סוֹף

הפונקציה % ערך שונה: AvgLocalSpeedEditField

function AvgLocalSpeedEditFieldValueChanged (app, event) speed = app. AvgLocalSpeedEditField. Value; סוֹף

הפונקציה % ערך שונה: PowerOutputRatingEditField

function PowerOutputRatingEditFieldValueChanged (app, event) value = app. PowerOutputRatingEditField. Value; סוֹף

הפונקציה ששינתה את הערך: EnergyEfficiencyRatingEditField

function EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; סוֹף

הפונקציה % Button push: RunDiagnosticButton

function RunDiagnosticButtonPushed (app, event) way = 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

function Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; סוֹף

% ערך הפונקציה השתנתה: Temperature2Spinner

function Temperature2SpinnerValueChanged (app, event) value = app. Temperature2Spinner. Value; סוֹף

הפונקציה ששינתה את הערך: מתג

function SwitchValueChanged (אפליקציה, אירוע) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; מהירות = מהירות מ '; מסה = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, מהירות, מסה) סוף סוף

% אתחול ובנייה של אפליקציות

שיטות (גישה = פרטית)

צור צור UIFigure ורכיבים

function createComponents (אפליקציה)

צור צור UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'איור ממשק משתמש';

% צור קבוצת Tab

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

צור צור Tab

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'התקנה';

% צור RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'מודגש'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'הפעל אבחון';

% צור EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'right'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'דירוג יעילות אנרגטית';

% צור EnergyEfficiencyRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'מספריים'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'מרכז'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% צור PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'right'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'דירוג תפוקת חשמל';

% צור PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'מספריים'); app. PowerOutputRatingEditField. Limits = [0 מידע]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'מרכז'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% צור AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'right'; 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 (app, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'מרכז'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% צור DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'right'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'מרחק רצוי'; 'מבית'};

צור צור DDFH

app. DDFH = uieditfield (app. SetupTab, 'מספריים'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (אפליקציה, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'מרכז'; app. DDFH. Position = [139 135 100 22];

% צור TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'מרכז'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'כיוון טמפרטורה';

% צור TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'המחוון'); app. TemperatureDirectionSwitch. Items = {'למעלה', 'למטה'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, true); 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 = 'מרכז'; 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 (app, @Temperature1SpinnerValueChanged, true); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Value = 60;

% צור Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'מרכז'; 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 (app, @Temperature2SpinnerValueChanged, true); 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 (app, @SwitchValueChanged, true); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';

צור צור EditFieldLabel

app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'נכון'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = '';

צור זמני

app.tempnow = uieditfield (app. TempSettingsTab, 'מספריים'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (app, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'מרכז'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% צור GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'מרכז'; 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;

צור כרטיסיית Savings

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'חיסכון';

צור צור 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];

% צור ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'מרכז'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'עלות החודש';

% צור ThisMonthCostEditField

app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'numeric'); app. ThisMonthCostEditField. Limits = [0 מידע]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'מרכז'; app. ThisMonthCostEditField. Position = [417 39 137 58];

% צור TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'right'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'סך החיסכון';

% צור TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'מספריים'); app. TotalSavingsEditField. Limits = [0 מידע]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'מרכז'; app. TotalSavingsEditField. Position = [88 39 137 58]; סוף סוף

שיטות (גישה = ציבורית)

בנה אפליקציה

יישום פונקציה = Control_1

% צור והגדר רכיבים

createComponents (אפליקציה)

רשום את האפליקציה אצל מעצב האפליקציות

registerApp (app, app. UIFigure)

אם nargout == 0

ברור סוף קצה האפליקציה

קוד % שמבוצע לפני מחיקת האפליקציה

מחיקת פונקציות (אפליקציה)

מחק את UIF איור כאשר האפליקציה נמחקת

מחק (app. UIFigure) סוף סוף סוף

סביר להניח שתקבל שגיאה, וזו לא בעיה. פשוט סגור את ה- GUI שנוצר לאחר לחיצה על הפעלה, נאסוף את שאר התוכניות והנתונים הדרושים.

מכיוון שמאטלאב הוקם אנו יכולים לעבור לפייתון. ראשית, הפעל את תוכנית python משורת הפקודה שלך (ב- Windows) או באמצעות קובץ.exe בתיקיית python שלך. ודא שכל הספריות המתאימות מותקנות באמצעות פקודת הייבוא.

ייבוא סדרתי

זמן יבוא יבוא csv

אלה שלוש הספריות שתצטרך להתחיל, אם כי בקרוב נכין ספרייה משלנו. אם הייתה שגיאה כלשהי בפקודות אלה, חזור לוודא שהספריות מותקנות ונמצאות בתיקיית Lib בתיקיית python. בשלב הבא ניצור את מה שכיניתי ספריית pythonlogger. שם זה אינו הכרחי, אתה יכול לקרוא לזה איך שאתה רוצה, זה רק השם של קובץ הפייתון (.py) שאתה יוצר.

פתח עורך טקסט, אני משתמש ב- Sublime3 אבל פנקס הרשימות עובד מצוין והזן את הקוד הזה.

def pythonprint ():

יבוא pythonlogger יבוא זמן יבוא סדרתי יבוא csv ser = serial. Serial ('COM8') # COM8 הוא היציאה הטורית של arduino, סביר להניח שזה יהיה שונה עבור כל משתמש, כלומר בדוק את היציאה הטורית שלך ב- arduino IDE ser.flushInput () בעוד נכון: נסה: ser_bytes = ser.readline () הדפס (ser_bytes) עם פתוח ("test_data.csv", "a") כ f: writer = csv.writer (f, delimiter = ",") # מגדיר את הנתונים ל- להזין כ- writer.writerow ([time.time (), ser_bytes]) מפריד נתונים לפריט test_data.csv למעט: print ("אירעה שגיאה") הפסקה

שמור את הטקסט כ- "הכנס את שם הספרייה שאתה רוצה".py בתיקיית Lib. שים לב גם כי קו def pythonprint () מגדיר את שם הפונקציה שאליה אתה מתכוון להתקשר, כך שתוכל לשנות זאת להגדרת "הכנס שם שאתה רוצה עבור הפונקציה שלך" (). כאשר הספרייה נשמרת נוכל לעבור לקוד הארדואינו.

פתח את arduino IDE ופתח שני חלונות סקיצה חדשים. שמור את שני קבצי הסקיצה במקום נוח, שם הקבצים לא משנה. לאחר מכן מחק את כל קוד ברירת המחדל והחלף אותו בפריטים הבאים.

עבור הארדואינו המקבל:

#לִכלוֹל

#include #include #include // לא נעשה בו שימוש אך יש צורך בהרכבת מנהל התקן RH_ASK; struct dataStruct {temp float; }הנתונים שלי; הגדרת void () {Serial.begin (9600); // איתור באגים רק אם (! Driver.init ()) Serial.println ("init נכשל"); } לולאת חלל () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // לא חוסם {int i; // הודעה עם התקנת ביקורת טובה שהתקבלה, זרוק אותה. //driver.printBuffer("Got: ", 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; struct dataStruct {float temp; }הנתונים שלי; בת tx_buf [sizeof (myData)] = {0}; // אז הארגומנטים הם קצב סיביות, סיכת שידור (tx), // קבלת סיכה (rx), סיכת ppt, isInverse. 2 האחרונים אינם בשימוש.הגדרת התקנה () {Serial.begin (9600); // איתור באגים רק אם (! Driver.init ()) Serial.println ("init נכשל"); } לולאת חלל () {int err; צף טמפ, הומי; uint8_t הודעה; אם ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); בייט zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // לעצור את הביצוע עד שכל הנתונים נשלחו עיכוב (2000); // המתן 2 שניות}}

פקודות הכלול אמורות להספיק, אך אם יהיו לך בעיות מאוחר יותר בהעברת הנתונים, ייתכן שתרצה להסתכל בתיקיית הספרייה של RadioHead ולכלול את שאר שמות הקבצים באותו פורמט.

שלב 5: לגרום לזה לעבוד

לגרום לזה לעבוד
לגרום לזה לעבוד
לגרום לזה לעבוד
לגרום לזה לעבוד
לגרום לזה לעבוד
לגרום לזה לעבוד

כעת, כאשר יש לנו את כל הקוד יחד והארדואינו מורכב, נוכל לחבר את הארדואינו למחשב שלך ולטעון את הקוד. הקפד לשלוח את הקוד הנכון לבקרי המיקרו המקבלים והמשדרים. אתה יכול לחבר את שני הארדואינים למחשב שלך בזמן שהוא פועל, אך תצטרך לוודא שהיציאה הנכונה נבחרה קדימה, או שתנתק את הארדואינו המשדר והפעל אותו ממקור אחר לאחר שהקוד מופעל הועלה.

אם כבר מדברים על זה, אתה צריך לבחור את היציאה המחוברת לארדואינו המקבל שלך מתפריט הכלים IDE עכשיו ולהפעיל פייתון.

אל תפתח את הצג הטורי בזמן שאתה עושה זאת, פייתון לא יכול לקרוא את הסידרה כשהמסך פתוח. לאחר שהפיתון פתוח, התקשר לפונקציית pythonprint כדלקמן.

pythonlogger.pythonprint ()

פעולה זו תתחיל את איסוף הנתונים מהיציאה הטורית של arduino. אם תפתח את תיקיית הפייתון שלך כעת, תראה שנוצר קובץ.csv חדש בשם "test_data.csv", המכיל את כל הזמן והטמפרטורה. זה יהיה הקובץ שאליו תיגש Matlab לביצוע כל החישובים והבקרות שלו.

אזהרה נוספת: אל תפתח test_data.csv בזמן הגישה או כתיבת הנתונים. אם תעשה זאת, פייתון ו/או קוד Matlab יקרוס וישלח בחזרה שגיאה

אם תחליט לפתוח את קובץ ה- csv מאוחר יותר, תבחין כי עמודת הזמן היא רק מחרוזת גדולה מאוד של מספרים. הסיבה לכך היא שהפקודה time.time () כותבת את מספר השניות מאז 1 בינואר 1970.

בשלב זה פיתון אמור להדפיס את נתוני הטמפרטורה שהוא קורא מהיציאה הטורית. זה אמור להיראות בערך כמו:

b'25.03 '/r/n

אל תדאג לגבי התווים הנוספים, אינדקס קוד Matlab עבור חמשת הערכים האמצעיים בעמודה השנייה של קובץ ה- CSV.

כעת, כאשר כל התוכנות התומכות פועלות ונתונים נאספים, אנו יכולים להתחיל לאסוף נתוני GPS מהתוכנית הניידת Matlab שהוגדרה קודם לכן ולהריץ את קוד GUI של Matlab. ברגע שאתה בכרטיסיית החיישנים של הנייד Matlab, בחר GPS ולחץ על כפתור ההתחלה.

אם אתה חדש ב- Matlab Mobile, חזור לשלב 4 והסתכל על צילומי המסך למעלה. אם אתה עדיין נתקל בבעיות, וודא שאתה מחובר למחשב שבחרת קודם לכן (בכרטיסיית ההגדרות) והשתמש בקישור מהפקודה "מחבר מופעל" כדי לבדוק ש- Matlab מחובר.

שלב 6: שימוש בתוכנית

שימוש בתוכנית
שימוש בתוכנית

יש הרבה דברים שקורים ברקע במערכת הזו. נתוני הטמפרטורה נאספים ונרשמים על ידי arduino ו- pyton, Matlab אוספת נתוני GPS מהטלפון ומריצה חישובים כדי לראות כמה אתה רחוק מהבית שלך ומגדיר את התרמוסטט שלך על סמך כל המידע הזה. המקום בו אתה נכנס הוא לספק את ההעדפות שלך.

הפעל את קוד GUI של Matlab. פתח את קובץ.mlapp והסתכל בכרטיסייה הראשונה. תצטרך לאסוף את המידע בעצמך בעצמך, בדרך כלל ניתן למצוא את היחידה עצמה את דירוג היעילות והספק של יחידת החימום/קירור שלך, והמהירות הממוצעת שלך היא רק הערכה טובה למהירות הנהיגה שלך. לאחר הזנת הערכים, לחץ על כפתור "הפעל אבחון" והתוכנית שולטת על התרמוסטט שלך כדי לאסוף מידע על הבית שלך.

עבור לתפריט הבא.

שלב 7: בקרת טמפרטורה

בקרת טמפרטורה
בקרת טמפרטורה

תפריט זה מאפשר לך לבחור את הטמפרטורה המועדפת עליך בזמן שאתה בבית ומחוצה לך. הגדר את הטמפרטורה מספר 1 לטמפרטורה הנוחה שלך, ואת הטמפרטורה מספר 2 לערך גבוה או נמוך אשר בטוח לביתך (הקפד לא להגדיר אותו ל -100 מעלות בזמן שיש לך כלבים בבית וכו ').

שלב 8: נתונים היסטוריים

נתונים היסטוריים
נתונים היסטוריים

לבסוף תוכל לצפות בכמה כסף אתה חוסך באמצעות השליטה האוטומטית. זה בעצם מעריך כמה אנרגיה תשמש אם התרמוסטט שלך היה מוגדר לטמפרטורה המועדפת עליך 24/7, ואז גורע מהאנרגיה שלך בפועל.

בהצלחה בבנייה.

מוּמלָץ: