Table des matières:

Autostat : un thermostat à distance : 8 étapes (avec photos)
Autostat : un thermostat à distance : 8 étapes (avec photos)

Vidéo: Autostat : un thermostat à distance : 8 étapes (avec photos)

Vidéo: Autostat : un thermostat à distance : 8 étapes (avec photos)
Vidéo: Comment installer un thermostat intelligent Netatmo sur un poêle à granulés - Brico seb 2024, Juillet
Anonim
Autostat: un thermostat à distance
Autostat: un thermostat à distance

La question que vous vous posez probablement est « pourquoi fabriquez-vous un autre thermostat à distance ? »

La réponse à cette question est, je devais le faire, et les thermostats intelligents du marché sont trop chers.

Juste avertissement, il s'agit d'une construction de « preuve de concept » qui nécessiterait quelques sorties supplémentaires pour contrôler réellement votre thermostat, mais le noyau est en place et peut être modifié en fonction de vos circonstances spécifiques. De plus, il s'agit toujours d'un travail en cours, alors attendez-vous à quelques mises à jour et modifications (en particulier au code Matlab)

Pour commencer, je veux vous avertir, cela nécessite trois programmes (l'un d'eux est assez cher), un certain nombre de bibliothèques et de packages de support pour les programmes, et vous devez les faire tous se parler. C'est un mal de tête. Avec cet avertissement à l'écart, commençons avec les matériaux.

Matériel

  • arduino nano
  • arduino uno (ou un autre nano, je viens d'utiliser l'uno parce que j'en avais un qui traînait)
  • câbles de démarrage assortis, certains mâles/mâles et deux ensembles de trois cavaliers mâles/femelles joints
  • Récepteur radiofréquence (RF) 433MHz, j'ai utilisé le MX-05V
  • Émetteur RF 433MHz, j'ai utilisé le MX-FS-03V
  • Thermomètre et capteur d'humidité de haute précision DHT11 (celui que j'ai utilisé est installé sur une puce à trois broches avec les résistances requises déjà installées)
  • planche à pain (si vous ne voulez pas souder tout cela ensemble)
  • un téléphone avec GPS (iPhone 8 dans ce cas, mais j'ai aussi utilisé un Galaxy S8)
  • Conteneur imprimé en 3D (pas vraiment nécessaire, n'importe quel conteneur fonctionnera ou pas du tout)

Logiciel

  • Matlab de MathWorks (j'ai l'édition 2018a, mais j'ai également utilisé les éditions 2017a-b)
  • Matlab mobile installé sur votre téléphone
  • package de support arduino pour Matlab
  • Pack capteur iPhone pour Matlab
  • IDE arduino
  • Packages de support RadioHead et bibliothèques de l'IDE arduino
  • Bibliothèque DHT11 pour arduino IDE
  • python 3.7 (assurez-vous que la bibliothèque pyserial ou la bibliothèque série est installée, ce qui devrait être le cas pour la version 3.4 ou plus récente)

Étape 1: Tout assembler

Mettre tous ensemble
Mettre tous ensemble
Mettre tous ensemble
Mettre tous ensemble
Mettre tous ensemble
Mettre tous ensemble

Tout d'abord, je vous suggère de faire quelques tutoriels arduino traitant des émetteurs RF juste pour vous assurer que vos pièces fonctionnent et que le câblage est correct. Il y a beaucoup d'exemples disponibles, avec le code inclus (pour ceux d'entre nous qui ne connaissent pas ou peu le C et le C++).

Suivez les schémas de câblage ci-dessous pour assembler l'arduino et les capteurs. Une chose à garder à l'esprit lors du câblage des arduinos est que les ports de données que j'ai utilisés ne sont pas requis mais recommandés.

SI vous décidez de changer les ports de données que vous utilisez, il vous suffit de définir les broches dans votre code. Personnellement, je pense qu'il est plus facile de s'en tenir aux ports par défaut que les bibliothèques arduino reconnaissent.

Et juste pour être clair, le nano et uno sont interchangeables, mais j'ai utilisé le nano pour le côté émetteur du projet afin de réduire la taille du moniteur de température.

Remarque: l'engin vert contenant le nano est le conteneur imprimé en 3D.

Étape 2: récepteur

Destinataire
Destinataire

Étape 3: Émetteur

Émetteur
Émetteur

Étape 4: le code

Une fois le câblage terminé, vous devez exécuter tous les programmes et installer les bibliothèques (si vous ne l'avez pas déjà fait), je suppose que vous l'avez fait, vous devez démarrer Matlab et exécuter le package de support iPhone. Votre téléphone et Matlab doivent être sur le même réseau wifi à ce stade.

Dans la fenêtre de commande de Matlab, écrivez:

connecteur sur

Cela vous demandera d'entrer un mot de passe à cinq chiffres que vous utiliserez pour vous connecter sur votre iPhone. Assurez-vous de vous souvenir du mot de passe. Lorsque vous avez entré le mot de passe, Matlab affichera certaines informations, y compris votre adresse IP. Utilisez-le à l'étape suivante, qui provient des instructions du menu d'aide "Mise en route avec les capteurs" dans Matlab mobile.

  • Suivez ces étapes pour envoyer les données du capteur à MathWorks Cloud ou à un ordinateur:
  • Si vous envoyez des données de capteur à un ordinateur et s'il n'est pas déjà installé, téléchargez et installez le package de support MATLAB pour les capteurs Apple iOS dans MATLAB.
  • Connectez MATLAB Mobile à MathWorks Cloud ou à un ordinateur à l'aide des paramètres.
  • Créez un objet mobiledev dans MATLAB (sur votre ordinateur), par exemple: >> m = mobiledev
  • Sélectionnez un ou plusieurs capteurs et appuyez sur Démarrer.

Suivez ces étapes pour enregistrer les données du capteur localement sur votre appareil:

  • Sur l'écran Capteurs, sélectionnez les capteurs à partir desquels vous souhaitez collecter des données.
  • Sélectionnez Journal.
  • Appuyez sur le bouton Démarrer.
  • Lorsque vous avez terminé de collecter des données, appuyez sur le bouton Arrêter.
  • Dans la fenêtre contextuelle, entrez le nom du journal du capteur.
  • Répétez les étapes 1 à 5 si nécessaire.

Cette section sera mentionnée dans la partie 4, il n'est donc pas nécessaire de commencer à collecter des données pour le moment. Gardez simplement votre téléphone à portée de main et Matlab mobile prêt.

Vous devez maintenant créer un dossier quelque part sur votre ordinateur pour héberger les fichiers de code Matlab. Vous aurez quatre fichiers séparés, deux pour les fonctions d'arrière-plan (fichiers.m) et un fichier de code Matlab pour l'interface graphique (.mlapp),.

Le premier est le calcul de la masse de l'air dans votre maison (cela permet à Matlab de savoir combien de temps il faut pour chauffer/refroidir votre maison)

fonction [Masse]= CalcMass(T_ins, P_out, Chng_dir)

runCalc=0; Tmp_start=T_ins; time_start=horloge; time_end = 0 tandis que runCalc <= 1 if T_ins==(Tmp_start+(7*Chng_dir)) time_end=clock; PwrCntr = 0; runCalc=0; sinon PwrCntr = P_out; runCalc=runCalc+0.1 end end time_diag= time_end-time_start Mass=(P_out*time_diag)/7.035

Et le deuxième:

fonction [horodatages, pwr_usage]= dist_cntrl(Lat_in, Lon_in, P_out, r_pref, vitesse, T_pref, masse)

AutoStat = 1; je = 1; tandis que AutoStat == 1 time_start=clock; m = mobiledev; t = csvread('valeurs.csv', 0, 1); t= t(i); horodatages= [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; format longg; Formule %haversine pour calculer la distance en fonction de la latitude et du %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; %estime votre temps pour retourner time_rtn=(Dist-r_pref)./speed; %calcule le réglage nécessaire du thermostat en fonction de la puissance de sortie du %climatiseur et de la masse d'air de la maison. calcTmp_set=((-1.*P_out.*time_rtn)./(masse.*(1.005))))+T_pref; %détermine si le réglage actuel du thermostat doit être modifié si round(calcTmp_set) ~= round(t) timeACon = clock; PwrCntr = P_out; timeACon= timeACon + clock-time_start; coût=P_out*timeACon*taux; sinon PwrCntr = 0 horodatage de fin (fin+1, [1:6]) = horloge; pwr_usage(end+1, 1)= PwrCntr; pause(5) fin fin

Ces deux fichiers sont des fonctions Matlab. Vous n'aurez pas besoin d'y accéder à moins que vous ne prévoyiez de les modifier pour des besoins spécifiques, puisque vous les appellerez à partir de l'interface graphique. Enregistrez les deux fichiers séparément, le premier sous CalcMass.m et le second sous dist_cntrl.m, ce seront les noms que le code GUI utilise pour appeler les fonctions, donc à moins que vous ne vouliez modifier le reste du code ci-dessous, restez avec la convention de nommage.

Avant d'entrer dans le code de l'interface graphique, vous devez ouvrir le concepteur d'applications pour Matlab, que vous pouvez ouvrir en naviguant dans la barre de menus Matlab, ou par ma méthode préférée qui consiste à saisir la commande suivante dans la fenêtre de commande Matlab:

concepteur d'applications

Une fois le concepteur d'application ouvert, ouvrez un nouveau fichier d'application (.mlapp) et supprimez tout le code par défaut de la fenêtre de code. Remplacez-le ensuite par ce qui suit et appuyez sur le bouton Exécuter.

classdef Control_1 < matlab.apps. AppBase % Propriétés qui correspondent aux propriétés des composants de l'application (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Button EnergyEfficiencyRatingEditFieldLabel matlab.ui.control. Label EnergyEfficiencyRatingEditField matlab.ui.control. NumericEditField PowerOutputRatingEditFieldLabel matlab.ui.control. Label PowerOutputRatingEditField matlab.ui.control. NumericEditField AvgtanceLocalSpeedFieldNi. 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 matlab. 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. Label Gauge matlab.ui.control. Jauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditFieldLabel matlab.ui.control. Label TotalSaving

méthodes (Accès = privé)

% Valeur modifiée fonction: tempnow

function tempnowValueChanged(app, event) temp = app.tempnow. Value; temp=randi([60, 90], 1, 50) app. Gauge. Value = 0 pour i = length(temp) app. Gauge. Value= temp(i) pause(1) end end

Fonction % valeur modifiée: TempératureDirectionSwitch

function TemperatureDirectionSwitchValueChanged(app, event) way = app. TemperatureDirectionSwitch. Value; way= uint8(way) way = length(way) if way == 4 Chng_dir = -1; sinon Chng_dir = 1; fin Chng_dir; finir

% Valeur modifiée fonction: DDFH

function DDFHValueChanged(app, event) r_pref = app. DDFH. Value; finir

Fonction % valeur modifiée: AvgLocalSpeedEditField

function AvgLocalSpeedEditFieldValueChanged(app, event) speed = app. AvgLocalSpeedEditField. Value; finir

Fonction % valeur modifiée: PowerOutputRatingEditField

function PowerOutputRatingEditFieldValueChanged(app, event) value = app. PowerOutputRatingEditField. Value; finir

Fonction % valeur modifiée: EnergyEfficiencyRatingEditField

function EnergyEfficiencyRatingEditFieldValueChanged(app, event) value = app. EnergyEfficiencyRatingEditField. Value; finir

% Fonction enfoncée par le bouton: RunDiagnosticButton

function RunDiagnosticButtonPushed(app, event) way = app. TemperatureDirectionSwitch. Value; way= uint8(way) way = length(way) if way == 4 Chng_dir = -1; sinon Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1(T_ins, P_out, Chng_dir)

finir

% Valeur modifiée fonction: Température1Spinner

fonction Température1SpinnerValueChanged (application, événement) valeur = app. Temperature1Spinner. Value; finir

% Valeur modifiée fonction: Température2Spinner

function Temperature2SpinnerValueChanged(app, event) value = app. Temperature2Spinner. Value; finir

% Valeur modifiée fonction: Commutateur

fonction SwitchValueChanged (application, événement) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; vitesse = m. Vitesse; masse = 200; vitesse = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl(Lat_in, Lon_in, P_out, r_pref, T_pref, vitesse, masse) fin fin

% Initialisation et construction de l'application

méthodes (Accès = privé)

% Créer UIFigure et composants

fonction createComponents (application)

% Créer UIFigure

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

% Créer un groupe d'onglets

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

% Créer l'onglet Configuration

app. SetupTab = uitab(app. TabGroup); app. SetupTab. Title = 'Configuration';

% Créer RunDiagnosticButton

app. RunDiagnosticButton = uibutton(app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn(app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'bold'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Exécuter le diagnostic';

% Créer EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel(app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'right'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Classification d'efficacité énergétique';

% Créer EnergyEfficiencyRatingEditField

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 = [158 425 100 22];

% Créer PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel(app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'right'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Power Output Rating';

% Créer 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 = [151 328 100 22];

% Créer AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel(app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'right'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Avg. Vitesse locale';

% Créer 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 = [142 231 100 22];

% Créer la distance souhaitée à partir de la maisonModifier l'étiquette du champ

app. DesiredDistancefromHouseEditFieldLabel = uilabel(app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'right'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Distance souhaitée'; 'de la maison'};

% Créer DDFH

app. DDFH = uieditfield(app. SetupTab, 'numeric'); app. DDFH. Limites = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn(app, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'center'; app. DDFH. Position = [139 135 100 22];

% Créer TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel(app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'center'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Direction de la température';

% Créer TempératureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch(app. SetupTab, 'slider'); app. TemperatureDirectionSwitch. Items = {'Up', 'Down'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn(app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Up';

% Créer l'onglet Paramètres temporaires

app. TempSettingsTab = uitab(app. TabGroup); app. TempSettingsTab. Title = 'Temp. Paramètres';

% Créer Température1SpinnerLabel

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

% Créer Température1Spinner

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

% Créer Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel(app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Temperature '; '#2'};

% Créer Température2Spinner

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

% Créer un commutateur

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

% Créer EditFieldLabel

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

% Créer 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 230 133 117]; app.tempnow. Value = 60;

% Créer une étiquette de jauge

app. GaugeLabel = uilabel(app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'center'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Gauge';

% Créer une jauge

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

Onglet % Créer des économies

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

% Créer des axes UIA

app. UIAxes = uiaxes(app. SavingsTab); title(app. UIAxes, 'Savings') xlabel(app. UIAxes, 'Month and Year') ylabel(app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0.6066666666666667 0.606666666666667]; app. UIAxes. Color = [0.9412 0.9412 0.9412]; app. UIAxes. Position = [146 219 348 237];

% Créer cemoisCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel(app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'center'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Coût du mois';

% Créer ceMoisCostModifierChamp

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];

% Créer des économies totalesModifierChampÉtiquette

app. TotalSavingsEditFieldLabel = uilabel(app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'right'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Total Savings';

% Créer des économies totalesModifier le champ

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]; fin fin

méthodes (Accès = public)

% Construire l'application

application de fonction = Control_1

% Créer et configurer des composants

créer des composants (application)

% Enregistrez l'application avec App Designer

registerApp(app, app. UIFigure)

si nargout == 0

effacer la fin de l'application

% de code qui s'exécute avant la suppression de l'application

fonction supprimer (application)

% Supprimer UIFigure lorsque l'application est supprimée

supprimer(app. UIFigure) fin fin fin

Vous obtiendrez probablement une erreur, ce qui n'est pas un problème. Fermez simplement l'interface graphique qui a été générée après avoir appuyé sur Exécuter, nous rassemblerons le reste des programmes et des données nécessaires dans un instant.

Depuis que Matlab est configuré, nous pouvons passer à python. Tout d'abord, exécutez le programme python à partir de votre invite de commande (sous Windows) ou en utilisant le fichier.exe dans votre dossier python. Assurez-vous que toutes les bibliothèques appropriées sont installées à l'aide de la commande import.

importer la série

heure d'importation importation csv

Ce sont les trois bibliothèques dont vous aurez besoin pour commencer, même si nous allons bientôt créer notre propre bibliothèque. S'il y avait une sorte d'erreur avec ces commandes, revenez en arrière et assurez-vous que les bibliothèques sont installées et se trouvent dans le dossier Lib du dossier python. Ensuite, nous allons générer ce que j'ai appelé la bibliothèque pythonlogger. Ce nom n'est pas nécessaire, vous pouvez l'appeler comme vous voulez, c'est juste le nom du fichier python (.py) que vous créez.

Ouvrez un éditeur de texte, j'utilise Sublime3 mais le bloc-notes fonctionne très bien et entrez ce code.

def pythonprint():

import pythonlogger import serial import time import csv ser = serial. Serial('COM8') # COM8 est le port série arduino, ce sera probablement différent pour chaque utilisateur, c'est-à-dire vérifiez votre port série dans l'arduino IDE ser.flushInput() pendant True: essayez: ser_bytes = ser.readline() print(ser_bytes) with open("test_data.csv", "a") as f:writer = csv.writer(f, delimiter=", ") # définit les données sur être entré comme écrivain séparé par des virgules.writerow([time.time(), ser_bytes]) #écrit les données dans test_data.csv sauf: print("Error Occured") break

Enregistrez le texte sous "insérez le nom de la bibliothèque que vous voulez".py dans le dossier Lib. Notez également que la ligne def pythonprint() définit le nom de la fonction que vous allez appeler, vous pouvez donc le changer en def "insérer le nom que vous voulez pour votre fonction"(). Lorsque la bibliothèque est enregistrée, nous pouvons passer au code arduino.

Ouvrez l'IDE Arduino et ouvrez deux nouvelles fenêtres d'esquisse. Enregistrez ces deux fichiers d'esquisse dans un endroit pratique, le nom de ces fichiers n'a pas d'importance. Supprimez ensuite tout le code par défaut et remplacez-le par le suivant.

Pour l'arduino récepteur:

#comprendre

#include #include #include // ceci n'est pas utilisé mais nécessaire pour compiler le pilote RH_ASK; struct dataStruct{ float temp; }mes données; void setup() { Serial.begin(9600); // Débogage uniquement si (!driver.init()) Serial.println("init failed"); } boucle vide() { uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof(buf); if (driver.recv(buf, &buflen)) // Non bloquant { int i; // Message avec une bonne somme de contrôle reçu, videz-le. //driver.printBuffer("Got:", buf, buflen); memcpy(&myData, buf, sizeof(myData)); Serial.println(""); Serial.print(myData.temp); } }

P. S. le //driver.printBuffer…. etc. la ligne est le code de test. Pas besoin de s'inquiéter à moins que vous ne fassiez des diagnostics et que vous vouliez savoir si vous recevez réellement des données.

Pour l'émetteur arduino

#comprendre

#include #include #include // ceci n'est pas utilisé mais nécessaire pour compiler#include #include int pin=4; DHT11 dht11 (broche); pilote RH_ASK; struct dataStruct{ float temp; }mes données; octet tx_buf[sizeof(myData)] = {0}; // Les arguments sont donc le débit binaire, la broche de transmission (tx), // la broche de réception (rx), la broche ppt, isInverse. Les 2 derniers ne sont pas utilisés.void setup() { Serial.begin(9600); // Débogage uniquement si (!driver.init()) Serial.println("init failed"); } boucle vide() { int err; température flottante, humi; uint8_t msg; if((err=dht11.read(humi, temp))==0) myData.temp = temp; memcpy(tx_buf, &myData, sizeof(myData)); octet zize=sizeof(myData); { Serial.println(myData.temp); driver.send((uint8_t *)tx_buf, zize); driver.waitPacketSent(); //arrêter l'exécution jusqu'à ce que toutes les données aient été envoyées delay(2000); //attendre 2 secondes } }

Les commandes d'inclusion devraient suffire, mais si vous rencontrez des problèmes ultérieurement avec le transfert de données, vous souhaiterez peut-être rechercher dans le dossier de la bibliothèque RadioHead et inclure le reste des noms de fichiers, dans le même format.

Étape 5: le faire fonctionner

Le faire fonctionner
Le faire fonctionner
Le faire fonctionner
Le faire fonctionner
Le faire fonctionner
Le faire fonctionner

Maintenant que nous avons tout le code ensemble et que l'arduino est assemblé, nous pouvons connecter l'arduino à votre ordinateur et charger le code. Assurez-vous d'envoyer le bon code aux microcontrôleurs de réception et de transmission. Vous pouvez avoir les deux arduino connectés à votre ordinateur pendant que cela fonctionne, mais vous devrez vous assurer que le bon port est sélectionné à l'avenir, ou vous pouvez déconnecter l'arduino de transmission et l'alimenter à partir d'une autre source une fois que le code est téléchargé.

En parlant de cela, vous devez maintenant sélectionner le port qui est connecté à votre arduino de réception dans le menu des outils IDE et exécuter python.

N'ouvrez pas le moniteur série pendant que vous faites cela, python ne peut pas lire la série lorsque le moniteur est ouvert. Une fois python ouvert, appelez la fonction pythonprint comme suit.

pythonlogger.pythonprint()

Cela démarrera la collecte de données à partir du port série arduino. Si vous ouvrez votre dossier python maintenant, vous verrez qu'un nouveau fichier.csv a été créé appelé "test_data.csv", qui contient toutes les informations de temps et de température. Ce sera le fichier auquel Matlab accédera pour effectuer tous ses calculs et contrôles.

Autre avertissement: n'ouvrez pas test_data.csv pendant l'accès ou l'écriture des données. Si vous le faites, le code python et/ou Matlab plantera et renverra une erreur

Si vous décidez d'ouvrir le fichier.csv plus tard, vous remarquerez que la colonne de temps n'est qu'une très grande chaîne de nombres. C'est parce que la commande time.time() écrit le nombre de secondes depuis le 1er janvier 1970.

À ce stade, python devrait imprimer les données de température qu'il lit à partir du port série. Cela devrait ressembler à quelque chose comme:

b'25.03'/r/n

Ne vous inquiétez pas pour les caractères supplémentaires, le code Matlab indexe les cinq valeurs du milieu dans la deuxième colonne du fichier.csv.

Maintenant que tous les programmes de support fonctionnent et que les données sont collectées, nous pouvons commencer à collecter des données GPS à partir du programme mobile Matlab qui a été configuré précédemment et exécuter le code de l'interface graphique Matlab. Une fois que vous êtes dans l'onglet capteur de Matlab mobile, sélectionnez GPS et appuyez sur le bouton de démarrage.

Si vous êtes nouveau sur Matlab mobile, reportez-vous à l'étape 4 et regardez les captures d'écran ci-dessus. Si vous rencontrez toujours des problèmes, assurez-vous que vous êtes connecté à l'ordinateur que vous avez sélectionné précédemment (dans l'onglet Paramètres) et utilisez le lien de la commande "connecteur activé" pour vérifier que Matlab est en ligne.

Étape 6: Utilisation du programme

Utilisation du programme
Utilisation du programme

Il y a plusieurs choses qui se passent en arrière-plan dans ce système. Les données de température sont collectées et enregistrées par arduino et pyton, Matlab collecte les données GPS de votre téléphone et effectue des calculs pour voir à quelle distance vous êtes de votre maison et régler votre thermostat en fonction de toutes ces informations. L'endroit où vous entrez indique vos préférences.

Exécutez le code de l'interface graphique Matlab. Ouvrez le fichier.mlapp et regardez le premier onglet. Vous devrez rassembler les informations vous-même, l'efficacité et la puissance nominale de votre unité de chauffage/refroidissement peuvent généralement être trouvées sur l'unité elle-même, et votre vitesse moyenne n'est qu'une bonne estimation de la vitesse à laquelle vous conduisez. Une fois les valeurs saisies, appuyez sur le bouton « Exécuter le diagnostic » et le programme contrôle votre thermostat pour recueillir des informations sur votre maison.

Passez au menu suivant.

Étape 7: Contrôle de la température

Contrôle de la température
Contrôle de la température

Ce menu vous permet de sélectionner votre température préférée pendant que vous êtes à la maison ou à l'extérieur. Réglez la température n°1 sur votre température confortable et la température n°2 sur une valeur élevée ou basse qui est sans danger pour votre maison (assurez-vous de ne pas la régler à 100 degrés pendant que vous avez des chiens à la maison, etc.).

Étape 8: Données historiques

Données historiques
Données historiques

Enfin, vous pouvez voir combien d'argent vous économisez en utilisant le contrôle automatique. Cela estime essentiellement la quantité d'énergie qui serait utilisée si votre thermostat était réglé sur votre température préférée 24h / 24 et 7j / 7, puis soustrait votre énergie réelle utilisée.

Bonne chance pour la construction.

Conseillé: