فهرست مطالب:

Autostat: یک ترموستات از راه دور: 8 مرحله (همراه با تصاویر)
Autostat: یک ترموستات از راه دور: 8 مرحله (همراه با تصاویر)

تصویری: Autostat: یک ترموستات از راه دور: 8 مرحله (همراه با تصاویر)

تصویری: Autostat: یک ترموستات از راه دور: 8 مرحله (همراه با تصاویر)
تصویری: آموزش اینترنت اشیا و امبدد گنو - لینوکس 2024, جولای
Anonim
Autostat: یک ترموستات از راه دور
Autostat: یک ترموستات از راه دور

سوالی که احتمالاً می پرسید این است که "چرا ترموستات از راه دور دیگری می سازید؟"

پاسخ به این س isال این است که من مجبور بودم و ترموستات های هوشمند بازار بسیار گران هستند.

هشدار عادلانه ، این "اثبات مفهوم" است که برای کنترل ترموستات شما به چند خروجی اضافی نیاز دارد ، اما هسته اصلی در جای خود قرار دارد و بسته به شرایط خاص شما قابل تغییر است. همچنین ، این هنوز در حال انجام است ، بنابراین منتظر چند به روز رسانی و تغییر (به ویژه در کد Matlab) باشید.

برای شروع می خواهم به شما هشدار دهم ، این امر به سه برنامه نیاز دارد (یکی از آنها بسیار گران است) ، تعداد زیادی کتابخانه و بسته های پشتیبانی از برنامه ها ، و شما باید از همه آنها بخواهید که با یکدیگر صحبت کنند. سردرد داره با توجه به این هشدار ، اجازه دهید با مواد شروع کنیم.

سخت افزار

  • آردوینو نانو
  • arduino uno (یا نانو دیگری ، من فقط از uno استفاده کردم زیرا یکی از آنها را در اطراف داشتم)
  • انواع کابل های بلوز ، برخی از نرها/نرها و دو مجموعه از سه پرش کننده مرد/زن به هم متصل شده اند
  • گیرنده فرکانس رادیویی 433 مگاهرتز (RF) ، من از MX-05V استفاده کردم
  • فرستنده RF 433 مگاهرتز ، من از MX-FS-03V استفاده کردم
  • سنسور دماسنج و رطوبت با دقت بالا DHT11 (آنچه من استفاده کردم روی یک تراشه سه شاخه نصب شده است و مقاومت های مورد نیاز از قبل نصب شده است)
  • تخته نان (اگر نمی خواهید همه اینها را با هم لحیم کنید)
  • یک تلفن دارای GPS (در این مورد iPhone 8 ، اما من از Galaxy S8 نیز استفاده کرده ام)
  • ظرف پرینت سه بعدی (واقعاً ضروری نیست ، هر ظرفی کار می کند یا اصلا وجود ندارد)

نرم افزار

  • Matlab از MathWorks (من نسخه 2018a دارم ، اما از نسخه های 2017a-b نیز استفاده کرده ام)
  • موبایل متلب بر روی گوشی شما نصب شده است
  • بسته پشتیبانی arduino برای Matlab
  • بسته حسگر آیفون برای Matlab
  • آردوینو IDE
  • بسته های پشتیبانی RadioHead و کتابخانه های arduino IDE
  • کتابخانه DHT11 برای arduino IDE
  • پایتون 3.7 (مطمئن شوید که کتابخانه pyserial یا کتابخانه سریال نصب شده است ، که باید برای نسخه 3.4 یا جدیدتر باشد)

مرحله 1: همه چیز را با هم ترکیب کنید

همه اش را بگذار کنار هم
همه اش را بگذار کنار هم
همه اش را بگذار کنار هم
همه اش را بگذار کنار هم
همه اش را بگذار کنار هم
همه اش را بگذار کنار هم

اول از همه به شما پیشنهاد می کنم چند آموزش آردوینو را در ارتباط با فرستنده های RF انجام دهید تا مطمئن شوید قطعات شما کار می کنند و سیم کشی درست است. مثالهای زیادی در دسترس است ، با کد موجود (برای کسانی از ما که در مورد C و C ++ چیزی نمی دانیم).

برای مونتاژ آردوینو و سنسورها نمودارهای زیر را دنبال کنید. هنگام سیم کشی آردوینوها یک نکته را باید در نظر داشت این است که پورت های داده ای که من استفاده می کنم مورد نیاز نیست اما توصیه می شود.

اگر تصمیم دارید پورت های داده ای را که استفاده می کنید تغییر دهید ، فقط باید پین های کد خود را مشخص کنید. شخصاً ، من فکر می کنم راحت تر از پورت های پیش فرض که کتابخانه های آردوینو تشخیص می دهند پایبند باشید.

و فقط برای روشن شدن ، نانو و یونو قابل تعویض هستند ، اما من از نانو برای قسمت فرستنده پروژه برای کاهش اندازه مانیتور دما استفاده کردم.

نکته جانبی: رنگ سبز حاوی نانو ظرف چاپ سه بعدی است.

مرحله 2: گیرنده

گیرنده
گیرنده

مرحله 3: فرستنده

فرستنده
فرستنده

مرحله 4: کد

پس از اتمام سیم کشی ، باید همه برنامه ها را اجرا کنید و کتابخانه ها را نصب کنید (اگر قبلاً این کار را نکرده اید) ، من فرض می کنم که دارید ، باید Matlab را راه اندازی کرده و بسته پشتیبانی iPhone را اجرا کنید. تلفن شما و Matlab در این مرحله باید در یک شبکه wifi باشند.

در پنجره فرمان Matlab بنویسید:

کانکتور روشن است

این امر از شما می خواهد که یک رمز پنج رقمی وارد کنید که از آن برای اتصال در iPhone خود استفاده خواهید کرد. مطمئن شوید که رمز عبور را به خاطر دارید. پس از وارد کردن رمز عبور ، Matlab اطلاعاتی از جمله آدرس IP شما را نمایش می دهد. در مرحله بعد ، که از دستورالعمل های منوی راهنمای "شروع به کار با حسگرها" در تلفن همراه Matlab آمده است ، استفاده کنید.

  • برای ارسال داده های حسگر به MathWorks Cloud یا رایانه ، این مراحل را دنبال کنید:
  • اگر داده های حسگر را به رایانه ارسال می کنید و اگر قبلاً نصب نشده است ، بسته پشتیبانی MATLAB برای سنسورهای iOS Apple را در MATLAB بارگیری و نصب کنید.
  • با استفاده از تنظیمات ، MATLAB Mobile را به MathWorks Cloud یا رایانه متصل کنید.
  • شیء mobiledev را در MATLAB (در رایانه خود) ایجاد کنید ، به عنوان مثال: >> m = mobiledev
  • یک یا چند سنسور را انتخاب کرده و روی شروع ضربه بزنید.

برای ثبت اطلاعات محلی حسگر در دستگاه خود ، این مراحل را دنبال کنید:

  • در صفحه سنسورها ، حسگرهایی را که می خواهید داده ها از آنها جمع آوری شود ، انتخاب کنید.
  • Log را انتخاب کنید.
  • روی دکمه Start ضربه بزنید.
  • پس از اتمام جمع آوری داده ها ، روی دکمه توقف ضربه بزنید.
  • در پنجره باز شده ، نام log sensor را وارد کنید.
  • در صورت نیاز مراحل 1-5 را تکرار کنید.

این بخش به قسمت 4 بازگردانده می شود ، بنابراین نیازی به جمع آوری داده ها نیست. فقط تلفن خود را آماده و موبایل Matlab را آماده نگه دارید.

حالا شما باید یک پوشه در جایی از رایانه خود ایجاد کنید تا فایل های کد Matlab را در خود جای دهد. شما چهار فایل جداگانه خواهید داشت ، دو مورد برای عملکردهای پس زمینه (فایل های.m) و یک فایل کد متلب برای GUI (.mlapp) ،.

ابتدا محاسبه جرم برای هوای خانه شما است (این به Matlab می گوید چقدر طول می کشد تا خانه شما گرم یا خنک شود)

تابع [Mass] = CalcMass (T_ins ، P_out ، Chng_dir)

runCalc = 0 ؛ Tmp_start = T_ins؛ start_start = ساعت ؛ time_end = 0 در حین اجراCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = ساعت ؛ PwrCntr = 0 ؛ runCalc = 0 ؛ else PwrCntr = P_out؛ runCalc = runCalc+0.1 پایان پایان زمان_دیاگ = time_end-time_start جرم = (P_out*time_diag) /7.035

و دومی:

تابع [timestamps، pwr_usage] = dist_cntrl (Lat_in، Lon_in، P_out، r_pref، speed، T_pref، mass)

AutoStat = 1 ؛ i = 1 ؛ در حالی که AutoStat == 1 time_start = ساعت ؛ m = mobiledev؛ t = csvread ('values.csv'، 0، 1)؛ t = t (i) ؛ timestamps = [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 ((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؛ ٪ زمان بازگشت شما را برآورد می کند_rtn = (Dist-r_pref)./ سرعت؛ ٪ تنظیم ترموستات لازم را بر اساس برق خروجی کولر و توده هوای خانه محاسبه می کند. calcTmp_set = ((--1.*P_out.*time_rtn)./ (جرم.*(1.005)))+T_pref ؛ ٪ تعیین می کند که آیا تنظیم دماسنج فعلی باید در صورت دور (calcTmp_set) ~ = زمان (t) زمان ACon = ساعت تغییر کند یا خیر. PwrCntr = P_out؛ timeACon = timeACon + clock-time_start؛ هزینه = P_out*timeACon*نرخ ؛ else 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٪ خواص مربوط به ویژگیهای اجزای برنامه (دسترسی = عمومی) 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 TempSettingsTab matlab.ui.container. Tab Temperature1SpinnerLabel matlab.ui.control. Label Temperature1Spinner. 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.abontont. Lontabel.abi.control.abontont. Lontel. Label.abi.control.abontrol.abontrol.abontrol.ablontabel.abi.control.ablontabel.abi.control.ablontel.ablontabel.abi.control.ablontel.ablontabel.abi.control.ab.ontrol.ablontabel.abi.control.ab.ontrol.ablontel.abi.control.abi.control.abi.control. Lontel.abi.control. Lontel.abi.control. Lontel.abi.control.abi.control.abi. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditFieldDaildingsabelEabingsEabingsEabingsEabingsEabingEabingsEabingEabingEabingsEabingEabingEabingEabingsEabingEabingEabingEabingEabingEabingEabelEabingEabingEtabingEtabelEabingEabingEtabingEtabingEtabingEtabingEtabingEtabing تعداد زیادی مورد استفاده

روش ها (دسترسی = خصوصی)

٪ مقدار عملکرد تغییر کرد: tempnow

تابع tempnowValueChanged (برنامه ، رویداد) temp = app.tempnow. Value ؛ temp = رندی ([60 ، 90] ، 1 ، 50) برنامه. Gauge. Value = 0 برای برنامه i = length (temp). Gauge. Value = temp (i) مکث (1) انتهای انتهایی

٪ مقدار عملکرد تغییر کرد: TemperatureDirectionSwitch

تابع TemperatureDirectionSwitchValueChanged (برنامه ، رویداد) way = app. TemperatureDirectionSwitch. Value ؛ way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1؛ else Chng_dir = 1؛ پایان Chng_dir؛ پایان

٪ مقدار عملکرد تغییر کرد: DDFH

تابع DDFHValueChanged (برنامه ، رویداد) r_pref = app. DDFH. Value ؛ پایان

٪ مقدار عملکرد تغییر کرد: AvgLocalSpeedEditField

تابع AvgLocalSpeedEditFieldValueChanged (برنامه ، رویداد) speed = app. AvgLocalSpeedEditField. Value ؛ پایان

٪ مقدار عملکرد تغییر کرد: PowerOutputRatingEditField

تابع PowerOutputRatingEditFieldValueChanged (برنامه ، رویداد) value = app. PowerOutputRatingEditField. Value؛ پایان

٪ مقدار عملکرد تغییر کرد: EnergyEfficiencyRatingEditField

تابع EnergyEfficiencyRatingEditFieldValueChanged (برنامه ، رویداد) value = app. EnergyEfficiencyRatingEditField. Value ؛ پایان

٪ عملکرد دکمه را فشار می دهد: RunDiagnosticButton

تابع RunDiagnosticButtonPushed (برنامه ، رویداد) way = app. TemperatureDirectionSwitch. Value؛ way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1؛ else Chng_dir = 1؛ پایان T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins، P_out، Chng_dir)

پایان

٪ مقدار عملکرد تغییر کرد: Temperature1Spinner

تابع Temperature1SpinnerValueChanged (برنامه ، رویداد) value = app. Temperature1Spinner. Value ؛ پایان

٪ مقدار عملکرد تغییر کرد: Temperature2Spinner

تابع Temperature2SpinnerValueChanged (برنامه ، رویداد) value = app. Temperature2Spinner. Value ؛ پایان

٪ مقدار عملکرد تغییر کرد: تغییر دهید

تابع SwitchValueChanged (برنامه ، رویداد) m = mobiledev ؛ Lat_in = m. عرض جغرافیایی Lon_in = m. طول 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 ، سرعت ، جرم) پایان پایان

initial راه اندازی و ساخت برنامه

روش ها (دسترسی = خصوصی)

٪ UIFigure و کامپوننت ها را ایجاد کنید

تابع createComponents (برنامه)

٪ ایجاد UIFigure

app. UIFigure = uifigure؛ app. UIFigure. Position = [100 100 640 480]؛ app. UIFigure. Name = 'UI Figure'؛

٪ ایجاد 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 ، 'push') ؛ app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (برنامه ،RunDiagnosticButtonPushed ، true) ؛ app. RunDiagnosticButton. FontWeight = 'bold'؛ 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. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab ، "عددی") ؛ app. EnergyEfficiencyRatingEditField. Limits = [0 100]؛ app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (برنامه ،EnergyEfficiencyRatingEditFieldValueChanged ، true) ؛ app. 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 ، true) ؛ app. PowerOutputRatingEditField. HorizontalAlignment = 'center'؛ 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 ، true) ؛ app. AvgLocalSpeedEditField. HorizontalAlignment = 'center'؛ app. AvgLocalSpeedEditField. Position = [142 231 100 22]؛

٪ ایجاد DesiredDistancefromHouseEditFieldLabel

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. 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 = '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 ، true) ؛ app. TemperatureDirectionSwitch. Position = [449 380 45 20]؛ app. TemperatureDirectionSwitch. Value = 'بالا'؛

٪ ایجاد TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup) ؛ app. TempSettingsTab. Title = 'Temp. تنظیمات'؛

٪ ایجاد 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 (برنامه ، @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 (برنامه ، @Temperature2SpinnerValueChanged ، true) ؛ app. Temperature2Spinner. Position = [157 230 100 70]؛ app. Temperature2Spinner. Value = 60 ؛

٪ ایجاد سوئیچ

app. Switch = uiswitch (app. TempSettingsTab ، 'slider') ؛ app. Switch. Items = {'1'، '0'}؛ app. Switch. ValueChangedFcn = createCallbackFcn (برنامه ،SwitchValueChanged ، true) ؛ app. Switch. FontName = 'نیالا'؛ 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 = "؛

٪ ایجاد tempnow

app.tempnow = uieditfield (app. TempSettingsTab ، "عددی") ؛ app.tempnow. Limits = [60 89]؛ app.tempnow. ValueChangedFcn = createCallbackFcn (برنامه ،tempnowValueChanged ، true) ؛ 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 = 'مرکز' ؛ 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 ؛

٪ ایجاد SavingsTab

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.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 = 'center'؛ app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]؛ app. ThisMonthCostEditFieldLabel. Text = 'هزینه این ماه'؛

٪ ایجاد ThisMonthCostEditField

app. ThisMonthCostEditField = uieditfield (app. SavingsTab ، "عددی") ؛ app. ThisMonthCostEditField. Limits = [0 Inf]؛ app. ThisMonthCostEditField. ValueDisplayFormat = '$٪ 7.2f'؛ app. ThisMonthCostEditField. HorizontalAlignment = 'center'؛ app. ThisMonthCostEditField. 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 = 'center'؛ app. TotalSavingsEditField. Position = [88 39 137 58] ؛ پایان پایان

روش ها (دسترسی = عمومی)

٪ برنامه ساخت

برنامه عملکرد = Control_1

Create ایجاد و پیکربندی اجزاء

ایجاد کامپوننت ها (برنامه)

٪ برنامه را با طراح برنامه ثبت کنید

registerApp (برنامه ، برنامه. UIFigure)

اگر nargout == 0

پایان برنامه روشن

٪ کد که قبل از حذف برنامه اجرا می شود

حذف عملکرد (برنامه)

٪ حذف برنامه UIFigure هنگام حذف برنامه

حذف (app. UIFigure) end end end end

احتمالاً با خطایی روبرو می شوید که مشکلی نیست. فقط GUI ایجاد شده پس از فشار دادن Run را ببندید ، ما بقیه برنامه ها و داده های لازم را در یک لحظه جمع آوری می کنیم.

از آنجا که Matlab راه اندازی شده است ، می توانیم به سراغ پایتون برویم. ابتدا ، برنامه پایتون را یا از طریق خط فرمان (در ویندوز) یا با استفاده از فایل.exe در پوشه پایتون خود اجرا کنید. با استفاده از دستور import مطمئن شوید که همه کتابخانه های مناسب نصب شده اند.

سریال واردات

زمان واردات csv واردات

اینها سه کتابخانه ای هستند که برای شروع به آنها نیاز دارید ، اگرچه ما به زودی کتابخانه خود را ایجاد خواهیم کرد. اگر خطایی در این دستورات وجود داشت ، به عقب برگردید و مطمئن شوید که کتابخانه ها نصب شده اند و در پوشه Lib در پوشه پایتون قرار دارند. در مرحله بعد ما چیزی را ایجاد می کنیم که من کتابخانه pythonlogger نامیده ام. این نام ضروری نیست ، شما می توانید آن را هرطور که می خواهید بنامید ، فقط نام فایل پایتون (.py) است که ایجاد کرده اید.

ویرایشگر متن را باز کنید ، من از Sublime3 استفاده می کنم اما دفترچه یادداشت به خوبی کار می کند و این کد را وارد کنید.

def pythonprint ():

import pythonlogger import import import time import csv ser = serial. سریال ('COM8') # COM8 پورت سریال arduino است ، این احتمالاً برای هر کاربر متفاوت خواهد بود ، یعنی پورت سریال خود را در arduino IDE ser.flushInput () بررسی کنید در حالی که درست است: try: ser_bytes = ser.readline () print (ser_bytes) with open ("test_data.csv"، "a") as f: writer = csv.writer (f، delimiter = "،") # داده ها را روی به عنوان author.writerow ([time.time () ، ser_bytes]) با کاما جدا شود

متن را به عنوان "نام کتابخانه موردنظر خود را وارد کنید".py در پوشه Lib ذخیره کنید. همچنین توجه داشته باشید که خط def (pythonprint) نام تابعی را که قرار است فراخوانی کنید تعریف می کند ، بنابراین می توانید آن را به def "درج نام مورد نظر برای عملکرد خود" () تغییر دهید. وقتی کتابخانه ذخیره شد ، می توانیم به کد arduino برویم.

arduino IDE را باز کنید و دو پنجره طرح جدید باز کنید. آن دو فایل طرح را در جایی مناسب ذخیره کنید ، نام این فایل ها مهم نیست. سپس تمام کد پیش فرض را حذف کرده و کد زیر را جایگزین آن کنید.

برای آردوینو دریافت کننده:

#عبارتند از

#include #include #include // این مورد استفاده نمی شود اما برای کامپایل درایور RH_ASK مورد نیاز است. struct dataStruct {دمای شناور ؛ }اطلاعات من؛ void setup () {Serial.begin (9600)؛ // اشکال زدایی فقط اگر (! driver.init ()) Serial.println ("init fail")؛ } حلقه void () {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) ؛ }}

P. S. //driver.printBuffer…. خط و غیره کد تست است. نیازی به نگرانی نیست مگر این که تشخیص خود را انجام دهید و بخواهید بفهمید که آیا واقعاً داده دریافت می کنید.

برای آردوینو فرستنده

#عبارتند از

#include #include #include // این مورد استفاده نمی شود اما برای کامپایل نیاز است #include #include int pin = 4؛ DHT11 dht11 (پین) ؛ راننده RH_ASK ؛ struct dataStruct {دمای شناور ؛ }اطلاعات من؛ بایت tx_buf [sizeof (myData)] = {0}؛ // بنابراین آرگومانها نرخ بیت ، انتقال پین (tx) ، // دریافت پین (rx) ، ppt پین ، isInverse است. 2 مورد آخر استفاده نمی شود. void setup () {Serial.begin (9600)؛ // اشکال زدایی فقط اگر (! driver.init ()) Serial.println ("init fail")؛ } void loop () {int err؛ شناور دمای هوا ، humi ؛ uint8_t msg؛ if ((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: به کار انداختن آن

کار کردن آن
کار کردن آن
کار کردن آن
کار کردن آن
کار کردن آن
کار کردن آن

حالا که ما همه کد ها را با هم داریم و arduino's مونتاژ شده است ، می توانیم arduino را به رایانه شما متصل کرده و کد را بارگذاری کنیم. مطمئن شوید که کد صحیح را برای میکروکنترلرهای گیرنده و گیرنده ارسال کرده اید. می توانید هر دو آردوینو را در حالی که این دستگاه در حال اجرا است به رایانه خود متصل کنید ، اما باید مطمئن شوید که پورت صحیح در حال حرکت به جلو انتخاب شده است ، یا می توانید آردوینو فرستنده را قطع کرده و پس از وارد شدن کد از منبع دیگر تغذیه کنید. بارگذاری شد

در مورد آن ، شما باید پورت متصل به arduino دریافت کننده خود را از منوی ابزار IDE انتخاب کنید و پایتون را اجرا کنید.

هنگام انجام این کار ، مانیتور سریال را باز نکنید ، پایتون نمی تواند سریال را در حالی که مانیتور باز است بخواند. پس از باز شدن پایتون ، تابع pythonprint را به صورت زیر فراخوانی کنید.

pythonlogger.pythonprint ()

با این کار جمع آوری داده ها از پورت سریال arduino شروع می شود. اگر اکنون پوشه پایتون خود را باز کنید ، خواهید دید که یک فایل.csv جدید با نام "test_data.csv" ایجاد شده است که تمام اطلاعات زمان و دما را در خود نگه می دارد. این فایلی است که متلب برای انجام کلیه محاسبات و کنترل های خود به آن دسترسی دارد.

هشدار دیگر: test_data.csv را هنگام دسترسی یا نوشتن داده ها باز نکنید. اگر این کار را انجام دهید ، پایتون و/یا کد Matlab خراب می شود و خطایی را ارسال می کند

اگر تصمیم گرفتید.csv را بعداً باز کنید ، متوجه خواهید شد که ستون زمان فقط یک رشته بسیار بزرگ از اعداد است. به این دلیل است که دستور time.time () تعداد ثانیه ها را از اول ژانویه 1970 می نویسد.

در این مرحله پایتون باید داده های دما را که از پورت سریال می خواند چاپ کند. باید شبیه چیزی باشد:

b'25.03 '/r/n

نگران نویسه های اضافی نباشید ، کد متلب پنج مقدار میانی را در ستون دوم فایل.csv نمایه می کند.

اکنون که همه برنامه های پشتیبانی کننده کار می کنند و داده ها جمع آوری می شوند ، می توانیم جمع آوری داده های GPS را از برنامه تلفن همراه Matlab که قبلاً تنظیم شده بود شروع کرده و کد GUI متلب را اجرا کنیم. هنگامی که در برگه حسگر Matlab mobile هستید ، GPS را انتخاب کرده و دکمه شروع را فشار دهید.

اگر تازه وارد متلب موبایل شده اید ، به مرحله 4 بازگردید و به تصاویر صفحه بالا نگاه کنید. اگر هنوز مشکلاتی دارید ، مطمئن شوید که به رایانه ای که قبلاً انتخاب کرده اید وصل هستید (در برگه تنظیمات) و از پیوند فرمان "اتصال روشن" برای بررسی آنلاین بودن متلب استفاده کنید.

مرحله 6: استفاده از برنامه

استفاده از برنامه
استفاده از برنامه

موارد متعددی در پس زمینه در این سیستم در حال انجام است. داده های دما توسط arduino و pyton جمع آوری و ثبت می شوند ، Matlab داده های GPS را از تلفن شما جمع آوری کرده و محاسبات را انجام می دهد تا ببیند چقدر از خانه خود فاصله دارید و ترموستات خود را بر اساس همه این اطلاعات تنظیم می کند. جایی که وارد می شوید ارائه ترجیحات شما است.

کد GUI متلب را اجرا کنید. فایل.mlapp را باز کرده و به برگه اول نگاه کنید. شما باید اطلاعات مربوط به این مورد را خودتان جمع آوری کنید ، میزان کارایی و قدرت واحد گرمایش/سرمایش شما معمولاً در خود واحد قابل مشاهده است و سرعت متوسط شما فقط یک تخمین خوب از سرعت رانندگی است. پس از وارد کردن مقادیر ، دکمه "Run Diagnostic" را فشار دهید و برنامه ترموستات شما را کنترل می کند تا اطلاعات مربوط به خانه شما را جمع آوری کند.

به منوی بعدی بروید.

مرحله 7: کنترل دما

کنترل دما
کنترل دما

این منو به شما امکان می دهد دمای مورد نظر خود را در خانه و خارج از خانه انتخاب کنید. دمای #1 را روی دمای راحت خود قرار دهید و دمای #2 را روی مقدار زیاد یا پایینی قرار دهید که برای خانه شما ایمن است (مطمئن شوید که وقتی سگ در خانه دارید و غیره آن را روی 100 درجه تنظیم نکنید).

مرحله 8: داده های تاریخی

داده های تاریخی
داده های تاریخی

در نهایت می توانید با استفاده از کنترل خودکار میزان صرفه جویی خود را مشاهده کنید. این اساساً تخمین می زند که اگر ترموستات شما روی دمای مطلوب 24/7 تنظیم شود ، چه مقدار انرژی مصرف می شود ، سپس انرژی واقعی مصرف شده شما کم می شود.

موفق باشید ساختمان.

توصیه شده: