Mundarija:

Avtostat: masofali termostat: 8 qadam (rasmlar bilan)
Avtostat: masofali termostat: 8 qadam (rasmlar bilan)

Video: Avtostat: masofali termostat: 8 qadam (rasmlar bilan)

Video: Avtostat: masofali termostat: 8 qadam (rasmlar bilan)
Video: TRACKER 2 avtomobiliga автозапуск qilindi✅ 2024, Iyul
Anonim
Avtostat: masofali termostat
Avtostat: masofali termostat

Siz so'rayotgan savol: "nega siz boshqa masofali termostatni qilyapsiz?"

Bu savolga javob berish kerak edi va bozorning aqlli termostatlari juda qimmat.

Adolatli ogohlantirish, bu "kontseptsiyaning isboti", bu sizning termostatni nazorat qilish uchun bir nechta qo'shimcha chiqimlarni talab qiladi, lekin yadro o'z joyida va sizning holatingizga qarab o'zgartirilishi mumkin. Bundan tashqari, bu hali ham davom etayotgan ish, shuning uchun bir nechta yangilanishlar va o'zgarishlarni kuting (ayniqsa Matlab kodiga)

Ishni boshlash uchun men sizni ogohlantirmoqchiman, buning uchun uchta dastur kerak (ulardan bittasi juda qimmat), juda ko'p kutubxonalar va dasturlarni qo'llab -quvvatlash paketlari, va siz ularni bir -biri bilan gaplashishingiz kerak. Bu bosh og'rig'i. Ushbu ogohlantirish bilan, materiallardan boshlaylik.

Uskuna

  • arduino nano
  • arduino uno (yoki boshqa nano, men uno -ni ishlatardim, chunki menda yotar edi)
  • turli xil o'tish kabellari, ba'zi erkak/erkak va ikkita birlashtirilgan erkak/ayol o'tish moslamasining ikkita to'plami
  • 433 MGts chastotali radio chastotali (RF) qabul qilgich, men MX-05V dan foydalanardim
  • 433 MGts chastotali RF uzatuvchi, men MX-FS-03V dan foydalanardim
  • DHT11 yuqori aniqlikdagi termometr va namlik sensori (men foydalangan uchburchakli chipga o'rnatilgan, kerakli rezistorlar o'rnatilgan)
  • non paneli (agar siz bularning barchasini lehimlashni xohlamasangiz)
  • GPS bilan telefon (bu holda iPhone 8, lekin men ham Galaxy S8 dan foydalanganman)
  • 3D bosilgan konteyner (kerak emas, har qanday konteyner ishlaydi yoki umuman yo'q)

Dasturiy ta'minot

  • MathWorks-dan Matlab (menda 2018a nashri bor, lekin men 2017a-b nashrlarini ham ishlatganman)
  • Telefoningizga Matlab mobile o'rnatilgan
  • Matlab uchun arduino qo'llab -quvvatlash to'plami
  • Matlab uchun iPhone sensor to'plami
  • arduino IDE
  • RadioHead arduino IDE to'plamlari va kutubxonalarini qo'llab -quvvatlaydi
  • Arduino IDE uchun DHT11 kutubxonasi
  • python 3.7 (pyserial kutubxonasi yoki ketma -ket kutubxona o'rnatilganligiga ishonch hosil qiling, u 3.4 yoki undan keyingi versiya uchun bo'lishi kerak)

1 -qadam: Hammasini bir joyga to'plash

Hammasini bir joyga to'plash
Hammasini bir joyga to'plash
Hammasini bir joyga to'plash
Hammasini bir joyga to'plash
Hammasini bir joyga to'plash
Hammasini bir joyga to'plash

Birinchidan, men sizning qismlaringiz ishlayotgani va simlarning to'g'ri ekanligiga ishonch hosil qilish uchun RF transmitterlari bilan shug'ullanadigan bir nechta arduino darslarini bajarishni taklif qilaman. Kod mavjud bo'lgan ko'plab misollar mavjud (C va C ++ haqida deyarli hech narsa bilmaydiganlar uchun).

Arduino va datchiklarni yig'ish uchun quyidagi ulanish sxemalariga amal qiling. Arduinolarni ulashda yodda tutish kerak bo'lgan narsa shundaki, men foydalangan ma'lumotlar portlari talab qilinmaydi, lekin tavsiya etiladi.

Agar siz foydalanadigan ma'lumotlar portlarini o'zgartirishga qaror qilsangiz, kodingizdagi pinlarni aniqlashingiz kifoya. Shaxsan menimcha, arduino kutubxonalari tan oladigan standart portlarga rioya qilish osonroq.

Va aniq bo'lish uchun, nano va uno bir -birining o'rnini bosadi, lekin men harorat monitorining hajmini kamaytirish uchun loyihaning uzatuvchi tomoni uchun nanodan foydalandim.

Yon eslatma: nanoni ushlab turgan yashil kontrast 3D bosilgan konteynerdir.

2 -qadam: qabul qiluvchi

Qabul qiluvchi
Qabul qiluvchi

3 -qadam: uzatuvchi

Transmitter
Transmitter

4 -qadam: Kod

Ulanish tugagandan so'ng, siz barcha dasturlarni ishga tushirishingiz va kutubxonalarni o'rnatishingiz kerak (agar siz hali o'rnatmagan bo'lsangiz), menimcha, sizda Matlabni ishga tushirish va iPhone qo'llab -quvvatlash paketini ishga tushirish kerak. Bu vaqtda telefoningiz ham, Matlab ham bitta wifi tarmog'ida bo'lishi kerak.

Matlab buyruqlar oynasida yozing:

ulagich yoqilgan

Bu sizga iPhone -ga ulanish uchun ishlatiladigan besh xonali parolni kiritishni taklif qiladi. Parolni eslaganingizga ishonch hosil qiling. Parolni kiritganingizda Matlab ba'zi ma'lumotlarni, shu jumladan sizning IP manzilingizni ko'rsatadi. Buni Matlab mobile -dagi "Sensorlarni ishga tushirish" yordam menyusidagi ko'rsatmalardan keladigan keyingi bosqichda qo'llang.

  • Sensor ma'lumotlarini MathWorks Cloud yoki kompyuterga yuborish uchun quyidagi amallarni bajaring.
  • Agar siz sensorli ma'lumotlarni kompyuterga yuborsangiz va u hali o'rnatilmagan bo'lsa, MATLAB -da Apple iOS sensorlari uchun MATLAB qo'llab -quvvatlash paketini yuklab oling va o'rnating.
  • Sozlamalar yordamida MATLAB Mobile -ni MathWorks Cloud yoki kompyuterga ulang.
  • MATLAB -da (kompyuteringizda) mobiledev ob'ektini yarating, masalan: >> m = mobiledev
  • Bir yoki bir nechta sensorni tanlang va "Ishga tushirish" ga teging.

Sensor ma'lumotlarini qurilmangizda mahalliy qayd qilish uchun quyidagi amallarni bajaring:

  • Sensorlar ekranida ma'lumotlarni yig'moqchi bo'lgan sensorlarni tanlang.
  • Jurnal -ni tanlang.
  • Boshlash tugmasini bosing.
  • Ma'lumot yig'ish tugagach, To'xtatish tugmasini bosing.
  • Ochilgan oynada sensorlar jurnalining nomini kiriting.
  • Agar kerak bo'lsa, 1-5 bosqichlarni takrorlang.

Bu bo'lim 4 -qismda ko'rib chiqiladi, shuning uchun hozircha ma'lumotlarni yig'ishni boshlashning hojati yo'q. Telefonni qo'lda ushlab turing va Matlab mobil telefonini tayyor turing.

Endi siz Matlab kod fayllarini saqlash uchun kompyuterning biron bir joyida papka yaratishingiz kerak. Sizda to'rtta alohida fayl bo'ladi, ikkitasi fon funktsiyalari uchun (.m fayllar) va GUI (.mlapp) uchun bitta Matlab kodli fayl.

Birinchidan, sizning uyingizdagi havo uchun massa hisobi (bu Matlabga uyingizni isitish/sovutish uchun qancha vaqt kerakligini bilish imkonini beradi)

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

runCalc = 0; Tmp_start = T_ins; time_start = soat; time_end = 0 runCalc <= 1 bo'lsa T_ins == (Tmp_start+(7*Chng_dir)) time_end = soat; PwrCntr = 0; runCalc = 0; boshqa PwrCntr = P_out; runCalc = runCalc+0.1 tugash vaqti_diag = time_end-time_start Mass = (P_out*time_diag) /7.035

Va ikkinchisi:

funktsiya [vaqt belgilari, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, tezlik, T_pref, massa)

AutoStat = 1; i = 1; AutoStat == 1 time_start = soat; m = mobiledev; t = csvread ('qadriyatlar.csv', 0, 1); t = t (i); vaqt belgilari = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; longg formati; Kenglik va %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)) ga asoslangan masofani hisoblash uchun %haversine formulasi. (m. Uzunlik-Lon_in)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %sizning vaqtingizni taxmin qiladi time_rtn = (Dist-r_pref)./ tezlik; %uy konditsioneri va havo massasining %quvvatsizlanishiga qarab kerakli termostatni sozlashni hisoblab chiqadi. calcTmp_set = ((-1.*P_out.*time_rtn)./ (massa.*(1.005)))+T_pref; %dumaloq (calcTmp_set) ~ = round (t) timeACon = soat bo'lsa, joriy termostatni sozlamalarini o'zgartirish kerakligini aniqlaydi; PwrCntr = P_out; timeACon = timeACon + clock-time_start; xarajat = P_out*timeACon*stavkasi; else PwrCntr = 0 tugash vaqt tamg'asi (oxiri+1, [1: 6]) = soat; pwr_usage (oxiri+1, 1) = PwrCntr; pauza (5) oxiri oxiri

Bu ikkala fayl ham Matlab funktsiyalari. Agar siz ularni maxsus ehtiyojlar uchun o'zgartirishni rejalashtirmasangiz, ularga kirishingiz shart emas, chunki siz ularni GUIdan chaqirasiz. Ikkala faylni ham alohida saqlang, birinchisi CalcMass.m, ikkinchisi dist_cntrl.m, bu GUI kodi funktsiyalarni chaqirish uchun foydalanadigan ismlar, shuning uchun agar siz quyidagi kodning qolgan qismini tahrir qilmoqchi bo'lmasangiz. nomlash qoidasi.

GUI kodiga kirishdan oldin, siz Matlab uchun dasturlar konstruktorini ochishingiz kerak, uni Matlab menyu satrida yoki Matlab buyruqlar oynasida quyidagi buyruqni kirgizish orqali ochish mumkin:

dasturchi

Ilova dizayneri ochilgandan so'ng, yangi dastur faylini (.mlapp) oching va kod oynasidan barcha standart kodni o'chirib tashlang. Keyin hammasini quyidagilar bilan almashtiring va ishga tushirish tugmasini bosing.

classdef Control_1 <matlab.apps. AppBase % App komponentalari xususiyatlariga mos keladigan xususiyatlar (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Tugma 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 TemperDirectionSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch ui.control. Spinner harorati2SpinnerLabel matlab.ui.cont rol. Label harorati Matib.ui.container. Tab UIAxes Matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsField. Faydlari.

usullar (kirish = shaxsiy)

% O'zgartirilgan funktsiya: vaqt

tempnowValueChanged funktsiyasi (ilova, hodisa) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 for i = length (temp) app. Gauge. Value = temp (i) pauza (1) oxiri

% Qiymat o'zgargan funksiya: TemperatureDirectionSwitch

funktsiya TemperatureDirectionSwitchValueChanged (app, event) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; boshqa Chng_dir = 1; tugatish Chng_dir; oxiri

% Qiymat o'zgargan funksiya: DDFH

funktsiya DDFHValueChanged (ilova, hodisa) r_pref = app. DDFH. Value; oxiri

% Qiymat o'zgargan funksiya: AvgLocalSpeedEditField

funktsiya AvgLocalSpeedEditFieldValueChanged (ilova, hodisa) tezlik = app. AvgLocalSpeedEditField. Value; oxiri

% Qiymat o'zgargan funktsiya: PowerOutputRatingEditField

PowerOutputRatingEditFieldValueChanged funktsiyasi (ilova, hodisa) qiymati = app. PowerOutputRatingEditField. Value; oxiri

% Qiymat o'zgargan funksiya: EnergyEfficiencyRatingEditField

funktsiyasi EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; oxiri

% Tugma bosilgan funksiya: RunDiagnosticButton

RunDiagnosticButtonPushed funktsiyasi (ilova, hodisa) usuli = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; boshqa Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

oxiri

% Qiymat o'zgargan funksiya: Harorat1Spinner

funktsiya Temperature1SpinnerValueChanged (ilova, hodisa) qiymati = app. Temperature1Spinner. Value; oxiri

% Qiymat o'zgargan funksiya: Temperature2Spinner

funktsiya Temperature2SpinnerValueChanged (ilova, hodisa) qiymati = app. Temperature2Spinner. Value; oxiri

% Qiymat o'zgargan funksiya: almashtirish

SwitchValueChanged funktsiyasi (ilova, hodisa) m = mobiledev; Lat_in = m. Latitude Lon_in = m. L uzunlik P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; tezlik = m Tezlik; massa = 200; tezlik = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, tezlik, massa) oxiri

% Ilovani ishga tushirish va qurish

usullar (kirish = shaxsiy)

% UIFigure va komponentlarini yarating

createComponents funksiyasi (ilova)

% UIFigure yaratish

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'UI rasm';

% TabGroup yaratish

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

% SetupTab yaratish

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'O'rnatish';

% RunDiagnosticButton yarating

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (ilova, @RunDiagnosticButtonPushed, rost); app. RunDiagnosticButton. FontWeight = 'qalin'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Diagnostikani ishga tushirish';

% EnergyEfficiencyRatingEditFieldLabel yaratish

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'o'ng'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energiya samaradorligi reytingi';

% EnergyEfficiencyRatingEditField yaratish

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'raqamli'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, rost); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'markaz'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% PowerOutputRatingEditFieldLabel yaratish

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'o'ng'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Quvvat chiqishi reytingi';

% PowerOutputRatingEditField yarating

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'raqamli'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, rost); app. PowerOutputRatingEditField. HorizontalAlignment = 'markaz'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% AvgLocalSpeedEditFieldLabel yaratish

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'o'ng'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'O'rtacha. Mahalliy tezlik ';

% AvgLocalSpeedEditField yarating

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'raqamli'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, rost); app. AvgLocalSpeedEditField. HorizontalAlignment = 'markaz'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% DesiredDistancefromHouseEditFieldLabel yaratish

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'o'ng'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Kerakli masofa'; 'Uydan'};

% DDFH yaratish

app. DDFH = uieditfield (app. SetupTab, 'raqamli'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (ilova, @DDFHValueChanged, rost); app. DDFH. HorizontalAlignment = 'markaz'; app. DDFH. Pozitsiya = [139 135 100 22];

% TemperatureDirectionSwitchLabel yaratish

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'markaz'; app. TemperatureDirectionSwitchLabel. Pozitsiya = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Harorat yo'nalishi';

% TemperatureDirectionSwitch yaratish

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'slayder'); app. TemperatureDirectionSwitch. Items = {'Yuqoriga', 'Pastga'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, rost); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Yuqoriga';

TempSettingsTab yaratish

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Harorat. Sozlamalar ';

Haroratni yaratish 1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'markaz'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Harorat'; '#1'};

Haroratni yaratish 1Spinner

app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (ilova, @Temperature1SpinnerValueChanged, rost); app. Temperature1Spinner. Pozitsiya = [157 346 100 68]; app. Temperature1Spinner. Value = 60;

% Temperatur2SpinnerLabel yaratish

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'markaz'; app. Temperature2SpinnerLabel. Pozitsiya = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Harorat'; '#2'};

% Temperatur2Spinner yaratish

app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (ilova, @Temperature2SpinnerValueChanged, rost); app. Temperature2Spinner. Pozitsiya = [157 230 100 70]; app. Temperature2Spinner. Value = 60;

% Kalit yaratish

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

% EditFieldLabel yaratish

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

% Vaqtinchalik vaqt yaratish

app.tempnow = uieditfield (app. TempSettingsTab, "raqamli"); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (dastur, @tempnowValueChanged, rost); app.tempnow. HorizontalAlignment = 'markaz'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

GaugeLabel yaratish

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'markaz'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'o'lchov';

O'lchagich yaratish

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

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'tejash';

% UIAxes yarating

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'tejash') xlabel (app. UIAxes, 'Oy va yil') ylabel (app. UIAxes, 'Pul') ilova. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.6066666666666667] app. UIAxes. Color = [0.9412 0.9412 0.9412]; app. UIAxes. Position = [146 219 348 237];

ThisMonthCostEditFieldLabel yaratish

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'markaz'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Bu oylik xarajat';

% ThisMonthCostEditField -ni yarating

app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'raqamli'); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'markaz'; app. ThisMonthCostEditField. Position = [417 39 137 58];

TotalSavingsEditFieldLabel yaratish

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'o'ng'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'jami tejash';

TotalSavingsEditField yaratish

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'raqamli'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'markaz'; app. TotalSavingsEditField. Position = [88 39 137 58]; oxiri oxiri

usullar (kirish = ommaviy)

% Ilova tuzish

funktsiya ilovasi = Control_1

% Komponentlarni yaratish va sozlash

createComponents (ilova)

% App Designer -da ilovani ro'yxatdan o'tkazing

RegisterApp (ilova, ilova. UIF rasm)

agar nargout == 0 bo'lsa

ilovaning oxiri oxiri aniq

% Ilovani o'chirishdan oldin bajariladigan kod

funktsiyani o'chirish (dastur)

Ilova o'chirilganda % UIFigure -ni o'chirib tashlang

o'chirish (app. UIFigure) oxiri oxiri

Ehtimol sizda xato bo'ladi, bu muammo emas. Ishga tushirish tugmachasini bosgandan so'ng yaratilgan GUI -ni yoping, biz qolgan dasturlar va ma'lumotlarni bir zumda yig'amiz.

Matlab o'rnatilganligi sababli, biz pythonga o'tishimiz mumkin. Birinchidan, buyruq satridan (derazalarda) yoki python papkasidagi.exe faylini ishlatib, python dasturini ishga tushiring. Import buyrug'i yordamida barcha tegishli kutubxonalar o'rnatilganligiga ishonch hosil qiling.

serialni import qilish

import vaqti import csv

Bu uchta kutubxona, siz boshlashingiz kerak, lekin yaqinda biz o'z kutubxonamizni yaratamiz. Agar bu buyruqlar bilan qandaydir xato bo'lsa, orqaga qayting va kutubxonalar o'rnatilganligiga va python papkasidagi Lib papkasida ekanligiga ishonch hosil qiling. Keyin men pythonlogger kutubxonasi deb nomlangan narsani yaratamiz. Bu nom shart emas, siz xohlagan narsaga qo'ng'iroq qilishingiz mumkin, bu faqat siz yaratgan python faylining nomi (.py).

Matn muharririni oching, men Sublime3 dan foydalanaman, lekin bloknot yaxshi ishlaydi va bu kodni kiriting.

def pythonprint ():

import pythonlogger import ketma -ket import vaqti csv ser = serial. Serial ('COM8') # COM8 - bu arduino ketma -ket port, bu har bir foydalanuvchi uchun har xil bo'lishi mumkin, ya'ni ketma -ket portingizni arduino IDE ser.flushInput () da tekshiring. To'g'ri: harakat qilib ko'ring: ser_bytes = ser.readline () chop etish (ser_bytes) bilan ochiq ("test_data.csv", "a") f: yozuvchi = csv.writer (f, ajratuvchi = ",") # sifatida ma'lumotlarni o'rnatadi yozuvchi vergul bilan ajratiladi.

Matnni Lib papkasida "kerakli kutubxona nomini kiriting".py sifatida saqlang. Shuni ham yodda tutingki, def pythonprint () liniyasi siz qo'ng'iroq qilmoqchi bo'lgan funksiyaning nomini belgilaydi, shuning uchun siz uni "funktsiyangiz uchun kerakli ismni kiritish" () ga o'zgartirishingiz mumkin. Kutubxona saqlanganda biz arduino kodiga o'tamiz.

Arduino IDE -ni oching va ikkita yangi eskiz oynasini oching. Bu ikkita eskiz faylini qulay joyda saqlang, bu fayllarning nomi muhim emas. Keyin barcha standart kodni o'chirib tashlang va uni quyidagilar bilan almashtiring.

Qabul qiluvchi arduino uchun:

#qo'shing

#include #include #include // bu ishlatilmaydi, lekin RH_ASK drayverini kompilyatsiya qilish uchun kerak; struct dataStruct {float temp; } myData; void setup () {Serial.begin (9600); // Nosozliklarni tuzatish faqat (! Driver.init ()) Serial.println ("init muvaffaqiyatsiz") bo'lsa; } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // bloklanmagan {int i; // Yaxshi nazorat summasi bo'lgan xabar qabul qilindi, uni tashlab yuboring. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer …. etc qatori test kodidir. Agar siz tashxis qo'ymasangiz va siz haqiqatan ham ma'lumot olayotganingizni bilmoqchi bo'lsangiz, bu haqda tashvishlanishga hojat yo'q.

Arduino uzatuvchi uchun

#qo'shing

#include #include #include // bu ishlatilmaydi, lekin kompilyatsiya qilish uchun kerak #include #include int pin = 4; DHT11 dht11 (pin); RH_ASK haydovchi; struct dataStruct {float temp; } myData; bayt tx_buf [sizeof (myData)] = {0}; // Demak, dalillar bit tezligi, uzatish pin (tx), // qabul qilish pin (rx), ppt pin, isInverse. Oxirgi 2 ishlatilmaydi.void setup () {Serial.begin (9600); // Nosozliklarni tuzatish faqat (! Driver.init ()) Serial.println ("init muvaffaqiyatsiz") bo'lsa; } void loop () {int err; float temp, humi; uint8_t xabar; if ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); bayt zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // barcha ma'lumotlar kechiktirilgunga qadar bajarishni to'xtatish (2000); // 2 soniya kuting}}

Qo'shish buyruqlari etarli bo'lishi kerak, lekin agar sizda keyinchalik ma'lumot uzatish bilan bog'liq muammolar bo'lsa, siz RadioHead kutubxonasi papkasida qidirishni va qolgan fayl nomlarini bir xil formatga kiritishni xohlashingiz mumkin.

5 -qadam: uni ishga tushirish

Ishlash
Ishlash
Ishlash
Ishlash
Ishlash
Ishlash

Endi bizda barcha kodlar bor va arduino yig'ilgan, biz arduino -ni kompyuteringizga ulashimiz va kodni yuklashimiz mumkin. To'g'ri kodni qabul qiluvchi va uzatuvchi mikrokontrollerlarga yuborganingizga ishonch hosil qiling. Siz ishlayotgan vaqtda siz ikkala arduinoni ham kompyuterga ulashingiz mumkin, lekin siz oldinga siljigan to'g'ri portni tanlaganingizga ishonch hosil qilishingiz kerak, yoki siz uzatuvchi arduino -ni uzib, kodni boshqa manbadan quvvatlantirishingiz mumkin. yuklangan.

Bu haqda gapirganda, siz IDE asboblar menyusidan qabul qiluvchi arduino bilan bog'langan portni tanlashingiz va pythonni ishga tushirishingiz kerak.

Buni qilayotganda ketma -ket monitorni ochmang, monitor ochilganda python serialni o'qiy olmaydi. Python ochilgach, pythonprint funktsiyasini quyidagicha chaqiring.

pythonlogger.pythonprint ()

Bu arduino ketma -ket portidan ma'lumotlarni yig'ishni boshlaydi. Agar siz hozirda python papkasini ochsangiz, "test_data.csv" deb nomlangan yangi.csv fayli yaratilganligini ko'rasiz, u vaqt va harorat haqidagi barcha ma'lumotlarni o'z ichiga oladi. Bu Matlab barcha hisob -kitoblar va boshqaruvlarni amalga oshirish uchun kiradigan fayl bo'ladi.

Yana bir ogohlantirish: ma'lumotlarga kirish yoki yozish paytida test_data.csv faylini ochmang. Agar shunday qilsangiz, python va/yoki Matlab kodi qulab tushadi va xatoni qaytaradi

Agar siz keyinroq.csv faylini ochishga qaror qilsangiz, vaqt ustunining juda katta sonlar qatorini ko'rasiz. Buning sababi, time.time () buyrug'i 1970 yil 1 yanvardan boshlab soniya sonini yozadi.

Bu vaqtda python ketma -ket portdan o'qiyotgan harorat ma'lumotlarini chop etishi kerak. Bu shunday bo'lishi kerak:

b'25.03 '/r/n

Qo'shimcha belgilar haqida tashvishlanmang, Matlab kodi.csv faylining ikkinchi ustunidagi o'rta beshta qiymat uchun indekslar.

Endi barcha qo'llab -quvvatlovchi dasturlar ishlayapti va ma'lumotlar yig'ilmoqda, biz ilgari o'rnatilgan Matlab mobil dasturidan GPS ma'lumotlarini yig'ishni boshlashimiz va Matlab GUI kodini ishga tushirishimiz mumkin. Matlab Mobile -ning sensorli yorlig'iga kirganingizdan so'ng, GPS -ni tanlang va ishga tushirish tugmasini bosing.

Agar siz Matlab mobile -da yangi bo'lsangiz, 4 -bosqichga qayting va yuqoridagi skrinshotlarga qarang. Agar siz hali ham muammolarga duch kelsangiz, ilgari tanlangan kompyuterga ulanganligingizga ishonch hosil qiling (sozlamalar ko'rinishida) va "ulagich yoqilgan" buyrug'i yordamida Matlab onlayn ekanligini tekshiring.

6 -qadam: Dasturdan foydalanish

Dasturdan foydalanish
Dasturdan foydalanish

Bu tizimda fonda bir nechta narsalar sodir bo'ladi. Harorat ma'lumotlari arduino va pyton tomonidan to'planadi va qayd qilinadi, Matlab telefoningizdan GPS ma'lumotlarini yig'adi va sizning uyingizdan qanchalik uzoqda ekanligingizni bilish uchun hisob -kitoblarni amalga oshiradi va bu ma'lumotlarga asoslanib termostatni o'rnatadi. Siz kirgan joy sizning afzalliklaringizni taqdim etadi.

Matlab GUI kodini ishga tushiring.. Mlapp faylini oching va birinchi tabga qarang. Buning uchun ma'lumotni o'zingiz to'plashingiz kerak bo'ladi, odatda isitish/sovutish moslamasining samaradorligi va quvvat ko'rsatkichini qurilmaning o'zida topish mumkin, va sizning o'rtacha tezligingiz - siz mashinani qanchalik tez haydashingizni yaxshi baholaydi. Qiymatlar kiritilgandan so'ng, "Diagnostikani ishga tushirish" tugmasini bosing va dastur sizning uyingiz haqida ma'lumot to'plash uchun termostatni boshqaradi.

Keyingi menyuga o'ting.

7 -qadam: haroratni nazorat qilish

Haroratni nazorat qilish
Haroratni nazorat qilish

Bu menyu sizga uy sharoitida ham, tashqarida ham istalgan haroratni tanlash imkonini beradi. Harorat #1 ni o'zingizga qulay haroratga, No2 haroratni esa uyingiz uchun xavfsiz bo'lgan yuqori yoki past qiymatga qo'ying (uyda itlar bo'lsa, uni 100 darajaga qo'ymasligingizga ishonch hosil qiling).

8 -qadam: Tarixiy ma'lumotlar

Tarixiy ma'lumotlar
Tarixiy ma'lumotlar

Nihoyat, avtomatik boshqaruv yordamida qancha pul tejashingizni ko'rishingiz mumkin. Bu, agar sizning termostatingiz 24/7 siz istagan haroratga o'rnatilsa, qancha energiya sarflanishini taxmin qiladi, so'ngra ishlatilgan haqiqiy energiyani olib tashlaydi.

Qurilishda omad.

Tavsiya: