Table des matières:
- Étape 1: Tout assembler
- Étape 2: récepteur
- Étape 3: Émetteur
- Étape 4: le code
- Étape 5: le faire fonctionner
- Étape 6: Utilisation du programme
- Étape 7: Contrôle de la température
- Étape 8: Données historiques
Vidéo: Autostat : un thermostat à distance : 8 étapes (avec photos)
2024 Auteur: John Day | [email protected]. Dernière modifié: 2024-01-30 09:08
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
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
Étape 3: É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
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
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
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
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é:
Arrêter ou redémarrer à distance un ordinateur avec le périphérique ESP8266 : 10 étapes (avec photos)
Arrêter ou redémarrer à distance un ordinateur avec l'appareil ESP8266 : pour être clair ici, nous éteignons VOTRE ordinateur, pas l'ordinateur de quelqu'un d'autre. L'histoire se déroule comme ceci : tas de maths, mais tous les matins à 3 heures du matin, ils enferment. S
Détection de distance avec le Micro:bit et le sonar (module HC-SR04) : 3 étapes (avec photos)
Détection de distance avec le micro:bit et le sonar (module HC-SR04) : Cette semaine, j'ai passé du temps à jouer avec le fabuleux micro:bit de la BBC et un capteur sonique. J'ai essayé quelques modules différents (plus de 50 au total) et j'ai pensé que ce serait bien, alors partagez certains de mes résultats. Le meilleur module que j'ai trouvé jusqu'à présent est le Spar
Appareil de mesure de distance portable avec Arduino ! : 9 étapes (avec photos)
Appareil de mesure de distance portable avec Arduino ! : Au fur et à mesure que vous lisez ce Instructable, vous apprendrez à créer un capteur de proximité que vous pouvez utiliser pour mesurer les distances entre celui-ci et tout ce sur quoi vous le pointez. Il utilise PICO, la carte compatible Arduino et plusieurs autres pièces électroniques qui sont déjà
Vitesse de mesure au déversoir avec capteur de distance : 4 étapes (avec photos)
Mesure de la vitesse au déversoir avec capteur de distance : Nous avons fabriqué un appareil qui calcule la vitesse de l'eau sur un déversoir. Ceci est mesuré par deux capteurs de distance
Augmentez la distance effective sur l'émetteur de déclenchement à distance Flash « ebay » avec antenne : 6 étapes
Augmentez la distance effective sur l'émetteur de déclenchement à distance du flash « ebay » avec antenne : les amateurs d'appareils photo peuvent acheter des versions peu coûteuses de déclencheurs à distance pour les flashes externes, contrôlant des flashes de type sabot ou « studio ». Ces déclencheurs souffrent d'une faible puissance d'émission et donc d'une faible distance de contrôle effective. Ce mo