جدول المحتويات:
- الخطوة 1: وضع كل ذلك معًا
- الخطوة 2: جهاز الاستقبال
- الخطوة 3: جهاز الإرسال
- الخطوة 4: الكود
- الخطوة الخامسة: إنجاحها
- الخطوة السادسة: استخدام البرنامج
- الخطوة السابعة: التحكم في درجة الحرارة
- الخطوة 8: البيانات التاريخية
فيديو: أوتوستات: ترموستات عن بعد: 8 خطوات (بالصور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:40
ربما يكون السؤال الذي تطرحه هو "لماذا تقوم بعمل ترموستات آخر عن بعد؟"
الإجابة على هذا السؤال هي أنني اضطررت لذلك ، وأجهزة تنظيم الحرارة الذكية في السوق باهظة الثمن.
تحذير عادل ، هذا هو بناء "إثبات المفهوم" الذي يتطلب بعض المخرجات الإضافية للتحكم الفعلي في منظم الحرارة الخاص بك ، ولكن النواة في مكانها ويمكن تعديلها وفقًا لظروفك الخاصة. أيضًا ، لا يزال هذا العمل قيد التقدم ، لذا توقع بعض التحديثات والتغييرات (خاصة في كود 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: البيانات التاريخية
أخيرًا ، يمكنك مشاهدة مقدار الأموال التي توفرها باستخدام التحكم التلقائي. يقدّر هذا بشكل أساسي مقدار الطاقة التي سيتم استخدامها إذا تم ضبط منظم الحرارة على درجة الحرارة المفضلة لديك على مدار الساعة طوال أيام الأسبوع ، ثم يطرح الطاقة الفعلية المستخدمة.
حظا سعيدا في البناء.
موصى به:
أصبح جهاز التحكم عن بعد في التلفزيون جهاز تحكم عن بعد بالتردد اللاسلكي -- NRF24L01 + البرنامج التعليمي: 5 خطوات (بالصور)
أصبح جهاز التحكم عن بعد في التلفزيون جهاز تحكم عن بعد بالتردد اللاسلكي || NRF24L01 + Tutorial: في هذا المشروع سأوضح لك كيف استخدمت nRF24L01 + RF IC لضبط سطوع شريط LED لاسلكيًا من خلال ثلاثة أزرار غير مجدية لجهاز التحكم عن بعد في التلفزيون. هيا بنا نبدأ
كيفية صنع ترموستات موقد خشبي أوتوماتيكي: 5 خطوات (بالصور)
كيفية صنع ترموستات موقد خشبي أوتوماتيكي: بالنسبة لمشروع فئة الميكاترونكس الخاص بي ، قررت تصميم وإنشاء ترموستات أوتوماتيكي للموقد الخشبي باستخدام Arduino ممكّن من WiFi مع وحدة تحكم PID تقود محرك متدرج للتحكم في موضع المثبط في موقد الخشب الخاص بي. لقد كان مكافأة كبيرة
مسجل بيانات محفوظات ترموستات من Nest: 6 خطوات (بالصور)
مسجل بيانات تاريخ Nest Thermostat: يتتبع منظم الحرارة من Nest درجة الحرارة والرطوبة واستخدام الفرن / مكيف الهواء ويمكن للمستخدمين رؤية البيانات التاريخية لمدة 10 أيام فقط. كنت أرغب في جمع البيانات التاريخية (& GT ؛ أيام 10) ووجدت نصًا برمجيًا لجداول البيانات من Google يقوم باختبار الاتصال في كل وقت محدد
قم بتحويل جهاز التحكم عن بعد IR الخاص بك إلى جهاز التحكم عن بعد RF: 9 خطوات (بالصور)
قم بتحويل جهاز التحكم عن بعد IR الخاص بك إلى جهاز التحكم عن بعد RF: في Instructable اليوم ، سأوضح لك كيف يمكنك استخدام وحدة RF العامة بدون وحدة تحكم دقيقة والتي ستقودنا في النهاية إلى بناء مشروع حيث يمكنك تحويل IR Remote لأي جهاز إلى RF بعيد. الميزة الرئيسية لتحويل
إصدار كابل التحكم عن بُعد من Olympus Evolt E510 (الإصدار 2 مع التركيز التلقائي على جهاز التحكم عن بُعد): 6 خطوات (بالصور)
إصدار الكبل عن بُعد من Olympus Evolt E510 (الإصدار 2 مع التركيز التلقائي على جهاز التحكم عن بُعد): قمت بالأمس ببناء جهاز تحكم عن بعد بزر واحد بسيط لجهاز Olympus E510 الخاص بي. تحتوي معظم الكاميرات على زر تحرير الغالق (الزر الذي تضغط عليه لالتقاط صورة) الذي يحتوي على وضعين. إذا تم الضغط على الزر برفق ، فستقوم الكاميرا بالتركيز التلقائي وقياس الضوء