Оглавление:

Автостат: дистанционный термостат: 8 шагов (с изображениями)
Автостат: дистанционный термостат: 8 шагов (с изображениями)

Видео: Автостат: дистанционный термостат: 8 шагов (с изображениями)

Видео: Автостат: дистанционный термостат: 8 шагов (с изображениями)
Видео: Bluetooth термостат 2024, Июль
Anonim
Автостат: дистанционный термостат
Автостат: дистанционный термостат

Вероятно, вы задаетесь вопросом: «Зачем вы делаете еще один дистанционный термостат?»

Ответ на этот вопрос таков: «Умные термостаты» на рынке слишком дороги.

Справедливое предупреждение, это «пробная» сборка, которая потребует нескольких дополнительных выходов для фактического управления вашим термостатом, но ядро на месте и может быть изменено в зависимости от ваших конкретных обстоятельств. Кроме того, это все еще работа, поэтому ожидайте несколько обновлений и изменений (особенно в коде Matlab).

Для начала хочу вас предупредить, для этого требуются три программы (одна из них довольно дорогая), довольно много библиотек и пакетов поддержки для программ, и вам нужно, чтобы все они общались друг с другом. Это головная боль. Убрав это предупреждение, давайте приступим к материалам.

Аппаратное обеспечение

  • arduino nano
  • arduino uno (или другой nano, я просто использовал uno, потому что один лежал у меня)
  • разные соединительные кабели, несколько штекерных / штекерных и два набора из трех соединенных штекерных / женских перемычек
  • Радиочастотный (RF) приемник 433 МГц, я использовал MX-05V
  • Радиочастотный передатчик 433 МГц, я использовал MX-FS-03V
  • Высокоточный термометр и датчик влажности DHT11 (тот, который я использовал, установлен на трехконтактном чипе с уже установленными необходимыми резисторами)
  • макетная плата (если не хотите все это паять)
  • телефон с GPS (в данном случае iPhone 8, но я также использовал Galaxy S8)
  • Контейнер, напечатанный на 3D-принтере (на самом деле не обязательно, подойдет любой контейнер или вообще не будет)

Программное обеспечение

  • Matlab от MathWorks (у меня есть версия 2018a, но я также использовал версии 2017a-b)
  • Matlab Mobile установлен на ваш телефон
  • пакет поддержки arduino для Matlab
  • Пакет сенсоров iPhone для Matlab
  • Arduino IDE
  • Пакеты поддержки RadioHead и библиотеки IDE arduino
  • Библиотека DHT11 для Arduino IDE
  • python 3.7 (убедитесь, что установлена библиотека pyserial или последовательная библиотека, которая должна быть для версии 3.4 или новее)

Шаг 1. Собираем все вместе

Собираем все вместе
Собираем все вместе
Собираем все вместе
Собираем все вместе
Собираем все вместе
Собираем все вместе

Прежде всего, я бы посоветовал вам сделать несколько руководств по Arduino, посвященных радиочастотным передатчикам, чтобы убедиться, что ваши части работают и проводка правильная. Доступно множество примеров с включенным кодом (для тех из нас, кто практически ничего не знает о C и C ++).

Следуйте приведенным ниже схемам подключения, чтобы собрать Arduino и датчики. При подключении Arduinos следует помнить о том, что порты данных, которые я использовал, не требуются, но рекомендуются.

ЕСЛИ вы все же решите изменить используемые порты данных, вам просто нужно определить контакты в своем коде. Лично я считаю, что проще придерживаться портов по умолчанию, которые распознаются библиотеками arduino.

И, чтобы быть ясным, nano и uno взаимозаменяемы, но я использовал nano для передающей стороны проекта, чтобы уменьшить размер монитора температуры.

Боковое примечание: зеленая штуковина, в которой находится нано, - это контейнер, напечатанный на 3D-принтере.

Шаг 2: Получатель

Получатель
Получатель

Шаг 3: передатчик

Передатчик
Передатчик

Шаг 4: Код

После завершения подключения вам нужно запустить все программы и установить библиотеки (если вы еще этого не сделали), я просто предполагаю, что у вас есть, вам нужно запустить Matlab и запустить пакет поддержки iPhone. На этом этапе ваш телефон и Matlab должны быть в одной сети Wi-Fi.

В командном окне Matlab напишите:

разъем на

Вам будет предложено ввести пятизначный пароль, который вы будете использовать для подключения на вашем iPhone. Убедитесь, что вы помните пароль. Когда вы ввели пароль, Matlab отобразит некоторую информацию, включая ваш IP-адрес. Используйте это на следующем шаге, который следует из инструкций из меню справки «Начало работы с датчиками» в Matlab Mobile.

  • Выполните следующие действия, чтобы отправить данные датчика в MathWorks Cloud или на компьютер:
  • Если вы отправляете данные датчика на компьютер, и если он еще не установлен, загрузите и установите пакет поддержки MATLAB для датчиков Apple iOS в MATLAB.
  • Подключите MATLAB Mobile к MathWorks Cloud или компьютеру с помощью настроек.
  • Создайте объект mobiledev в MATLAB (на вашем компьютере), например: >> m = mobiledev
  • Выберите один или несколько датчиков и нажмите «Пуск».

Выполните следующие действия, чтобы записывать данные датчиков локально на вашем устройстве:

  • На экране «Датчики» выберите датчики, с которых вы хотите собирать данные.
  • Выберите Журнал.
  • Нажмите кнопку «Пуск».
  • Когда вы закончите сбор данных, нажмите кнопку «Стоп».
  • Во всплывающем окне введите имя журнала датчиков.
  • При необходимости повторите шаги 1–5.

Мы вернемся к этому разделу в Части 4, поэтому пока нет необходимости начинать сбор данных. Просто держите свой телефон под рукой, а Matlab Mobile наготове.

Теперь вам нужно создать папку где-нибудь на вашем компьютере, чтобы разместить файлы кода Matlab. У вас будет четыре отдельных файла: два для фоновых функций (файлы.m) и один файл кода Matlab для графического интерфейса пользователя (.mlapp),.

Во-первых, это расчет массы воздуха в вашем доме (это позволяет Matlab узнать, сколько времени требуется для обогрева / охлаждения вашего дома).

функция [Масса] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = часы; time_end = 0 при runCalc <= 1, если T_ins == (Tmp_start + (7 * Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; иначе PwrCntr = P_out; runCalc = runCalc + 0.1 конец конец time_diag = time_end-time_start Масса = (P_out * time_diag) /7.035

И второй:

функция [отметки времени, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)

AutoStat = 1; я = 1; в то время как AutoStat == 1 time_start = clock; m = mobiledev; t = csvread ('значения.csv', 0, 1); t = t (i); отметки времени = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; я = я + 1; формат longg; Формула% гаверсинуса для расчета расстояния на основе широты и% longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)). ^ 2 + cosd (Lat_in). * cosd (m. широта). * (sind ((м. Долгота-Долгота_in)./ 2)). ^ 2; c_hav = 2. * atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371. * c_hav; Расстояние = d_hav. * 1000; % оценивает ваше время, чтобы вернуть time_rtn = (Dist-r_pref)./ speed; % рассчитывает необходимую настройку термостата на основе% мощности кондиционера и воздушной массы дома. calcTmp_set = ((- 1. * P_out. * time_rtn)./ (масса. * (1.005))) + T_pref; % определяет, нужно ли изменять текущую настройку термостата, если round (calcTmp_set) ~ = round (t) timeACon = clock; PwrCntr = P_out; timeACon = timeACon + часы-время_старт; cost = P_out * timeACon * rate; иначе PwrCntr = 0 конечных отметок времени (конец + 1, [1: 6]) = часы; pwr_usage (конец + 1, 1) = PwrCntr; пауза (5) конец конец

Оба эти файла являются функциями Matlab. Вам не нужно будет обращаться к ним, если вы не планируете изменять их для определенных нужд, поскольку вы будете вызывать их из графического интерфейса. Сохраните оба файла отдельно, первый как CalcMass.m, а второй как dist_cntrl.m, это будут имена, которые код графического интерфейса использует для вызова функций, поэтому, если вы не хотите редактировать остальную часть кода ниже, придерживайтесь соглашение об именах.

Прежде чем вы попадете в код графического интерфейса пользователя, вам нужно открыть конструктор приложений для Matlab, который вы можете открыть, перейдя в строку меню Matlab, или с помощью моего любимого метода, который вводит следующую команду в командном окне Matlab:

разработчик приложений

После открытия конструктора приложения откройте новый файл приложения (.mlapp) и удалите весь код по умолчанию из окна кода. Затем замените все на следующее и нажмите кнопку запуска.

classdef Control_1 <matlab.apps. AppBase% Свойства, соответствующие свойствам компонентов приложения (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Кнопка 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. Labui. 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.control. Label Gauge.control. Вкладка Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField. Matlab.ui.control. NumericEditField. Matlab.ui.control. NumericEditField.

методы (Доступ = частный)

% Функция измененного значения: tempnow

функция tempnowValueChanged (приложение, событие) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 для i = length (temp) app. Gauge. Value = temp (i) pause (1) end end

Функция изменения% значения: TemperatureDirectionSwitch

функция TemperatureDirectionSwitchValueChanged (приложение, событие) way = app. TemperatureDirectionSwitch. Value; way = uint8 (путь) way = length (путь) if way == 4 Chng_dir = -1; иначе Chng_dir = 1; конец Chng_dir; конец

% Функция измененного значения: DDFH

функция DDFHValueChanged (приложение, событие) r_pref = app. DDFH. Value; конец

% Значение измененной функции: AvgLocalSpeedEditField

функция AvgLocalSpeedEditFieldValueChanged (приложение, событие) speed = app. AvgLocalSpeedEditField. Value; конец

% Значение измененной функции: PowerOutputRatingEditField

функция PowerOutputRatingEditFieldValueChanged (приложение, событие) value = app. PowerOutputRatingEditField. Value; конец

% Значение измененной функции: EnergyEfficiencyRatingEditField

функция EnergyEfficiencyRatingEditFieldValueChanged (приложение, событие) value = app. EnergyEfficiencyRatingEditField. Value; конец

% Функция нажатия кнопки: RunDiagnosticButton

функция RunDiagnosticButtonPushing (приложение, событие) way = app. TemperatureDirectionSwitch. Value; way = uint8 (путь) way = length (путь) if way == 4 Chng_dir = -1; иначе Chng_dir = 1; конец T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

конец

% Значение измененной функции: Temperature1Spinner

функция Temperature1SpinnerValueChanged (приложение, событие) value = app. Temperature1Spinner. Value; конец

% Значение измененной функции: Temperature2Spinner

функция Temperature2SpinnerValueChanged (приложение, событие) value = app. Temperature2Spinner. Value; конец

% Значение измененной функции: переключатель

функция SwitchValueChanged (приложение, событие) m = mobiledev; Широта на дюйм = м. Широта, долгота на дюйм = м. Долгота P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; скорость = м. Скорость; масса = 200; скорость = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, mass) end end

% Инициализация и построение приложения

методы (Доступ = частный)

% Создать UIFigure и компоненты

функция createComponents (приложение)

% Создать UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Рисунок пользовательского интерфейса';

% Create TabGroup

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

% Create SetupTab

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Настройка';

% Create RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPastedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushing, true); app. RunDiagnosticButton. FontWeight = 'жирный'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Запустить диагностику';

% Create EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'право'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Рейтинг энергоэффективности';

% Create EnergyEfficiencyRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'числовой'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'центр'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% Create PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'право'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Номинальная выходная мощность';

% Create PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'числовой'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'центр'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% Создать AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'право'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Сред. Местная скорость »;

% Создать AvgLocalSpeedEditField

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'числовой'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'центр'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% Create DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'право'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Желаемое расстояние'; 'из дома'};

% Создать DDFH

app. DDFH = uieditfield (app. SetupTab, 'числовой'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (app, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'центр'; app. DDFH. Position = [139 135 100 22];

% Создать TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'center'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Направление температуры';

% Create TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'слайдер'); app. TemperatureDirectionSwitch. Items = {'Вверх', 'Вниз'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Вверх';

% Create TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Темп. Настройки';

% Создать Temperature1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Tempera1SpinnerLabel. HorizontalAlignment = 'центр'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Температура'; '# 1'};

% Создать 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;

% Создать Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'центр'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Температура'; '# 2'};

% Создать 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;

% Создать переключатель

app. Switch = uiswitch (app. TempSettingsTab, 'слайдер'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (приложение, @SwitchValueChanged, истина); app. Switch. FontName = 'Ньяла'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';

% Создать EditFieldLabel

app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'право'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = '';

% Create tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'числовой'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (app, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'центр'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% Create GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'центр'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Датчик';

% Create Gauge

app. Gauge = uigauge (app. TempSettingsTab, 'круговой'); 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;

% Create SavingsTab

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Экономия';

% Create 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 = 'центр'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Стоимость этого месяца';

% Create ThisMonthCostEditField

app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'числовой'); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$% 7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'центр'; app. ThisMonthCostEditField. Position = [417 39 137 58];

% Создать TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'право'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Общая экономия';

% Create TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'числовой'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$% 9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'центр'; app. TotalSavingsEditField. Position = [88 39 137 58]; конец конец

методы (Доступ = общедоступный)

% Создать приложение

function app = Control_1

% Создание и настройка компонентов

createComponents (приложение)

% Зарегистрируйте приложение в App Designer

registerApp (приложение, приложение. UIFigure)

если nargout == 0

очистить конец конца приложения

% Код, который выполняется перед удалением приложения

функция удалить (приложение)

% Удалить UIFigure при удалении приложения

удалить (app. UIFigure) конец конец конец

Вероятно, вы получите сообщение об ошибке, и это не проблема. Просто закройте графический интерфейс, созданный после того, как вы нажали кнопку «Выполнить», и мы немедленно соберем остальные необходимые программы и данные.

Поскольку Matlab настроен, мы можем перейти к python. Сначала запустите программу python либо из командной строки (в Windows), либо с помощью файла.exe в папке python. Убедитесь, что все соответствующие библиотеки установлены с помощью команды импорта.

импортный серийный номер

время импорта импорт csv

Это три библиотеки, которые вам понадобятся для начала, хотя мы скоро создадим нашу собственную библиотеку. Если с этими командами произошла какая-то ошибка, вернитесь и убедитесь, что библиотеки установлены и находятся в папке Lib в папке python. Далее мы создадим то, что я назвал библиотекой pythonlogger. Это имя не обязательно, вы можете называть его как хотите, это просто имя файла python (.py), который вы создаете.

Откройте текстовый редактор, я использую Sublime3, но блокнот работает нормально, и введите этот код.

def pythonprint ():

import pythonlogger import serial import time import csv ser = serial. Serial ('COM8') # COM8 - это последовательный порт Arduino, он, вероятно, будет отличаться для каждого пользователя, т.е. проверьте свой последовательный порт в IDE arduino ser.flushInput (), пока Верно: try: ser_bytes = ser.readline () print (ser_bytes) with open ("test_data.csv", "a") as f: writer = csv.writer (f, delimiter = ",") # устанавливает данные в быть введенным через запятую writer.writerow ([time.time (), ser_bytes]) # записывает данные в test_data.csv за исключением: print («Произошла ошибка») break

Сохраните текст как «вставьте имя нужной библиотеки».py в папку Lib. Также обратите внимание, что строка def pythonprint () определяет имя функции, которую вы собираетесь вызвать, поэтому вы можете изменить это на def «вставить имя, которое вы хотите для своей функции» (). Когда библиотека будет сохранена, мы можем перейти к коду Arduino.

Откройте IDE arduino и откройте два новых окна эскиза. Сохраните эти два файла эскиза в удобном месте, имя этих файлов не имеет значения. Затем удалите весь код по умолчанию и замените его следующим.

Для принимающей ардуино:

#включают

#include #include #include // это не используется, но необходимо для компиляции драйвера RH_ASK; struct dataStruct {float temp; }мои данные; void setup () {Serial.begin (9600); // Отладка только если (! Driver.init ()) Serial.println ("init failed"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Неблокирующий {int i; // Получено сообщение с хорошей контрольной суммой, выгружаем его. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer…. Строка etc - это тестовый код. Не нужно беспокоиться об этом, если вы не проводите диагностику и не хотите выяснить, действительно ли вы получаете данные.

Для передатчика arduino

#включают

#include #include #include // не используется, но необходимо для компиляции # include #include int pin = 4; DHT11 dht11 (контактный); Драйвер RH_ASK; struct dataStruct {float temp; }мои данные; байт tx_buf [sizeof (myData)] = {0}; // Таким образом, аргументы - это битрейт, вывод передачи (tx), // вывод вывода (rx), вывод ppt, isInverse. Последние 2 не используются.void setup () {Serial.begin (9600); // Отладка только если (! Driver.init ()) Serial.println ("init failed"); } void loop () {int err; температура плавания, влажность; uint8_t msg; если ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); байт zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // останавливаем выполнение, пока не будут отправлены все данные delay (2000); // ждем 2 секунды}}

Команд включения должно быть достаточно, но если у вас возникнут какие-либо проблемы с передачей данных позже, вы, возможно, захотите заглянуть в папку библиотеки RadioHead и включить оставшиеся имена файлов в том же формате.

Шаг 5: заставить его работать

Заставить это работать
Заставить это работать
Заставить это работать
Заставить это работать
Заставить это работать
Заставить это работать

Теперь, когда у нас есть весь код и собран Arduino, мы можем подключить Arduino к вашему компьютеру и загрузить код. Убедитесь, что вы отправляете правильный код принимающим и передающим микроконтроллерам. У вас могут быть оба arduino, подключенных к вашему компьютеру, пока он работает, но вам нужно будет убедиться, что у вас выбран правильный порт для продвижения вперед, или вы можете отключить передающий arduino и включить его от другого источника, как только код будет загружено.

Говоря об этом, вы должны выбрать порт, который подключен к принимающему Arduino, в меню инструментов IDE и запустить python.

Не открывайте серийный монитор, пока вы это делаете, python не может прочитать серийный номер, пока монитор открыт. После открытия python вызовите функцию pythonprint следующим образом.

pythonlogger.pythonprint ()

Это запустит сбор данных из последовательного порта Arduino. Если вы сейчас откроете папку python, вы увидите, что был создан новый файл.csv с именем «test_data.csv», который содержит всю информацию о времени и температуре. Это будет файл, к которому Matlab обращается для выполнения всех своих вычислений и управления.

Еще одно предупреждение: не открывайте test_data.csv во время доступа или записи данных. Если вы это сделаете, код python и / или Matlab выйдет из строя и вернет ошибку

Если вы решите открыть.csv позже, вы заметите, что столбец времени представляет собой просто очень большую строку чисел. Это потому, что команда time.time () записывает количество секунд с 1 января 1970 года.

На этом этапе python должен распечатать данные о температуре, которые он считывает из последовательного порта. Это должно выглядеть примерно так:

b'25.03 '/ r / n

Не беспокойтесь о лишних символах, код Matlab индексирует средние пять значений во втором столбце файла.csv.

Теперь, когда все поддерживающие программы работают и данные собираются, мы можем начать сбор данных GPS из мобильной программы Matlab, которая была настроена ранее, и запустить код графического интерфейса Matlab. Как только вы перейдете на вкладку «Датчик» в Matlab Mobile, выберите «GPS» и нажмите кнопку «Пуск».

Если вы новичок в Matlab Mobile, вернитесь к шагу 4 и посмотрите на снимки экрана выше. Если у вас все еще есть проблемы, убедитесь, что вы подключены к компьютеру, который вы выбрали ранее (на вкладке настроек), и используйте ссылку из команды «Connector on», чтобы проверить, что Matlab находится в сети.

Шаг 6: Использование программы

Использование программы
Использование программы

В этой системе в фоновом режиме происходит несколько вещей. Данные о температуре собираются и регистрируются arduino и pyton, Matlab собирает данные GPS с вашего телефона и выполняет вычисления, чтобы узнать, как далеко вы находитесь от своего дома, и настраивает термостат на основе всей этой информации. Вы указываете свои предпочтения.

Запустите код графического интерфейса Matlab. Откройте файл.mlapp и посмотрите на первую вкладку. Вам нужно будет собрать информацию для этого самостоятельно, эффективность и мощность вашего нагревательного / охлаждающего устройства обычно можно найти на самом устройстве, а ваша средняя скорость - это просто хорошая оценка того, насколько быстро вы едете. После ввода значений нажмите кнопку «Выполнить диагностику», и программа будет управлять вашим термостатом, чтобы собрать информацию о вашем доме.

Перейти к следующему меню.

Шаг 7: Контроль температуры

Контроль температуры
Контроль температуры

Это меню позволяет вам выбрать желаемую температуру как дома, так и вдали. Установите для Температуры №1 комфортную температуру, а для Температуры №2 - высокое или низкое значение, безопасное для вашего дома (убедитесь, что вы не устанавливаете ее на 100 градусов, пока у вас дома есть собаки и т. Д.).

Шаг 8: Исторические данные

Исторические данные
Исторические данные

Наконец, вы можете следить за тем, сколько денег вы экономите, используя автоматический контроль. По сути, это оценивает, сколько энергии было бы использовано, если бы ваш термостат был установлен на желаемую температуру 24/7, а затем вычитал фактическое количество потребляемой энергии.

Удачи в строительстве.

Рекомендуемые: