Índice:
- Etapa 1: juntando tudo
- Etapa 2: Receptor
- Etapa 3: Transmissor
- Etapa 4: O Código
- Etapa 5: Fazendo funcionar
- Etapa 6: usando o programa
- Etapa 7: Controle de temperatura
- Etapa 8: Dados históricos
Vídeo: Autostat: um termostato remoto: 8 etapas (com fotos)
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:38
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
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
Etapa 3: 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
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
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
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
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:
Faça seu próprio termostato de aquecimento conectado e economize com aquecimento: 53 etapas (com fotos)
Faça seu próprio termostato de aquecimento conectado e economize com o aquecimento: Qual é a finalidade? Aumente o conforto aquecendo sua casa exatamente como você deseja Economize e reduza as emissões de gases de efeito estufa aquecendo sua casa apenas quando você precisa Mantenha o controle do aquecimento onde quer que esteja
Termostato inteligente ESP8266: 6 etapas (com fotos)
Smart Thermostat ESP8266: Bienvenue sur ce nouvel article. On se retrouve aujourd'hui pour un projet that j'ai réalisé durant tout ce temps libre que m'a offert le confinement. Ce projet m'a été proposé par mon père, en effet il vient de déménager dans une vieille maison et l
Como fazer um termostato de fogão a lenha automático: 5 etapas (com fotos)
Como fazer um termostato de fogão a lenha automático: Para meu projeto de aula de mecatrônica, decidi projetar e criar um termostato de fogão a lenha automático usando um Arduino habilitado para WiFi com um controlador PID acionando um motor de passo para controlar a posição do amortecedor em meu fogão a lenha. Foi um grande rewar
Controle do termostato de um ventilador de troca de calor: 7 etapas (com fotos)
Controle do termostato de um ventilador de troca de calor: Olá a todos, neste Instrutível, mostrarei como automatizar um ventilador de troca de calor usando um módulo de termostato barato. Aviso: Este projeto usa a tensão da rede elétrica e precisa ser gerenciado de maneira adequada. Eu sei que você não tem certeza do que está fazendo, não tente
Olympus Evolt E510 Liberação de cabo remoto (versão 2 com foco automático no controle remoto): 6 etapas (com fotos)
Liberação de cabo remoto Olympus Evolt E510 (versão 2 com foco automático no controle remoto): Ontem eu construí um controle remoto simples de um botão para meu Olympus E510. A maioria das câmeras possui um botão de liberação do obturador (aquele que você pressiona para tirar uma foto) que possui dois modos. Se o botão for pressionado suavemente, a câmera fará o foco automático e medirá a luz