Оглавление:
- Шаг 1. Собираем все вместе
- Шаг 2: Получатель
- Шаг 3: передатчик
- Шаг 4: Код
- Шаг 5: заставить его работать
- Шаг 6: Использование программы
- Шаг 7: Контроль температуры
- Шаг 8: Исторические данные
Видео: Автостат: дистанционный термостат: 8 шагов (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:52
Вероятно, вы задаетесь вопросом: «Зачем вы делаете еще один дистанционный термостат?»
Ответ на этот вопрос таков: «Умные термостаты» на рынке слишком дороги.
Справедливое предупреждение, это «пробная» сборка, которая потребует нескольких дополнительных выходов для фактического управления вашим термостатом, но ядро на месте и может быть изменено в зависимости от ваших конкретных обстоятельств. Кроме того, это все еще работа, поэтому ожидайте несколько обновлений и изменений (особенно в коде 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, а затем вычитал фактическое количество потребляемой энергии.
Удачи в строительстве.
Рекомендуемые:
Дистанционный демонтаж бункера для посуды: 8 шагов
Dish Hopper Remote Teardown: это руководство покажет вам, как разобрать пульт Dish Hopper. Предупреждение: вы можете сломать хотя бы одну защелку, удерживающую контроллер. Не волнуйтесь, у контроллера много зажимов снаружи, и вы даже не заметите
Baby MIT Cheetah Robot V2 автономный и дистанционный: 22 шага (с изображениями)
Baby MIT Cheetah Robot V2 Автономный и RC: Очень-очень жаль Теперь, когда проблема с конструкцией ног в tinkercad была обнаружена, спасибо Mr.kjellgnilsson.kn за проверку и проинформирование меня. Теперь измените файл дизайна и загрузите. Пожалуйста, проверьте и загрузите. Тем, кто уже скачал и распечатал, я очень
ИК-ДИСТАНЦИОННЫЙ ДЕКОДЕР С ИСПОЛЬЗОВАНИЕМ ARDUINO: 4 шага (с изображениями)
ИК-ДИСТАНЦИОННЫЙ ДЕКОДЕР С ИСПОЛЬЗОВАНИЕМ ARDUINO: это еще одно удобное руководство по созданию очень простого ИК-удаленного декодера с использованием Arduino и ИК-приемника. В этом руководстве будет рассмотрено все, от настройки программного обеспечения до использования ИК-приемника и декодирования сигналов. Эти
Как сделать дистанционный тестер с транзистором C945: 6 шагов
Как сделать удаленный тестер с транзистором C945: Привет друг, сегодня я собираюсь сделать схему удаленного тестера с транзистором C945 и фотодиодом. Мы можем использовать эту схему для проверки всех пультов. Давайте начнем
ИНФРАКРАСНЫЙ ДИСТАНЦИОННЫЙ УПРАВЛЕНИЕ ROBOCAR ИСПОЛЬЗУЕТ AVR (ATMEGA32) MCU: 5 шагов
ИНФРАКРАСНЫЙ ДИСТАНЦИОННЫЙ УПРАВЛЯЕМЫЙ ROBOCAR, ИСПОЛЬЗУЮЩИЙ AVR (ATMEGA32) MCU: В настоящем ПРОЕКТЕ описывается конструкция и реализация инфракрасного (ИК) дистанционного управления RoboCar, который может использоваться для различных автоматизированных приложений беспилотного управления. Я разработал RoboCar с дистанционным управлением (движение влево-вправо / вперед-назад). Т