Tabla de contenido:
- Paso 1: ponerlo todo junto
- Paso 2: receptor
- Paso 3: transmisor
- Paso 4: el código
- Paso 5: hacer que funcione
- Paso 6: uso del programa
- Paso 7: control de temperatura
- Paso 8: Datos históricos
Video: Autostat: un termostato remoto: 8 pasos (con imágenes)
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:43
La pregunta que probablemente se esté haciendo es "¿por qué está fabricando otro termostato remoto?"
La respuesta a esa pregunta es: tenía que hacerlo, y los termostatos inteligentes del mercado son demasiado caros.
Advertencia justa, esta es una compilación de "prueba de concepto" que requeriría algunas salidas adicionales para controlar realmente su termostato, pero el núcleo está en su lugar y puede modificarse según su circunstancia específica. Además, esto todavía es un trabajo en progreso, así que espere algunas actualizaciones y cambios (especialmente en el código de Matlab)
Para comenzar, quiero advertirle que esto requiere tres programas (uno de ellos es bastante caro), bastantes bibliotecas y paquetes de soporte para los programas, y debe hacer que todos se comuniquen entre sí. Es un dolor de cabeza. Con esa advertencia fuera del camino, comencemos con los materiales.
Hardware
- arduino nano
- arduino uno (u otro nano, solo usé el uno porque tenía uno por ahí)
- cables de puente surtidos, algunos macho / macho y dos juegos de tres puentes macho / hembra unidos
- Receptor de radiofrecuencia (RF) de 433 MHz, utilicé el MX-05V
- Transmisor RF 433MHz, utilicé el MX-FS-03V
- Termómetro y sensor de humedad de alta precisión DHT11 (el que utilicé está instalado en un chip de tres puntas con las resistencias requeridas ya instaladas)
- protoboard (si no quieres soldar todo esto junto)
- un teléfono con GPS (iPhone 8 en este caso, pero también he usado un Galaxy S8)
- Contenedor impreso en 3D (no es realmente necesario, cualquier contenedor funcionará o ninguno)
Software
- Matlab de MathWorks (tengo la edición 2018a, pero también he usado las ediciones 2017a-b)
- Matlab mobile instalado en su teléfono
- paquete de soporte arduino para Matlab
- Paquete de sensores de iPhone para Matlab
- arduino IDE
- Paquetes de soporte RadioHead y bibliotecas del arduino IDE
- Biblioteca DHT11 para arduino IDE
- python 3.7 (asegúrese de que la biblioteca pyserial o la biblioteca serial esté instalada, que debería ser para la versión 3.4 o posterior)
Paso 1: ponerlo todo junto
En primer lugar, le sugiero que haga algunos tutoriales de arduino relacionados con los transmisores de RF solo para asegurarse de que sus piezas estén funcionando y el cableado sea correcto. Hay muchos ejemplos disponibles, con el código incluido (para aquellos de nosotros que sabemos poco o nada sobre C y C ++).
Siga los diagramas de cableado a continuación para montar el arduino y los sensores. Una cosa a tener en cuenta al conectar los arduinos es que los puertos de datos que utilicé no son obligatorios, pero sí recomendados.
SI decide cambiar los puertos de datos que usa, solo necesita definir los pines en su código. Personalmente, creo que es más fácil seguir con los puertos predeterminados que reconocen las bibliotecas arduino.
Y para ser claros, el nano y uno son intercambiables, pero usé el nano para el lado del transmisor del proyecto para reducir el tamaño del monitor de temperatura.
Nota al margen: el artilugio verde que sostiene el nano es el contenedor impreso en 3D.
Paso 2: receptor
Paso 3: transmisor
Paso 4: el código
Una vez que haya terminado el cableado, debe ejecutar todos los programas y las bibliotecas instaladas (si aún no lo ha hecho), solo asumiré que sí, debe iniciar Matlab y ejecutar el paquete de soporte de iPhone. Tanto su teléfono como Matlab deben estar en la misma red wifi en este momento.
En la ventana de comandos de Matlab escriba:
conector en
Esto le pedirá que ingrese una contraseña de cinco dígitos que usará para conectarse en su iPhone. Asegúrese de recordar la contraseña. Cuando haya ingresado la contraseña, Matlab mostrará cierta información, incluida su dirección IP. Use esto en el siguiente paso, que proviene de las instrucciones del menú de ayuda "Comenzando con los sensores" en Matlab mobile.
- Siga estos pasos para enviar datos del sensor a MathWorks Cloud o una computadora:
- Si está enviando datos del sensor a una computadora y si aún no está instalado, descargue e instale el paquete de soporte de MATLAB para sensores Apple iOS en MATLAB.
- Conecte MATLAB Mobile a MathWorks Cloud o una computadora usando Configuración.
- Cree un objeto mobiledev en MATLAB (en su computadora), por ejemplo: >> m = mobiledev
- Seleccione uno o más sensores y toque Iniciar.
Siga estos pasos para registrar los datos del sensor localmente en su dispositivo:
- En la pantalla Sensores, seleccione los sensores de los que desea recopilar datos.
- Seleccione Registro.
- Toque el botón Inicio.
- Cuando haya terminado de recopilar datos, toque el botón Detener.
- En la ventana emergente, ingrese el nombre del registro del sensor.
- Repita los pasos del 1 al 5 si es necesario.
Esta sección se volverá a consultar en la Parte 4, por lo que no es necesario comenzar a recopilar datos todavía. Solo tenga su teléfono a mano y Matlab móvil listo.
Ahora necesita crear una carpeta en algún lugar de su computadora para albergar los archivos de código Matlab. Tendrá cuatro archivos separados, dos para las funciones en segundo plano (archivos.m) y un archivo de código Matlab para la GUI (.mlapp),.
Primero está el cálculo de la masa del aire en su casa (esto le permite a Matlab saber cuánto tiempo se tarda en calentar / enfriar su casa)
función [Masa] = CalcMass (T_ins, P_out, Chng_dir)
runCalc = 0; Tmp_start = T_ins; time_start = clock; time_end = 0 while runCalc <= 1 if T_ins == (Tmp_start + (7 * Chng_dir)) time_end = reloj; PwrCntr = 0; runCalc = 0; else PwrCntr = P_out; runCalc = runCalc + 0.1 end end time_diag = time_end-time_start Mass = (P_out * time_diag) /7.035
Y el segundo:
function [timestamps, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)
AutoStat = 1; i = 1; while AutoStat == 1 time_start = clock; m = mobiledev; t = csvread ('valores.csv', 0, 1); t = t (i); marcas de tiempo = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i + 1; formato longg; % haversine fórmula para calcular la distancia basada en la latitud y% longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)). ^ 2 + cosd (Lat_in). * cosd (m.latitude). * (sind ((m. Longitud-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 su tiempo para regresar time_rtn = (Dist-r_pref)./ speed; % calcula el ajuste necesario del termostato basado en el consumo de energía del% de aire acondicionado y la masa de aire de la casa. calcTmp_set = ((- 1. * P_out. * time_rtn)./ (mass. * (1.005))) + T_pref; % determina si es necesario cambiar la configuración actual del termostato si round (calcTmp_set) ~ = round (t) timeACon = clock; PwrCntr = P_out; timeACon = timeACon + clock-time_start; costo = P_out * timeACon * tarifa; else PwrCntr = 0 marcas de tiempo de finalización (final + 1, [1: 6]) = reloj; pwr_usage (fin + 1, 1) = PwrCntr; pausa (5) fin fin
Ambos archivos son funciones de Matlab. No necesitará acceder a ellos a menos que planee modificarlos para necesidades específicas, ya que los llamará desde la GUI. Guarde ambos archivos por separado, el primero como CalcMass.m y el segundo como dist_cntrl.m, esos serán los nombres que usa el código GUI para llamar a las funciones, así que a menos que desee editar el resto del código a continuación, siga con la convención de nomenclatura.
Antes de ingresar al código GUI, debe abrir el diseñador de aplicaciones para Matlab, que puede abrir navegando en la barra de menú de Matlab, o con mi método favorito, que es ingresar el siguiente comando en la ventana de comandos de Matlab:
diseñador de aplicaciones
Una vez que el diseñador de la aplicación esté abierto, abra un nuevo archivo de aplicación (.mlapp) y elimine todo el código predeterminado de la ventana de código. Luego reemplácelo todo con lo siguiente y presione el botón Ejecutar.
classdef Control_1 <matlab.apps. AppBase% Propiedades que corresponden a las propiedades de los componentes de la aplicación (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. botón 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.uilab.controlpin. Label. 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. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control.
métodos (acceso = privado)
% Función de cambio de valor: tempnow
función tempnowValueChanged (aplicación, evento) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 for i = length (temp) app. Gauge. Value = temp (i) pause (1) end end
% Valor de función cambiada: TemperatureDirectionSwitch
función TemperatureDirectionSwitchValueChanged (aplicación, evento) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; end Chng_dir; fin
% Función de cambio de valor: DDFH
función DDFHValueChanged (aplicación, evento) r_pref = app. DDFH. Value; fin
% Función de cambio de valor: AvgLocalSpeedEditField
función AvgLocalSpeedEditFieldValueChanged (aplicación, evento) velocidad = aplicación. AvgLocalSpeedEditField. Value; fin
% Función de cambio de valor: PowerOutputRatingEditField
función PowerOutputRatingEditFieldValueChanged (aplicación, evento) valor = aplicación. PowerOutputRatingEditField. Value; fin
% Función de cambio de valor: EnergyEfficiencyRatingEditField
función EnergyEfficiencyRatingEditFieldValueChanged (aplicación, evento) valor = aplicación. EnergyEfficiencyRatingEditField. Value; fin
% Función de botón pulsado: RunDiagnosticButton
función RunDiagnosticButtonPushed (aplicación, evento) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)
fin
% Función de cambio de valor: Temperature1Spinner
función Temperature1SpinnerValueChanged (aplicación, evento) valor = app. Temperature1Spinner. Value; fin
% Función de cambio de valor: Temperature2Spinner
función Temperature2SpinnerValueChanged (aplicación, evento) valor = app. Temperature2Spinner. Value; fin
% Función de cambio de valor: interruptor
función SwitchValueChanged (aplicación, evento) m = mobiledev; Lat_in = m. Latitud Lon_in = m. Longitud P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; velocidad = m. Velocidad; masa = 200; velocidad = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, mass) end end
% De inicialización y construcción de la aplicación
métodos (acceso = privado)
% Crear UIFigure y componentes
función createComponents (aplicación)
% Crear UIFigure
app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Figura de interfaz de usuario';
% Crear TabGroup
app. TabGroup = uitabgroup (app. UIFigure); app. TabGroup. Position = [1 1 640 480];
% Crear pestaña de configuración
app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Configuración';
% Crear RunDiagnosticButton
app. RunDiagnosticButton = uibutton (app. SetupTab, 'empujar'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (aplicación, @RunDiagnosticButtonPushed, verdadero); app. RunDiagnosticButton. FontWeight = 'negrita'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Ejecutar diagnóstico';
% Crear EnergyEfficiencyRatingEditFieldLabel
app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'derecha'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Calificación de eficiencia energética';
% Crear calificación de eficiencia energéticaEditar campo
app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'numérico'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (aplicación, @EnergyEfficiencyRatingEditFieldValueChanged, verdadero); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'centro'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];
% Crear PowerOutputRatingEditFieldLabel
app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'derecha'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Clasificación de potencia de salida';
% Crear PowerOutputRatingEditField
app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numérico'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (aplicación, @PowerOutputRatingEditFieldValueChanged, verdadero); app. PowerOutputRatingEditField. HorizontalAlignment = 'centro'; app. PowerOutputRatingEditField. Position = [151 328 100 22];
% Crear AvgLocalSpeedEditFieldLabel
app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'derecha'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Prom. Velocidad local ';
% Crear AvgLocalSpeedEditField
app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'numérico'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (aplicación, @AvgLocalSpeedEditFieldValueChanged, verdadero); app. AvgLocalSpeedEditField. HorizontalAlignment = 'centro'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];
% Create DesiredDistancefromHouseEditFieldLabel
app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'derecha'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Distancia deseada'; 'from House'};
% Crear DDFH
app. DDFH = uieditfield (app. SetupTab, 'numérico'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (aplicación, @DDFHValueChanged, verdadero); app. DDFH. HorizontalAlignment = 'centro'; app. DDFH. Position = [139 135 100 22];
% Crear TemperatureDirectionSwitchLabel
app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'centro'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Dirección de temperatura';
% Crear interruptor de dirección de temperatura
app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'control deslizante'); app. TemperatureDirectionSwitch. Items = {'Arriba', 'Abajo'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (aplicación, @TemperatureDirectionSwitchValueChanged, verdadero); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Arriba';
% Create TempSettingsTab
app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Ajustes';
% Crear Temperature1SpinnerLabel
app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'centro'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Temperatura'; '# 1'};
% Crear Temperature1Spinner
app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (aplicación, @ Temperature1SpinnerValueChanged, verdadero); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Value = 60;
% Crear Temperature2SpinnerLabel
app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'centro'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Temperatura'; '# 2'};
% Crear Temperature2Spinner
app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (aplicación, @ Temperature2SpinnerValueChanged, verdadero); app. Temperature2Spinner. Position = [157 230 100 70]; app. Temperature2Spinner. Value = 60;
% Crear interruptor
app. Switch = uiswitch (app. TempSettingsTab, 'control deslizante'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (aplicación, @SwitchValueChanged, verdadero); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';
% Crear EditFieldLabel
app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'derecha'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = '';
% Crear tempnow
app.tempnow = uieditfield (app. TempSettingsTab, 'numérico'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (aplicación, @tempnowValueChanged, verdadero); app.tempnow. HorizontalAlignment = 'centro'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;
% Crear etiqueta de calibre
app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'centro'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Calibre';
% Crear indicador
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;
% Crear ficha de ahorro
app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Ahorros';
% Crear UIAxes
app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Savings') xlabel (app. UIAxes, 'Month and Year') ylabel (app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.606666666666667]; app. UIAxes. Color = [0.9412 0.9412 0.9412]; app. UIAxes. Position = [146 219 348 237];
% Create ThisMonthCostEditFieldLabel
app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'centro'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Costo de este mes';
% Create ThisMonthCostEditField
app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'numérico'); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$% 7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'centro'; app. ThisMonthCostEditField. Position = [417 39 137 58];
% Crear ahorros totalesEditFieldLabel
app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'derecha'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Ahorro total';
% De creación de ahorros totalesEditField
app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numérico'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$% 9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'centro'; app. TotalSavingsEditField. Position = [88 39 137 58]; fin fin
métodos (Acceso = público)
% Construir aplicación
aplicación de función = Control_1
% Crear y configurar componentes
createComponents (aplicación)
% Registre la aplicación con App Designer
registerApp (aplicación, aplicación. UIFigure)
si nargout == 0
borrar el final de la aplicación
% Código que se ejecuta antes de la eliminación de la aplicación
función borrar (aplicación)
% Eliminar UIFigure cuando se elimina la aplicación
eliminar (app. UIFigure) end end end
Probablemente obtendrá un error, lo cual no es un problema. Simplemente cierre la GUI que se generó después de presionar ejecutar, recopilaremos el resto de los programas y datos necesarios en un momento.
Dado que Matlab está configurado, podemos pasar a Python. Primero, ejecute el programa Python desde su símbolo del sistema (en Windows) o usando el archivo.exe en su carpeta Python. Asegúrese de que todas las bibliotecas adecuadas estén instaladas mediante el comando de importación.
importar serial
importar tiempo importar csv
Estas son las tres bibliotecas que necesitará para comenzar, aunque pronto crearemos nuestra propia biblioteca. Si hubo algún tipo de error con estos comandos, regrese y asegúrese de que las bibliotecas estén instaladas y en la carpeta Lib en la carpeta Python. A continuación, generaremos lo que he llamado biblioteca pythonlogger. Este nombre no es necesario, puedes llamarlo como quieras, es solo el nombre del archivo python (.py) que creas.
Abra un editor de texto, uso Sublime3 pero el bloc de notas funciona bien e ingrese este código.
def pythonprint ():
import pythonlogger import serial import time import csv ser = serial. Serial ('COM8') # COM8 es el puerto serial arduino, esto probablemente será diferente para cada usuario, es decir, verifique su puerto serial en el IDE arduino ser.flushInput () mientras Verdadero: intente: ser_bytes = ser.readline () print (ser_bytes) con open ("test_data.csv", "a") as f: writer = csv.writer (f, delimiter = ",") # establece los datos en ser ingresado como escritor separado por comas.writerow ([time.time (), ser_bytes]) #escribe datos en test_data.csv excepto: print ("Error Occured") break
Guarde el texto como "inserte el nombre de la biblioteca que desee".py en la carpeta Lib. También tenga en cuenta que la línea def pythonprint () define el nombre de la función a la que va a llamar, por lo que puede cambiar eso a def "insertar el nombre que desea para su función" (). Cuando se guarda la biblioteca, podemos pasar al código arduino.
Abra el IDE de arduino y abra dos nuevas ventanas de boceto. Guarde esos dos archivos de boceto en un lugar conveniente, el nombre de estos archivos no importa. Luego elimine todo el código predeterminado y reemplácelo con lo siguiente.
Para el arduino receptor:
#incluir
#include #include #include // esto no se usa pero es necesario para compilar el controlador RH_ASK; struct dataStruct {float temp; }mis datos; configuración vacía () {Serial.begin (9600); // Depurando solo si (! Driver.init ()) Serial.println ("init falló"); } bucle vacío () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = tamaño de (buf); if (driver.recv (buf, & buflen)) // Sin bloqueo {int i; // Mensaje con una buena suma de control recibido, volcarlo. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}
PD el //driver.printBuffer…. etc línea es código de prueba. No hay necesidad de preocuparse por ello a menos que esté haciendo diagnósticos y quiera averiguar si realmente está recibiendo datos.
Para el transmisor arduino
#incluir
#include #include #include // esto no se usa pero es necesario para compilar # include #include int pin = 4; DHT11 dht11 (pin); Controlador RH_ASK; struct dataStruct {float temp; }mis datos; byte tx_buf [sizeof (myData)] = {0}; // Entonces los argumentos son bitrate, pin de transmisión (tx), // pin de recepción (rx), ppt pin, isInverse. Los 2 últimos no se utilizan. Void setup () {Serial.begin (9600); // Depurando solo si (! Driver.init ()) Serial.println ("init falló"); } bucle vacío () {int err; temperatura de flotación, humi; uint8_t msg; if ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); byte zize = tamaño de (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // detener la ejecución hasta que se hayan enviado todos los datos delay (2000); // espera 2 segundos}}
Los comandos de inclusión deberían ser suficientes, pero si tiene algún problema más adelante con la transferencia de datos, es posible que desee buscar en la carpeta de la biblioteca RadioHead e incluir el resto de los nombres de archivo, en el mismo formato.
Paso 5: hacer que funcione
Ahora que tenemos todo el código junto y el arduino ensamblado, podemos conectar el arduino a su computadora y cargar el código. Asegúrese de enviar el código correcto a los microcontroladores de recepción y transmisión. Puede tener ambos arduinos conectados a su computadora mientras esto se está ejecutando, pero tendrá que asegurarse de tener el puerto correcto seleccionado en el futuro, o puede desconectar el arduino transmisor y encenderlo de otra fuente una vez que el código esté subido.
Hablando de eso, debe seleccionar el puerto que está conectado a su arduino receptor desde el menú de herramientas IDE ahora y ejecutar Python.
No abra el monitor serial mientras está haciendo esto, Python no puede leer el serial mientras el monitor está abierto. Una vez que Python esté abierto, llame a la función pythonprint de la siguiente manera.
pythonlogger.pythonprint ()
Esto iniciará la recopilación de datos desde el puerto serie arduino. Si abre su carpeta de Python ahora, verá que se ha creado un nuevo archivo.csv llamado "test_data.csv", que contiene toda la información de tiempo y temperatura. Este será el archivo al que accederá Matlab para realizar todos sus cálculos y controles.
Otra advertencia: no abra test_data.csv mientras se accede a los datos o se escriben. Si lo hace, el código Python y / o Matlab se bloqueará y devolverá un error
Si decide abrir el.csv más tarde, notará que la columna de tiempo es solo una cadena de números muy grande. Esto se debe a que el comando time.time () escribe el número de segundos desde el 1 de enero de 1970.
En este punto, Python debería estar imprimiendo los datos de temperatura que está leyendo desde el puerto serie. Debería verse algo como:
b'25.03 '/ r / n
No se preocupe por los caracteres adicionales, el código de Matlab indexa los cinco valores del medio en la segunda columna del archivo.csv.
Ahora que todos los programas de soporte están funcionando y se están recopilando datos, podemos comenzar a recopilar datos de GPS del programa móvil Matlab que se configuró anteriormente y ejecutar el código GUI de Matlab. Una vez que esté en la pestaña de sensores de Matlab mobile, seleccione GPS y presione el botón de inicio.
Si es nuevo en Matlab mobile, consulte el paso 4 y observe las capturas de pantalla anteriores. Si aún tiene problemas, asegúrese de estar conectado a la computadora que seleccionó anteriormente (en la pestaña de configuración) y use el enlace del comando "conector en" para verificar que Matlab esté en línea.
Paso 6: uso del programa
Hay varias cosas que suceden en segundo plano en este sistema. Los datos de temperatura están siendo recopilados y registrados por arduino y pyton, Matlab está recopilando datos de GPS de su teléfono y ejecutando cálculos para ver qué tan lejos está de su casa y configurando su termostato en función de toda esa información. El lugar en el que entras está proporcionando tus preferencias.
Ejecute el código de la GUI de Matlab. Abra el archivo.mlapp y mire la primera pestaña. Deberá recopilar la información para esto usted mismo, la eficiencia y la potencia nominal de su unidad de calefacción / refrigeración generalmente se pueden encontrar en la unidad misma, y su velocidad promedio es solo una buena estimación de qué tan rápido conduce. Una vez ingresados los valores, presione el botón "Ejecutar diagnóstico" y el programa controlará su termostato para recopilar información sobre su casa.
Pasar al siguiente menú.
Paso 7: control de temperatura
Este menú le permite seleccionar su temperatura preferida mientras está en casa y fuera. Establezca la temperatura n. ° 1 en su temperatura confortable y la temperatura n. ° 2 en un valor alto o bajo que sea seguro para su hogar (asegúrese de no establecerlo en 100 grados mientras tiene perros en casa, etc.).
Paso 8: Datos históricos
Finalmente, puede ver cuánto dinero está ahorrando utilizando el control automático. Básicamente, esto estima cuánta energía se usaría si su termostato estuviera configurado a su temperatura preferida las 24 horas del día, los 7 días de la semana, luego resta la energía real utilizada.
Buena suerte construyendo.
Recomendado:
Cree su propio termostato de calefacción conectado y ahorre con la calefacción: 53 pasos (con imágenes)
Haga su propio termostato de calefacción conectado y ahorre con la calefacción: ¿Cuál es el propósito? Aumente la comodidad calentando su casa exactamente como lo desee Ahorre y reduzca las emisiones de gases de efecto invernadero calentando su casa solo cuando lo necesite Mantenga el control de la calefacción esté donde esté Siéntase orgulloso de haberlo hecho y
El control remoto de TV se convierte en un control remoto de RF -- NRF24L01 + Tutorial: 5 pasos (con imágenes)
El control remoto de TV se convierte en un control remoto de RF || Tutorial de NRF24L01 +: En este proyecto te mostraré cómo utilicé el popular nRF24L01 + RF IC para ajustar el brillo de una tira de LED de forma inalámbrica a través de tres botones inútiles de un control remoto de TV. ¡Empecemos
Convierta su control remoto IR en control remoto RF: 9 pasos (con imágenes)
Convierta su control remoto IR en control remoto RF: en el Instructable de hoy, le mostraré cómo puede usar un módulo RF genérico sin un microcontrolador, lo que eventualmente nos llevará a construir un proyecto en el que puede convertir un control remoto IR de cualquier dispositivo en un RF. Remoto. La principal ventaja de convertir un
Liberación del cable del control remoto Olympus Evolt E510 (versión 2 con enfoque automático en el control remoto): 6 pasos (con imágenes)
Lanzamiento del cable del control remoto Olympus Evolt E510 (versión 2 con enfoque automático en el control remoto): Ayer construí un control remoto simple de un botón para mi Olympus E510. La mayoría de las cámaras tienen un botón disparador (el que presiona para tomar una foto) que tiene dos modos. Si se presiona suavemente el botón, la cámara se enfocará automáticamente y medirá la luz
Control remoto remoto: 11 pasos (con imágenes)
Control remoto a distancia: Tengo un bebé recién nacido y él no cree que deba dormir tanto como mi esposa y yo también lo desearíamos. Una cosa que lo mantiene feliz en su cuna es el móvil que cuelga sobre él. Entonces, cuando se despierte, si necesitamos otros 25 minutos más o menos de sl