جدول المحتويات:

أوتوستات: ترموستات عن بعد: 8 خطوات (بالصور)
أوتوستات: ترموستات عن بعد: 8 خطوات (بالصور)

فيديو: أوتوستات: ترموستات عن بعد: 8 خطوات (بالصور)

فيديو: أوتوستات: ترموستات عن بعد: 8 خطوات (بالصور)
فيديو: اغنيه اجنبيه روعه سيتو سيتو ابي طاهر. لا تنسو الاشتراك واللايك فديتكم 2024, يوليو
Anonim
أوتوستات: ترموستات عن بعد
أوتوستات: ترموستات عن بعد

ربما يكون السؤال الذي تطرحه هو "لماذا تقوم بعمل ترموستات آخر عن بعد؟"

الإجابة على هذا السؤال هي أنني اضطررت لذلك ، وأجهزة تنظيم الحرارة الذكية في السوق باهظة الثمن.

تحذير عادل ، هذا هو بناء "إثبات المفهوم" الذي يتطلب بعض المخرجات الإضافية للتحكم الفعلي في منظم الحرارة الخاص بك ، ولكن النواة في مكانها ويمكن تعديلها وفقًا لظروفك الخاصة. أيضًا ، لا يزال هذا العمل قيد التقدم ، لذا توقع بعض التحديثات والتغييرات (خاصة في كود Matlab)

للبدء ، أريد أن أحذرك ، هذا يتطلب ثلاثة برامج (أحدها مكلف للغاية) ، وعدد قليل من المكتبات وحزم الدعم للبرامج ، ويجب أن تجعلهم جميعًا يتحدثون مع بعضهم البعض. إنه صداع. مع هذا التحذير بعيدًا عن الطريق ، فلنبدأ في استخدام المواد.

المعدات

  • اردوينو نانو
  • اردوينو أونو (أو نانو آخر ، لقد استخدمت أونو للتو لأنني كنت أمتلك واحدة حولها)
  • كبلات توصيل متنوعة ، بعض الذكور / الذكور ومجموعتين من ثلاثة وصلات وصل ذكر / أنثى
  • جهاز استقبال تردد الراديو (RF) 433 ميجاهرتز ، استخدمت MX-05V
  • جهاز إرسال RF 433MHz ، استخدمت MX-FS-03V
  • مقياس حرارة DHT11 عالي الدقة ومستشعر الرطوبة (الذي استخدمته مثبتًا على شريحة ثلاثية الشقوق مع تثبيت المقاومات المطلوبة بالفعل)
  • اللوح (إذا كنت لا تريد لحام كل هذا معًا)
  • هاتف مزود بنظام تحديد المواقع العالمي (GPS) (iPhone 8 في هذه الحالة ، لكنني استخدمت أيضًا Galaxy S8)
  • حاوية مطبوعة ثلاثية الأبعاد (ليست ضرورية حقًا ، ستعمل أي حاوية أو لا تعمل على الإطلاق)

برمجة

  • Matlab من MathWorks (لدي إصدار 2018a ، لكنني استخدمت إصدارات 2017a-b أيضًا)
  • ماتلاب موبايل مثبتة على هاتفك
  • حزمة دعم اردوينو لماتلاب
  • حزمة مستشعر iPhone لـ Matlab
  • اردوينو IDE
  • حزم دعم RadioHead ومكتبات اردوينو IDE
  • مكتبة DHT11 لـ arduino IDE
  • python 3.7 (تأكد من تثبيت مكتبة pyserial أو مكتبة تسلسلية ، والتي يجب أن تكون للإصدار 3.4 أو أحدث)

الخطوة 1: وضع كل ذلك معًا

ضع كل شيء معا
ضع كل شيء معا
ضع كل شيء معا
ضع كل شيء معا
ضع كل شيء معا
ضع كل شيء معا

بادئ ذي بدء ، أود أن أقترح عليك القيام ببعض دروس اردوينو التي تتعامل مع أجهزة إرسال الترددات اللاسلكية فقط للتأكد من أن أجزائك تعمل وأن الأسلاك صحيحة. هناك الكثير من الأمثلة المتاحة ، مع تضمين الكود (لأولئك منا الذين لا يعرفون شيئًا عن C و C ++).

اتبع مخططات الأسلاك أدناه لتجميع اردوينو وأجهزة الاستشعار. هناك شيء واحد يجب مراعاته أثناء توصيل الأسلاك في اردوينو وهو أن منافذ البيانات التي استخدمتها ليست مطلوبة ولكن يوصى بها.

إذا قررت تغيير منافذ البيانات التي تستخدمها ، فأنت تحتاج فقط إلى تحديد المسامير في التعليمات البرمجية الخاصة بك. أنا شخصياً أعتقد أنه من الأسهل الالتزام بالمنافذ الافتراضية التي تتعرف عليها مكتبات arduino.

ولكي أكون واضحًا ، يمكن استبدال nano و uno ، لكنني استخدمت النانو لجانب جهاز الإرسال في المشروع لتقليل حجم جهاز مراقبة درجة الحرارة.

ملاحظة جانبية: الأداة الخضراء التي تحمل النانو هي الحاوية المطبوعة ثلاثية الأبعاد.

الخطوة 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 mobile.

أنت الآن بحاجة إلى إنشاء مجلد في مكان ما على جهاز الكمبيوتر الخاص بك لإيواء ملفات كود Matlab. سيكون لديك أربعة ملفات منفصلة ، اثنان لوظائف الخلفية (ملفات.m) وملف كود Matlab واحد لواجهة المستخدم الرسومية (.mlapp) ،.

الأول هو حساب كتلة الهواء في منزلك (وهذا يتيح لماتلاب معرفة الوقت المستغرق لتدفئة / تبريد منزلك)

الوظيفة [الكتلة] = CalcMass (T_ins ، P_out ، Chng_dir)

runCalc = 0 ؛ Tmp_start = T_ins ؛ time_start = الساعة ؛ time_end = 0 أثناء runCalc <= 1 if T_ins == (Tmp_start + (7 * Chng_dir)) time_end = الساعة ؛ PwrCntr = 0 ؛ runCalc = 0 ؛ آخر PwrCntr = P_out ؛ runCalc = runCalc + 0.1 end time_diag = time_end-time_start Mass = (P_out * time_diag) /7.035

والثاني:

الوظيفة [الطوابع الزمنية ، pwr_usage] = dist_cntrl (Lat_in ، Lon_in ، P_out ، r_pref ، السرعة ، T_pref ، الكتلة)

AutoStat = 1 ؛ أنا = 1 ؛ بينما AutoStat == 1 time_start = الساعة ؛ م = mobiledev ؛ t = csvread ('القيم. csv'، 0، 1) ؛ ر = ر (ط) ؛ الطوابع الزمنية = [0 ، 0 ، 0 ، 0 ، 0 ، 0] ؛ pwr_usage = 0 ؛ أنا = أنا + 1 ؛ تنسيق لونغ. صيغة٪ haversine لحساب المسافة بناءً على خط العرض و٪ 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)./ speed ؛ ٪ يحسب إعداد منظم الحرارة اللازم بناءً على إخماد الطاقة في مكيف الهواء والكتلة الهوائية للمنزل. calcTmp_set = ((- 1. * P_out. * time_rtn)./ (الكتلة. * (1.005))) + T_pref ؛ يحدد٪ ما إذا كان إعداد منظم الحرارة الحالي يحتاج إلى التغيير إذا كان مستديرًا (calcTmp_set) ~ = round (t) timeACon = clock؛ PwrCntr = P_out ؛ timeACon = timeACon + clock-time_start ؛ التكلفة = P_out * timeACon * rate ؛ else PwrCntr = 0 طوابع زمنية للنهاية (النهاية + 1 ، [1: 6]) = الساعة ؛ pwr_usage (end + 1، 1) = PwrCntr ؛ وقفة (5) نهاية

كل من هذه الملفات هي وظائف ماتلاب. لن تحتاج إلى الوصول إليها إلا إذا كنت تخطط لتعديلها لاحتياجات معينة ، حيث ستطلبها من واجهة المستخدم الرسومية. احفظ كلا الملفين بشكل منفصل ، الأول باسم CalcMass.m والثاني باسم dist_cntrl.m ، وستكون هذه الأسماء التي يستخدمها رمز واجهة المستخدم الرسومية لاستدعاء الوظائف ، لذلك ما لم ترغب في تحرير بقية الكود أدناه ، فالتزم اصطلاح التسمية.

قبل الدخول إلى رمز واجهة المستخدم الرسومية ، تحتاج إلى فتح مصمم التطبيق لـ 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. 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. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditings.

الأساليب (الوصول = خاص)

٪ قيمة تغيرت الوظيفة: tempnow

دالة tempnowValueChanged (تطبيق ، حدث) temp = app.tempnow. Value ؛ temp = randi ([60، 90]، 1، 50) app. Gauge. Value = 0 for i = length (temp) app. Gauge. Value = temp (i) pause (1) end end

٪ وظيفة تغيرت القيمة: درجة الحرارة اتجاه التبديل

الوظيفة TemperatureDirectionSwitchValueChanged (التطبيق ، الحدث) الطريقة = app. TemperatureDirectionSwitch. Value ؛ way = uint8 (way) way = length (way) إذا كان الطريق == 4 Chng_dir = -1 ؛ آخر Chng_dir = 1 ؛ نهاية Chng_dir ؛ نهاية

٪ وظيفة تغيير القيمة: DDFH

الوظيفة DDFHValueChanged (التطبيق ، الحدث) r_pref = app. DDFH. Value ؛ نهاية

النسبة المئوية لوظيفة تغيير القيمة: AvgLocalSpeedEditField

الوظيفة AvgLocalSpeedEditFieldValueChanged (التطبيق ، الحدث) السرعة = app. AvgLocalSpeedEditField. Value ؛ نهاية

وظيفة تغيير القيمة٪: PowerOutputRatingEditField

الدالة PowerOutputRatingEditFieldValueChanged (التطبيق ، الحدث) القيمة = app. PowerOutputRatingEditField. Value ؛ نهاية

النسبة المئوية للوظيفة المتغيرة القيمة: EnergyEfficiencyRatingEditField

دالة EnergyEfficiencyRatingEditFieldValueChanged (التطبيق ، الحدث) القيمة = app. EnergyEfficiencyRatingEditField. Value ؛ نهاية

٪ وظيفة الضغط على الزر: RunDiagnosticButton

الدالة RunDiagnosticButtonPushed (التطبيق ، الحدث) way = app. TemperatureDirectionSwitch. Value ؛ way = uint8 (way) way = length (way) إذا كان الطريق == 4 Chng_dir = -1 ؛ آخر Chng_dir = 1 ؛ end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins، P_out، Chng_dir)

نهاية

٪ وظيفة تغيرت القيمة: درجة الحرارة 1 سبينر

دالة Temperature1SpinnerValueChanged (التطبيق ، الحدث) القيمة = app. Temperature1Spinner. Value ؛ نهاية

٪ وظيفة تغيرت القيمة: درجة الحرارة 2 سبينر

دالة Temperature2SpinnerValueChanged (التطبيق ، الحدث) القيمة = app. Temperature2Spinner. Value ؛ نهاية

٪ وظيفة تغيرت القيمة: التبديل

وظيفة 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 ؛ السرعة = app. AvgLocalSpeedEditField. Value ؛ Auto_Stat = app. Switch. Value ؛ نهاية dist_cntrl (Lat_in ، Lon_in ، P_out ، r_pref ، T_pref ، السرعة ، الكتلة) نهاية

٪ تهيئة التطبيق والبناء

الأساليب (الوصول = خاص)

٪ إنشاء UIF التكوين والمكونات

وظيفة createComponents (التطبيق)

٪ إنشاء UIFigure

app. UIFigure = uifigure ؛ app. UIFigure. Position = [100100640480] ؛ app. UIFigure. Name = 'UI Figure' ؛

٪ إنشاء TabGroup

app. TabGroup = uitabgroup (app. UIFigure) ؛ app. TabGroup. Position = [1 640480] ؛

٪ إنشاء علامة تبويب الإعداد

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 = 'bold' ؛ app. RunDiagnosticButton. Position = [465 78103 23] ؛ app. RunDiagnosticButton. Text = 'تشغيل التشخيص' ؛

٪ إنشاء EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab) ؛ app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'right' ؛ app. EnergyEfficiencyRatingEditFieldLabel. Position = [8425135 22] ؛ app. EnergyEfficiencyRatingEditFieldLabel. Text = "تصنيف كفاءة الطاقة" ؛

٪ إنشاء مجال كفاءة الطاقةRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab، 'numeric') ؛ app. EnergyEfficiencyRatingEditField. Limits = [0 100] ، app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app،EnergyEfficiencyRatingEditFieldValueChanged، true) ؛ app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'center' ؛ app. EnergyEfficiencyRatingEditField. Position = [158425 100 22] ؛

٪ إنشاء PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab) ؛ app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'right' ؛ app. PowerOutputRatingEditFieldLabel. Position = [18328118 22] ؛ app. PowerOutputRatingEditFieldLabel. Text = "تصنيف إخراج الطاقة" ؛

٪ إنشاء PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab، 'numeric') ؛ app. PowerOutputRatingEditField. Limits = [0 Inf] ؛ app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app،PowerOutputRatingEditFieldValueChanged، true) ؛ app. PowerOutputRatingEditField. HorizontalAlignment = 'center' ؛ app. PowerOutputRatingEditField. Position = [15328100 22] ؛

٪ قم بإنشاء AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab) ؛ app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'right' ؛ app. AvgLocalSpeedEditFieldLabel. Position = [27231 100 22] ؛ app. AvgLocalSpeedEditFieldLabel. Text = 'متوسط. السرعة المحلية '؛

٪ قم بإنشاء AvgLocalSpeedEditField

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab، 'numeric') ؛ app. AvgLocalSpeedEditField. Limits = [0 70] ، app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app،AvgLocalSpeedEditFieldValueChanged، true) ؛ app. AvgLocalSpeedEditField. HorizontalAlignment = 'center' ؛ app. AvgLocalSpeedEditField. Position = [142231100 22] ؛

٪ إنشاء DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab) ؛ app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'right' ؛ app. DesiredDistancefromHouseEditFieldLabel. Position = [24129100 28] ؛ app. DesiredDistancefromHouseEditFieldLabel. Text = {'المسافة المطلوبة'؛ "من البيت"}؛

٪ إنشاء DDFH

app. DDFH = uieditfield (app. SetupTab، 'numeric') ؛ app. DDFH. Limits = [0 50] ، app. DDFH. ValueChangedFcn = createCallbackFcn (app،DDFHValueChanged، true) ؛ app. DDFH. HorizontalAlignment = 'center' ؛ app. DDFH. Position = [139135100 22] ؛

٪ إنشاء درجة حرارة اتجاه سويتش

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab) ، app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'center' ؛ app. TemperatureDirectionSwitchLabel. Position = [410343 124 22] ؛ app. TemperatureDirectionSwitchLabel. Text = 'اتجاه درجة الحرارة' ؛

٪ إنشاء درجة الحرارة

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab ، 'شريط التمرير') ؛ app. TemperatureDirectionSwitch. Items = {'Up'، 'Down'} ؛ app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app،TemperatureDirectionSwitchValueChanged، true) ؛ app. TemperatureDirectionSwitch. Position = [449 380 45 20] ؛ app. TemperatureDirectionSwitch. Value = 'Up' ،

٪ إنشاء علامة التبويب TempSettings

app. TempSettingsTab = uitab (app. TabGroup) ، app. TempSettingsTab. Title = 'Temp. إعدادات'؛

٪ إنشاء درجة حرارة 1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab) ، app. Temperature1SpinnerLabel. HorizontalAlignment = 'center' ؛ app. Temperature1SpinnerLabel. Position = [66363 76 28] ؛ app. Temperature1SpinnerLabel. Text = {'درجة الحرارة' ، "# 1"} ؛

٪ خلق درجة حرارة 1Spinner

app. Temperature1Spinner = uispinner (app. TempSettingsTab) ، app. Temperature1Spinner. Limits = [60 90] ، app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (app، @ Temperature1SpinnerValueChanged، true) ؛ app. Temperature1Spinner. Position = [157346100 68] ؛ app. Temperature1Spinner. Value = 60 ؛

٪ إنشاء Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab) ، app. Temperature2SpinnerLabel. HorizontalAlignment = 'center' ؛ app. Temperature2SpinnerLabel. Position = [66248 76 28] ؛ app. Temperature2SpinnerLabel. Text = {'درجة الحرارة' ، "# 2"} ؛

٪ خلق درجة الحرارة 2Spinner

app. Temperature2Spinner = uispinner (app. TempSettingsTab) ، app. Temperature2Spinner. Limits = [60 90] ، app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (app، @ Temperature2SpinnerValueChanged، true) ؛ app. Temperature2Spinner. Position = [157230100 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 = 'نيالا' ؛ app. Switch. FontSize = 28 ؛ app. Switch. Position = [522 21 74 32] ؛ app. Switch. Value = '0' ؛

٪ إنشاء EditFieldLabel

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

٪ إنشاء tempnow

app.tempnow = uieditfield (app. TempSettingsTab، 'numeric') ؛ app.tempnow. Limits = [60 89] ، app.tempnow. ValueChangedFcn = createCallbackFcn (app،tempnowValueChanged، true) ؛ app.tempnow. HorizontalAlignment = 'center' ؛ app.tempnow. FontSize = 26 ؛ app.tempnow. Position = [409 230133117] ؛ app.tempnow. Value = 60 ؛

٪ إنشاء GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab) ؛ app. GaugeLabel. HorizontalAlignment = 'center' ؛ app. GaugeLabel. Position = [225 32 42 22] ؛ app. GaugeLabel. Text = 'مقياس' ؛

٪ إنشاء مقياس

app. Gauge = uigauge (app. TempSettingsTab ، 'دائري') ؛ app. Gauge. Limits = [60 90] ؛ app. Gauge. MajorTicks = [60 65 70 75 80 85 90] ؛ app. Gauge. Position = [185 69120120] ؛ app. Gauge. Value = 60 ؛

٪ إنشاء SavingsTab

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 = [146819348 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، 'numeric') ؛ 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 = 'right' ؛ app. TotalSavingsEditFieldLabel. Position = [111 96 77 22] ؛ app. TotalSavingsEditFieldLabel. Text = "إجمالي المدخرات" ؛

٪ إنشاء TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab، 'numeric') ؛ app. TotalSavingsEditField. Limits = [0 Inf] ؛ app. TotalSavingsEditField. ValueDisplayFormat = '$٪ 9.2f' ؛ app. TotalSavingsEditField. HorizontalAlignment = 'center' ؛ app. TotalSavingsEditField. Position = [88 39 137 58] ؛ نهاية النهاية

الأساليب (الوصول = عام)

٪ بناء التطبيق

تطبيق الوظيفة = Control_1

٪ إنشاء وتكوين المكونات

createComponents (app)

٪ تسجيل التطبيق مع مصمم التطبيق

RegisterApp (التطبيق ، app. UIFigure)

إذا نارجوت == 0

نهاية التطبيق واضحة

النسبة المئوية للرمز الذي يتم تنفيذه قبل حذف التطبيق

وظيفة حذف (التطبيق)

٪ حذف UIFigure عند حذف التطبيق

حذف (app. UIFigure) نهاية نهاية

من المحتمل أن تحصل على خطأ ، وهو ما لا يمثل مشكلة. ما عليك سوى إغلاق واجهة المستخدم الرسومية التي تم إنشاؤها بعد الضغط على التشغيل ، وسنقوم بجمع بقية البرامج والبيانات الضرورية في لحظة.

منذ إنشاء Matlab ، يمكننا الانتقال إلى Python. أولاً ، قم بتشغيل برنامج python إما من موجه الأوامر (في Windows) أو باستخدام ملف exe. في مجلد python. تأكد من تثبيت جميع المكتبات المناسبة باستخدام الأمر import.

استيراد المسلسل

استيراد وقت الاستيراد CSV

هذه هي المكتبات الثلاث التي ستحتاج إليها للبدء ، على الرغم من أننا سننشئ مكتبتنا الخاصة قريبًا. إذا كان هناك نوع من الخطأ في هذه الأوامر ، فارجع وتأكد من تثبيت المكتبات وأنها موجودة في مجلد Lib في مجلد python. بعد ذلك سنقوم بإنشاء ما أسميته مكتبة pythonlogger. هذا الاسم ليس ضروريًا ، يمكنك تسميته ما تريد ، إنه مجرد اسم ملف python (.py) الذي تقوم بإنشائه.

افتح محرر نصوص ، أستخدم Sublime3 لكن المفكرة تعمل بشكل جيد ، وأدخل هذا الرمز.

def pythonprint ():

استيراد pythonlogger استيراد وقت الاستيراد التسلسلي استيراد csv ser = serial. Serial ('COM8') # COM8 هو منفذ اردوينو التسلسلي ، من المحتمل أن يكون هذا مختلفًا لكل مستخدم ، أي تحقق من المنفذ التسلسلي في arduino IDE ser.flushInput () أثناء صواب: جرب: ser_bytes = ser.readline () print (ser_bytes) مع open ("test_data.csv"، "a") كـ f: Writer = csv.writer (f، delimiter = "،") # يعين البيانات على يتم إدخالها على هيئة كاتب وكاتب مفصول بفواصل ([time.time ()، ser_bytes]) # يكتب البيانات إلى test_data.csv باستثناء: طباعة ("حدث خطأ") فاصل

احفظ النص باسم "أدخل اسم المكتبة التي تريدها".py في مجلد Lib. لاحظ أيضًا أن سطر def pythonprint () يحدد اسم الوظيفة التي ستقوم باستدعائها ، لذا يمكنك تغيير ذلك لتعريف "أدخل الاسم الذي تريده لوظيفتك" (). عندما يتم حفظ المكتبة ، يمكننا الانتقال إلى كود اردوينو.

افتح اردوينو IDE وافتح نافذتين جديدتين للرسم. احفظ ملفي الرسم في مكان ما مناسب ، لا يهم اسم هذين الملفين. ثم احذف كل التعليمات البرمجية الافتراضية واستبدلها بما يلي.

بالنسبة للاردوينو المستلم:

#يشمل

# تضمين # تضمين # تضمين // لم يتم استخدام هذا ولكن هناك حاجة لتجميع برنامج تشغيل RH_ASK ؛ هيكل البيانات الهيكل {float temp؛ }بياناتي؛ إعداد باطل () {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)) // Non-blocking {int i؛ // تم استلام رسالة بمجموع اختباري جيد ، قم بتفريغها. //driver.printBuffer("Got: "، buf، buflen) ؛ memcpy (& myData، buf، sizeof (myData)) ؛ Serial.println ("") ؛ Serial.print (myData.temp) ؛ }}

ملاحظة. // driver.printBuffer…. الخط هو رمز الاختبار. لا داعي للقلق بشأن ذلك ما لم تقم بإجراء التشخيصات وترغب في معرفة ما إذا كنت تتلقى بيانات بالفعل.

لجهاز الإرسال اردوينو

#يشمل

# تضمين # تضمين # تضمين // لم يتم استخدام هذا ولكن هناك حاجة إلى تجميع # include #include int pin = 4 ؛ DHT11 dht11 (دبوس) ؛ سائق RH_ASK ؛ هيكل البيانات الهيكل {float temp؛ }بياناتي؛ بايت tx_buf [sizeof (myData)] = {0} ؛ // لذا فإن الوسيطات هي معدل البت ، ودبوس الإرسال (tx) ، و / / استقبال الدبوس (rx) ، و ppt pin ، و isInverse. لم يتم استخدام آخر 2.void setup () {Serial.begin (9600)؛ // التصحيح فقط إذا (! driver.init ()) Serial.println ("فشل init") ؛ } حلقة فارغة () {int err؛ تعويم درجة الحرارة ، هومي ؛ uint8_t msg؛ إذا ((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) ؛ // انتظر ثانيتين}}

يجب أن تكون أوامر التضمين كافية ، ولكن إذا واجهتك أية مشكلات لاحقًا في نقل البيانات ، فقد ترغب في البحث في مجلد مكتبة RadioHead وتضمين باقي أسماء الملفات ، بنفس التنسيق.

الخطوة الخامسة: إنجاحها

جعلها تعمل
جعلها تعمل
جعلها تعمل
جعلها تعمل
جعلها تعمل
جعلها تعمل

الآن بعد أن أصبح لدينا كل الكود معًا وتجميع اردوينو ، يمكننا توصيل اردوينو بجهاز الكمبيوتر الخاص بك وتحميل الكود. تأكد من إرسال الرمز الصحيح إلى ميكروكنترولر الاستقبال والإرسال. يمكنك توصيل كل من اردوينو بجهاز الكمبيوتر الخاص بك أثناء تشغيله ولكن سيتعين عليك التأكد من تحديد المنفذ الصحيح للمضي قدمًا ، أو يمكنك فصل اردوينو الإرسال وتشغيله من مصدر آخر بمجرد أن يتم تشغيل الكود. تم الرفع.

عند الحديث عن ذلك ، يجب عليك تحديد المنفذ المتصل بـ arduino المستلم من قائمة أدوات IDE الآن وتشغيل python.

لا تفتح الشاشة التسلسلية أثناء قيامك بذلك ، فلن يتمكن بيثون من قراءة المسلسل أثناء فتح الشاشة. بمجرد فتح python ، اتصل بوظيفة pythonprint على النحو التالي.

pythonlogger.pythonprint ()

سيبدأ هذا في جمع البيانات من منفذ اردوينو التسلسلي. إذا فتحت مجلد python الآن ، فسترى أنه قد تم إنشاء ملف.csv جديد يسمى "test_data.csv" ، والذي يحتفظ بجميع معلومات الوقت ودرجة الحرارة. سيكون هذا هو الملف الذي يصل إليه Matlab للقيام بجميع حساباته وعناصر التحكم فيه.

تحذير آخر: لا تفتح test_data.csv أثناء الوصول إلى البيانات أو كتابتها. إذا قمت بذلك ، فسوف يتعطل Python و / أو رمز Matlab ويرسل خطأ

إذا قررت فتح ملف.csv لاحقًا ، فستلاحظ أن عمود الوقت هو مجرد سلسلة كبيرة جدًا من الأرقام. وذلك لأن الأمر time.time () يكتب عدد الثواني منذ الأول من يناير 1970.

في هذه المرحلة ، يجب أن يطبع بيثون بيانات درجة الحرارة التي يقرأها من المنفذ التسلسلي. يجب أن يبدو مثل:

ب'25.03 '/ ص / ن

لا تقلق بشأن الأحرف الإضافية ، فهارس كود Matlab للقيم الخمس الوسطى في العمود الثاني من ملف.csv.

الآن بعد أن تعمل جميع البرامج الداعمة ويتم جمع البيانات ، يمكننا البدء في جمع بيانات GPS من برنامج Matlab للهاتف المحمول الذي تم إعداده مسبقًا وتشغيل رمز Matlab GUI. بمجرد أن تكون في علامة تبويب المستشعر في Matlab mobile ، حدد GPS واضغط على زر البداية.

إذا كنت جديدًا على Matlab mobile ، فارجع إلى الخطوة 4 وانظر إلى لقطات الشاشة أعلاه. إذا كنت لا تزال تواجه مشكلات ، فتأكد من أنك متصل بالكمبيوتر الذي حددته سابقًا (في علامة تبويب الإعدادات) واستخدم الارتباط من الأمر "Connector on" للتحقق من اتصال Matlab بالإنترنت.

الخطوة السادسة: استخدام البرنامج

باستخدام البرنامج
باستخدام البرنامج

هناك العديد من الأشياء التي تحدث في الخلفية في هذا النظام. يتم جمع بيانات درجة الحرارة وتسجيلها بواسطة arduino و pyton ، تقوم Matlab بجمع بيانات GPS من هاتفك وإجراء العمليات الحسابية لمعرفة مدى بُعدك عن منزلك وإعداد منظم الحرارة بناءً على كل تلك المعلومات. من أين أتيت هو توفير تفضيلاتك.

قم بتشغيل كود Matlab GUI. افتح ملف.mlapp وانظر إلى علامة التبويب الأولى. ستحتاج إلى جمع المعلومات الخاصة بهذا الأمر بنفسك ، ويمكن عادةً العثور على كفاءة وتصنيف الطاقة لوحدة التدفئة / التبريد في الوحدة نفسها ، ومتوسط سرعتك هو مجرد تقدير جيد لمدى سرعة قيادتك. بمجرد إدخال القيم ، اضغط على زر "تشغيل التشخيص" ويتحكم البرنامج في منظم الحرارة الخاص بك لجمع معلومات حول منزلك.

انتقل إلى القائمة التالية.

الخطوة السابعة: التحكم في درجة الحرارة

التحكم في درجة الحرارة
التحكم في درجة الحرارة

تتيح لك هذه القائمة تحديد درجة الحرارة المفضلة لديك أثناء تواجدك في المنزل وخارجه. اضبط درجة الحرارة رقم 1 على درجة حرارتك المريحة ، ودرجة الحرارة رقم 2 على قيمة عالية أو منخفضة آمنة لمنزلك (تأكد من عدم ضبطها على 100 درجة بينما لديك كلاب في المنزل ، وما إلى ذلك).

الخطوة 8: البيانات التاريخية

البيانات التاريخية
البيانات التاريخية

أخيرًا ، يمكنك مشاهدة مقدار الأموال التي توفرها باستخدام التحكم التلقائي. يقدّر هذا بشكل أساسي مقدار الطاقة التي سيتم استخدامها إذا تم ضبط منظم الحرارة على درجة الحرارة المفضلة لديك على مدار الساعة طوال أيام الأسبوع ، ثم يطرح الطاقة الفعلية المستخدمة.

حظا سعيدا في البناء.

موصى به: