Índice:

Autostat: um termostato remoto: 8 etapas (com fotos)
Autostat: um termostato remoto: 8 etapas (com fotos)

Vídeo: Autostat: um termostato remoto: 8 etapas (com fotos)

Vídeo: Autostat: um termostato remoto: 8 etapas (com fotos)
Vídeo: Como usar o controle remoto do ar condicionado Elgin 2024, Julho
Anonim
Autostat: um termostato remoto
Autostat: um termostato remoto

A pergunta que você provavelmente está se perguntando é "por que está fazendo outro termostato remoto?"

A resposta a essa pergunta é: eu precisava, e os termostatos inteligentes do mercado são muito caros.

Aviso justo, esta é uma construção de "prova de conceito" que exigiria algumas saídas extras para realmente controlar seu termostato, mas o núcleo está no lugar e pode ser modificado dependendo de sua circunstância específica. Além disso, este ainda é um trabalho em andamento, então espere algumas atualizações e mudanças (especialmente para o código Matlab)

Para começar, quero avisá-lo, isso requer três programas (um deles é muito caro), algumas bibliotecas e pacotes de suporte para os programas, e você precisa que todos eles se comuniquem. É uma dor de cabeça. Com esse aviso esclarecido, vamos começar com os materiais.

Hardware

  • arduino nano
  • arduino uno (ou outro nano, acabei de usar o uno porque tinha um por perto)
  • cabos de jumper variados, alguns macho / macho e dois conjuntos de três jumpers macho / fêmea unidos
  • Receptor de radiofrequência (RF) 433MHz, usei o MX-05V
  • Transmissor RF 433MHz, usei o MX-FS-03V
  • Termômetro de alta precisão DHT11 e sensor de umidade (o que usei está instalado em um chip de três pinos com os resistores necessários já instalados)
  • placa de ensaio (se você não quiser soldar tudo junto)
  • um telefone com GPS (iPhone 8 neste caso, mas também usei um Galaxy S8)
  • Recipiente impresso em 3D (não é realmente necessário, qualquer recipiente funcionará ou nenhum)

Programas

  • Matlab da MathWorks (eu tenho a edição 2018a, mas também usei as edições 2017a-b)
  • Matlab mobile instalado no seu telefone
  • pacote de suporte arduino para Matlab
  • Pacote de sensor de iPhone para Matlab
  • IDE arduino
  • Pacotes de suporte RadioHead e bibliotecas do IDE arduino
  • Biblioteca DHT11 para IDE arduino
  • python 3.7 (certifique-se de que a biblioteca pyserial ou a biblioteca serial está instalada, o que deve ser para a versão 3.4 ou mais recente)

Etapa 1: juntando tudo

Juntando tudo
Juntando tudo
Juntando tudo
Juntando tudo
Juntando tudo
Juntando tudo

Em primeiro lugar, sugiro que você faça alguns tutoriais do Arduino sobre os transmissores RF apenas para ter certeza de que suas peças estão funcionando e a fiação está correta. Existem muitos exemplos disponíveis, com o código incluído (para aqueles de nós que sabem pouco ou nada sobre C e C ++).

Siga os diagramas de fiação abaixo para obter o arduino e os sensores montados. Uma coisa a ter em mente ao conectar os arduinos é que as portas de dados que usei não são obrigatórias, mas recomendadas.

SE você decidir mudar as portas de dados que você usa, você só precisa definir os pinos em seu código. Pessoalmente, acho que é mais fácil manter as portas padrão que as bibliotecas do arduino reconhecem.

E só para ficar claro, o nano e o uno são intercambiáveis, mas usei o nano para o lado do transmissor do projeto para reduzir o tamanho do monitor de temperatura.

Nota lateral: a engenhoca verde segurando o nano é o recipiente impresso em 3D.

Etapa 2: Receptor

Receptor
Receptor

Etapa 3: Transmissor

Transmissor
Transmissor

Etapa 4: O Código

Depois que a fiação estiver concluída, você precisa ter todos os programas em execução e as bibliotecas instaladas (se ainda não o fez), vou apenas assumir que você precisa iniciar o Matlab e executar o pacote de suporte do iPhone. Tanto o seu telefone quanto o Matlab precisam estar na mesma rede wi-fi neste momento.

Na janela de comando do Matlab escreva:

conector ligado

Isso solicitará que você insira uma senha de cinco dígitos que você usará para se conectar ao seu iPhone. Certifique-se de lembrar a senha. Depois de inserir a senha, o Matlab exibirá algumas informações, incluindo seu endereço IP. Use isso na próxima etapa, que vem das instruções do menu de ajuda "Getting started with sensores" no Matlab mobile.

  • Siga estas etapas para enviar dados do sensor para MathWorks Cloud ou um computador:
  • Se você estiver enviando dados do sensor para um computador e ainda não estiver instalado, baixe e instale o pacote de suporte MATLAB para sensores Apple iOS no MATLAB.
  • Conecte o MATLAB Mobile ao MathWorks Cloud ou a um computador usando Configurações.
  • Crie um objeto mobiledev no MATLAB (em seu computador), por exemplo: >> m = mobiledev
  • Selecione um ou mais sensores e toque em Iniciar.

Siga estas etapas para registrar dados do sensor localmente em seu dispositivo:

  • Na tela Sensores, selecione os sensores dos quais deseja coletar dados.
  • Selecione Log.
  • Toque no botão Iniciar.
  • Quando você terminar de coletar dados, toque no botão Parar.
  • No pop-up, digite o nome do registro do sensor.
  • Repita as etapas 1 a 5, se necessário.

Esta seção será consultada na Parte 4, portanto, não há necessidade de realmente iniciar a coleta de dados ainda. Basta manter o seu telefone à mão e pronto para o Matlab.

Agora você precisa criar uma pasta em algum lugar do seu computador para armazenar os arquivos de código do Matlab. Você terá quatro arquivos separados, dois para as funções de segundo plano (arquivos.m) e um arquivo de código Matlab para a GUI (.mlapp),.

O primeiro é o cálculo da massa para o ar em sua casa (isso permite ao Matlab saber quanto tempo leva para aquecer / resfriar sua casa)

função [Mass] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = clock; time_end = 0 enquanto runCalc <= 1 se T_ins == (Tmp_start + (7 * Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; senão PwrCntr = P_out; runCalc = runCalc + 0.1 end end time_diag = time_end-time_start Mass = (P_out * time_diag) /7.035

E o segundo:

função [timestamps, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, velocidade, T_pref, massa)

AutoStat = 1; i = 1; enquanto AutoStat == 1 time_start = clock; m = mobiledev; t = csvread ('valores.csv', 0, 1); t = t (i); carimbos de data / hora = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i + 1; format longg; Fórmula% haversine para calcular a distância com base na latitude e% longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)). ^ 2 + cosd (Lat_in). * cosd (m.latitude). * (sind (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; % estima seu tempo para retornar time_rtn = (Dist-r_pref)./ velocidade; % calcula a configuração do termostato necessária com base na saída de energia de% do ar condicionado e da massa de ar da casa. calcTmp_set = ((- 1. * P_out. * time_rtn)./ (mass. * (1.005))) + T_pref; % determina se a configuração atual do termostato precisa ser alterada se round (calcTmp_set) ~ = round (t) timeACon = clock; PwrCntr = P_out; timeACon = timeACon + clock-time_start; custo = P_out * timeACon * taxa; senão PwrCntr = 0 timestamps de término (end + 1, [1: 6]) = clock; pwr_usage (fim + 1, 1) = PwrCntr; pausa (5) fim fim

Ambos os arquivos são funções do Matlab. Você não precisará acessá-los, a menos que planeje modificá-los para necessidades específicas, uma vez que você os chamará a partir da GUI. Salve os dois arquivos separadamente, o primeiro como CalcMass.m e o segundo como dist_cntrl.m, esses serão os nomes que o código da GUI usa para chamar as funções, então, a menos que você queira editar o resto do código abaixo, fique com a convenção de nomenclatura.

Antes de entrar no código da GUI, você precisa abrir o app designer para Matlab, que você pode abrir navegando na barra de menu do Matlab ou pelo meu método favorito que é inserir o seguinte comando na janela de comando do Matlab:

appdesigner

Depois que o designer do aplicativo estiver aberto, abra um novo arquivo do aplicativo (.mlapp) e exclua todo o código padrão da janela de código. Em seguida, substitua tudo com o seguinte e aperte o botão Executar.

classdef Control_1 <matlab.apps. AppBase% Propriedades que correspondem às propriedades dos componentes do aplicativo (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. botão 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. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlab.ui.container. Tab Temperature1SpinnerLabel matlab.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. NumericEditField GaugeLabel matlab.ui.control. Label Gauge matlab.ui.control. Medidor SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditFieldLablabdit.control.control.

métodos (acesso = privado)

% Função alterada de valor: tempnow

function tempnowValueChanged (app, event) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 para i = comprimento (temp) app. Gauge. Value = temp (i) pausa (1) fim fim

% Função alterada do valor: TemperatureDirectionSwitch

function TemperatureDirectionSwitchValueChanged (app, event) way = app. TemperatureDirectionSwitch. Value; caminho = uint8 (caminho) caminho = comprimento (caminho) se caminho == 4 Chng_dir = -1; senão Chng_dir = 1; end Chng_dir; fim

% Função alterada de valor: DDFH

função DDFHValueChanged (app, evento) r_pref = app. DDFH. Value; fim

% Função alterada de valor: AvgLocalSpeedEditField

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

% Função alterada de valor: PowerOutputRatingEditField

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

% De função alterada: EnergyEfficiencyRatingEditField

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

% Função pressionada de botão: RunDiagnosticButton

function RunDiagnosticButtonPushed (app, event) way = app. TemperatureDirectionSwitch. Value; caminho = uint8 (caminho) caminho = comprimento (caminho) se caminho == 4 Chng_dir = -1; senão Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

fim

% Função alterada do valor: Temperature1Spinner

function Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; fim

% Função alterada do valor: Temperature2Spinner

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

% Função alterada de valor: Switch

função SwitchValueChanged (app, evento) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; velocidade = m. Speed; massa = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, velocidade, massa) fim

% Inicialização e construção do aplicativo

métodos (acesso = privado)

% Criar UIFigure e componentes

função createComponents (app)

% Criar UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Figura da interface do usuário';

% Criar TabGroup

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

% Criar SetupTab

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

% Create RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'negrito'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Executar diagnóstico';

% Criar EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'right'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Classificação de Eficiência Energética';

% Criar EnergyEfficiencyRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'numérico'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'center'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% Create PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'direito'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Classificação da potência de saída';

% Criar PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numérico'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'center'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% Create AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'direito'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Avg. Velocidade local ';

% Create AvgLocalSpeedEditField

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'numérico'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'center'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% Criar DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'right'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Distância desejada'; 'da casa'};

% Criar DDFH

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

% Create TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'center'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Direção da temperatura';

% Criar TemperatureDirectionSwitch

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

% Criar TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Definições';

% Criar Temperature1SpinnerLabel

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

% Criar Temperature1Spinner

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;

% Criar Temperature2SpinnerLabel

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

% Criar Temperature2Spinner

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;

% Criar Switch

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

% Create EditFieldLabel

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

% Criar tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'numérico'); 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;

% Criar GaugeLabel

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

% Criar Medidor

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

% Criar SavingsTab

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Poupança';

% Criar UIAxes

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Savings') xlabel (app. UIAxes, 'Mês e Ano') ylabel (app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0,606666666666667 0,60666666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];

% Create ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'center'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Custo deste mês';

% Create ThisMonthCostEditField

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

% Create TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'direito'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Poupança total';

% Create TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numérico'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$% 9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'center'; app. TotalSavingsEditField. Position = [88 39 137 58]; fim fim

métodos (acesso = público)

% Construir aplicativo

função app = Control_1

% Criar e configurar componentes

createComponents (app)

% Registre o aplicativo com o App Designer

registerApp (app, app. UIFigure)

se nargout == 0

limpar final de aplicativo

% Código que é executado antes da exclusão do aplicativo

função delete (app)

% Excluir UIFigure quando o aplicativo for excluído

delete (app. UIFigure) end end end

Você provavelmente obterá um erro, o que não é problema. Apenas feche a GUI que foi gerada depois que você pressionou run, estaremos reunindo o restante dos programas e dados necessários em um momento.

Uma vez que o Matlab está configurado, podemos passar para o python. Primeiro, execute o programa python a partir do prompt de comando (no Windows) ou usando o arquivo.exe na pasta python. Certifique-se de que todas as bibliotecas apropriadas estejam instaladas usando o comando import.

import serial

import time import csv

Estas são as três bibliotecas de que você precisará para começar, embora faremos nossa própria biblioteca em breve. Se houve algum tipo de erro com esses comandos, volte e certifique-se de que as bibliotecas estão instaladas e estão na pasta Lib na pasta python. Em seguida, iremos gerar o que chamei de biblioteca pythonlogger. Este nome não é necessário, você pode chamá-lo do que quiser, é apenas o nome do arquivo python (.py) que você criou.

Abra um editor de texto, eu uso o Sublime3, mas o bloco de notas funciona bem, e digite este código.

def pythonprint ():

import pythonlogger import serial import time import csv ser = serial. Serial ('COM8') # COM8 é a porta serial do arduino, provavelmente será diferente para cada usuário, ou seja, verifique sua porta serial no IDE do arduino ser.flushInput () enquanto Verdadeiro: try: ser_bytes = ser.readline () print (ser_bytes) com open ("test_data.csv", "a") como f: writer = csv.writer (f, delimiter = ",") # define os dados para ser inserido como writer.writerow separado por vírgula ([time.time (), ser_bytes]) #writes data to test_data.csv exceto: print ("Error Occured") break

Salve o texto como "insira o nome da biblioteca desejada".py na pasta Lib. Observe também que a linha def pythonprint () define o nome da função que você vai chamar, então você pode mudar isso para def "insira o nome que você deseja para sua função" (). Quando a biblioteca for salva, podemos passar para o código do Arduino.

Abra o IDE arduino e abra duas novas janelas de esboço. Salve esses dois arquivos de esboço em algum lugar conveniente, o nome desses arquivos não importa. Em seguida, exclua todo o código padrão e substitua-o pelo seguinte.

Para o arduino receptor:

#incluir

#include #include #include // não é usado, mas é necessário para compilar o driver RH_ASK; struct dataStruct {float temp; }meus dados; void setup () {Serial.begin (9600); // Depurando somente if (! Driver.init ()) Serial.println ("init falhou"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Sem bloqueio {int i; // Mensagem com boa soma de verificação recebida, descarte-a. //driver.printBuffer("Got: ", buf, buflen); memcpy (& meusDados, buf, sizeof (meusDados)); Serial.println (""); Serial.print (myData.temp); }}

P. S. o //driver.printBuffer…. linha etc é o código de teste. Não precisa se preocupar com isso, a menos que esteja fazendo diagnósticos e queira saber se está realmente recebendo dados.

Para o transmissor arduino

#incluir

#include #include #include // não é usado, mas é necessário para compilar # include #include int pin = 4; DHT11 dht11 (pino); Driver RH_ASK; struct dataStruct {float temp; }meus dados; byte tx_buf [sizeof (meusDados)] = {0}; // Portanto, os argumentos são bitrate, transmitir pin (tx), // receber pin (rx), ppt pin, isInverse. Os 2 últimos não são usados.void setup () {Serial.begin (9600); // Depurando somente if (! Driver.init ()) Serial.println ("init falhou"); } void loop () {int err; float temp, humi; uint8_t msg; if ((err = dht11.read (humi, temp)) == 0) meusDados.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); byte zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // interrompe a execução até que todos os dados tenham sido enviados delay (2000); // aguarde 2 segundos}}

Os comandos de inclusão devem ser suficientes, mas se você tiver qualquer problema posteriormente com a transferência de dados, pode dar uma olhada na pasta da biblioteca RadioHead e incluir o restante dos nomes de arquivo, no mesmo formato.

Etapa 5: Fazendo funcionar

Fazendo funcionar
Fazendo funcionar
Fazendo funcionar
Fazendo funcionar
Fazendo funcionar
Fazendo funcionar

Agora que temos todo o código junto e o arduino montado, podemos conectar o arduino ao seu computador e carregar o código. Certifique-se de enviar o código correto aos microcontroladores de recepção e transmissão. Você pode ter ambos os arduinos conectados ao seu computador enquanto ele está em execução, mas você terá que se certificar de que selecionou a porta correta para avançar, ou pode desconectar o arduino de transmissão e ligá-lo de alguma outra fonte assim que o código estiver carregado.

Falando nisso, você deve selecionar a porta que está conectada ao seu arduino receptor no menu de ferramentas do IDE agora e executar o python.

Não abra o monitor serial enquanto estiver fazendo isso, o python não pode ler o serial enquanto o monitor estiver aberto. Depois que o python estiver aberto, chame a função pythonprint da seguinte maneira.

pythonlogger.pythonprint ()

Isso iniciará a coleta de dados da porta serial do arduino. Se você abrir sua pasta python agora, verá que foi criado um novo arquivo.csv chamado "test_data.csv", que contém todas as informações de tempo e temperatura. Este será o arquivo que o Matlab acessa para fazer todos os seus cálculos e controles.

Outro aviso: não abra test_data.csv enquanto os dados estão sendo acessados ou gravados. Se você fizer isso, o código python e / ou Matlab irá travar e enviar de volta um erro

Se decidir abrir o.csv posteriormente, você notará que a coluna de tempo é apenas uma sequência de números muito grande. Isso ocorre porque o comando time.time () grava o número de segundos desde 1º de janeiro de 1970.

Neste ponto, o python deve estar imprimindo os dados de temperatura que está lendo da porta serial. Deve ser parecido com:

b'25,03 '/ r / n

Não se preocupe com os caracteres extras, o código do Matlab indexa os cinco valores do meio na segunda coluna do arquivo.csv.

Agora que todos os programas de suporte estão funcionando e os dados estão sendo coletados, podemos começar a coletar dados de GPS do programa móvel Matlab que foi configurado anteriormente e executar o código GUI do Matlab. Assim que estiver na guia sensor do Matlab mobile, selecione GPS e aperte o botão Iniciar.

Se você for novo no Matlab mobile, consulte a etapa 4 e observe as capturas de tela acima. Se você ainda estiver tendo problemas, certifique-se de que está conectado ao computador selecionado anteriormente (na guia de configurações) e use o link do comando "conector ativado" para verificar se o Matlab está online.

Etapa 6: usando o programa

Usando o programa
Usando o programa

Existem várias coisas acontecendo em segundo plano neste sistema. Os dados de temperatura estão sendo coletados e registrados por Arduino e Pyton, Matlab está coletando dados GPS de seu telefone e executando cálculos para ver a que distância você está de sua casa e configurando seu termostato com base em todas essas informações. Onde você entra é fornecendo suas preferências.

Execute o código da GUI do Matlab. Abra o arquivo.mlapp e observe a primeira guia. Você mesmo precisará coletar as informações para isso, a eficiência e a classificação de energia de sua unidade de aquecimento / resfriamento geralmente podem ser encontradas na própria unidade, e sua velocidade média é apenas uma boa estimativa de quão rápido você dirige. Uma vez que os valores são inseridos, aperte o botão "Executar Diagnóstico" e o programa controla seu termostato para coletar informações sobre sua casa.

Passe para o próximo menu.

Etapa 7: Controle de temperatura

Controle de temperatura
Controle de temperatura

Este menu permite que você selecione sua temperatura preferida enquanto está em casa e fora. Defina a Temperatura 1 para sua temperatura confortável e a Temperatura 2 para um valor alto ou baixo que seja seguro para sua casa (certifique-se de não definir para 100 graus enquanto tiver cachorros em casa, etc.).

Etapa 8: Dados históricos

Data histórica
Data histórica

Finalmente, você pode ver quanto dinheiro está economizando usando o controle automático. Basicamente, isso estima quanta energia seria usada se o termostato fosse definido para sua temperatura preferida 24 horas por dia, 7 dias por semana e, em seguida, subtrai a energia real usada.

Boa sorte na construção.

Recomendado: