ПМК 3 курс Практические задания 05 Практическая работа 5 - BysonHunter/Tavrich_college GitHub Wiki
🏠 Главная · Программирование микроконтроллеров · 3 курс · Практические работы по программированию микроконтроллеров — 3 курс
Практическая работа №5
Тема: «Разработка системы сбора данных с датчиков и выводом на LCD»
Текст описания, целей и постановки заданий сохранён по исходному PDF. Технические замечания ниже исправляют или уточняют только обнаруженные неоднозначности и ошибки.
Технические корректировки и уточнения
- В задании 3 описан не классический медианный фильтр, а усечённое среднее: из 5 измерений удаляются минимум и максимум, а оставшиеся 3 усредняются.
- Пять сырых значений расстояния не всегда помещаются в одну строку LCD1602; их следует выводить на двух строках или страницах.
- В задании 5 тайм-аут Master 100 мс может быть меньше времени пяти измерений HC-SR04 при
pulseIn(..., 30000). Следует увеличить тайм-аут ответа или уменьшить число/тайм-аут измерений. - Калибровка HC-SR04 «в отсутствие препятствий» не позволяет определить систематическое смещение. Корректная калибровка выполняется по мишени на известном расстоянии.
- Аппаратный UART D0/D1 Arduino Uno одновременно связан с USB-UART; это необходимо учитывать при прошивке и отладке двухплатной схемы.
Описание работы и задания
Тема работы: Разработка программного обеспечения для микроконтроллерных систем сбора данных с датчиков температуры, влажности, давления и расстояния с последующим отображением информации на LCD-дисплее.
Цель работы: Закрепление практических навыков программирования микроконтроллеров
Arduino для работы с цифровыми датчиками (DHT22, BMP180, HC-SR04), освоение различных интерфейсов передачи данных (UART, I²C) и методов визуализации информации на LCD-дисплее с интерфейсом I²C.
Студент должен знать:
-
Принципы работы датчиков температуры/влажности (DHT22), давления (BMP180) и ультразвукового дальномера (HC-SR04)
-
Особенности интерфейсов UART и I²C, их отличия и области применения
-
Протоколы обмена данными с датчиками по последовательным интерфейсам
-
Методы подключения и программирования LCD-дисплея через I²C
-
Способы обработки и фильтрации данных от датчиков
-
Принципы организации задержек и временных интервалов в микроконтроллерных системах
-
Особенности совместного использования нескольких устройств на одной шине I²C Студент должен уметь:
-
Подключать датчики к микроконтроллеру в соответствии с их распиновкой
-
Использовать стандартные библиотеки для работы с датчиками (DHT.h, SFE_BMP180.h, Wire.h, LiquidCrystal_I²C.h)
-
Определять и указывать корректный адрес I²C устройства в программе
-
Разрабатывать программы циклического опроса датчиков
-
Выводить информацию на LCD-дисплей в удобном для чтения формате с правильным позиционированием курсора
-
Обрабатывать ошибки чтения данных и предусматривать защиту от зависаний
-
Комбинировать работу нескольких датчиков в одном проекте
-
Организовывать обмен данными между двумя микроконтроллерами Практические навыки, приобретаемые студентом:
-
Навыки подключения цифровых датчиков к микроконтроллеру
-
Навыки программирования алгоритмов опроса датчиков с учетом временных ограничений
-
Навыки отладки программ через монитор последовательного порта и через LCDдисплей
-
Навыки работы с LCD-дисплеем и вывода форматированного текста с фиксированным положением курсора
-
Навыки совместного использования нескольких устройств на одной шине I²C (датчик BMP180 и LCD-дисплей)
-
Навыки разработки законченных измерительных систем с визуализацией данных на встроенном дисплее
-
Навыки организации связи между микроконтроллерами
-
Навыки создания многостраничных интерфейсов на LCD-дисплее Важное примечание! Во всех заданиях вывод информации осуществляется только на LCD-дисплей. Монитор последовательного порта может использоваться для отладки, но не является обязательным требованием.
Задания Для Практической Работы
Задание 1 (Базовый уровень). Мониторинг температуры и влажности с выводом на LCDдисплей
Условие: Разработать программу для Arduino, которая каждые 2 секунды считывает показания температуры и влажности с датчика DHT22 и выводит их на LCD-дисплей 1602 с I²C адаптером.
Формат вывода:
-
Первая строка: T:23.5C
-
Вторая строка: H:45.2% При ошибке чтения датчика программа должна выводить на дисплей:
-
Первая строка: DHT22 ERROR
-
Вторая строка: Check sensor! Требования к реализации:
-
Подключить датчик DHT22 к цифровому пину (например, D2).
-
Подключить LCD-дисплей по I²C (SDA → A4, SCL → A5). Определить адрес дисплея (0x27, 0x3F или другой).
-
Использовать библиотеки: DHT.h, Wire.h, LiquidCrystal_I²C.h.
-
Обеспечить защиту от ложных срабатываний — проверять возвращаемые значения на NaN.
-
Перед выводом новых данных необходимо очищать соответствующие позиции на дисплее или выводить поверх старых данных (использовать пробелы при необходимости).
-
Между измерениями должна быть пауза не менее 2 секунд. Ожидаемый результат: На LCD-дисплее каждые 2 секунды обновляются показания температуры и влажности. При отключении датчика или ошибке чтения выводится сообщение об ошибке.
Задание 2 (Средний уровень). Измерение атмосферного давления с выводом на LCDдисплей
Условие: Разработать программу для Arduino, которая каждые 5 секунд измеряет атмосферное давление с помощью датчика BMP180 и выводит его на LCD-дисплей в двух единицах измерения: гектопаскалях (гПа) и миллиметрах ртутного столба (мм рт. ст.). Также необходимо выводить текущую температуру датчика.
Формат вывода:
- Первая строка: T:24.3C P:hPa
- Вторая строка: P:759.9mmHg Поскольку в одной строке не умещаются все данные, информация должна
циклически переключаться между двумя страницами:
Страница 1 (первые 3 секунды):
T:24.3C
P:1013.2hPa
Страница 2 (следующие 3 секунды):
T:24.3C
P:759.9mmHg
Требования к реализации:
-
Подключить датчик BMP180 по интерфейсу I²C (SDA → A4, SCL → A5). Дисплей подключен к той же шине I²C.
-
Использовать библиотеки: SFE_BMP180.h, Wire.h, LiquidCrystal_I²C.h.
-
Реализовать корректную обработку ошибок на каждом этапе. При любой ошибке на дисплей выводится сообщение BMP180 ERROR на первой строке и код ошибки на второй (например, INIT FAIL, TEMP FAIL, PRESS FAIL).
-
Для пересчета использовать коэффициент: 1 гПа = 0,7500637554192 мм рт. ст.
-
Переключение страниц организовать с помощью millis() (без использования delay для длительных пауз).
-
Обеспечить сохранение температуры на обеих страницах. Ожидаемый результат: На LCD-дисплее циклически переключаются две страницы с отображением температуры и давления в разных единицах измерения. Данные обновляются каждые 5 секунд (полный цикл измерений).
Задание 3 (Продвинутый уровень). Ультразвуковой дальномер с фильтрацией и выводом на
LCD-дисплей Условие: Разработать программу для Arduino, которая измеряет расстояние до препятствия с помощью датчика HC-SR04 и выводит его на LCD-дисплей. Для повышения точности необходимо реализовать медианную фильтрацию: брать 5 измерений подряд, отбрасывать минимальное и максимальное значение, а из оставшихся трех вычислять среднее арифметическое. Результат выводить в сантиметрах.
Формат вывода:
- Первая строка: Distance:
- Вторая строка: 123 cm Если дальномер не обнаруживает препятствие (превышение таймаута), на дисплей
выводится:
- Первая строка: No object
- Вторая строка: detected Для визуализации процесса измерения и фильтрации предусмотреть режим отладки
(включение нажатием кнопки, подключенной к пину D3):
- При нажатой кнопке на дисплей вместо отфильтрованного значения выводятся все 5 сырых измерений в формате: R: 12 13 11 14 12 (на второй строке).
Требования к реализации:
-
Подключить датчик HC-SR04 (Trig → D12, Echo → D11).
-
Подключить кнопку (D3) с подтяжкой к питанию (INPUT_PULLUP).
-
Реализовать функцию int getFilteredDistance(), которая возвращает отфильтрованное расстояние в сантиметрах (целое число).
-
Функция pulseIn() должна использоваться с таймаутом 30 мс.
-
Измерения производить каждые 500 мс.
-
Организовать антидребезг для кнопки.
-
Обновлять показания на дисплее только при изменении значения (чтобы избежать лишнего мерцания). Ожидаемый результат: В обычном режиме на дисплее отображается стабильное расстояние до объекта. При нажатии кнопки студент видит сырые данные для оценки эффективности фильтрации.
Задание 4 (Высокий уровень). Многофункциональная метеостанция с выводом на LCDдисплей
Условие: Разработать программу для Arduino, которая объединяет работу всех трех датчиков (DHT22, BMP180, HC-SR04) и выводит информацию на LCD-дисплей 1602 с I²C адаптером. Дисплей должен циклически отображать три страницы информации,
переключаясь каждые 4 секунды:
Страница 1 (температура и влажность):
T:23.5C H:45.2%
Страница 2 (давление):
P:759.9mmHg 1013.2hPa
Страница 3 (расстояние):
Distance:
123cm
Требования к реализации:
- Все датчики подключаются одновременно:
- DHT22 — цифровой пин D2
- BMP180 — I²C (SDA A4, SCL A5)
- HC-SR04 — Trig D12, Echo D11
- LCD 1602 I²C — I²C (SDA A4, SCL A5) (совместно с BMP180)
-
Использовать библиотеки: DHT.h, SFE_BMP180.h, Wire.h, LiquidCrystal_I²C.h.
-
Обновление показаний датчиков производить каждые 3 секунды (кроме дальномера — он опрашивается каждые 500 мс, но на дисплей выводится последнее измерение).
-
Предусмотреть корректную обработку ошибок:
- При сбое DHT22 на странице 1 выводить T:ERR H:ERR
- При сбое BMP180 на странице 2 выводить PRESS ERR на обеих строках
- При отсутствии сигнала HC-SR04 на странице 3 выводить No object
- Организовать переключение страниц с помощью millis().
- Для дальномера применить фильтрацию из Задания 3.
- Предусмотреть индикацию текущей страницы (например, мигающий курсор или символ в правом верхнем углу: "1", "2", "3").
Дополнительное требование повышенной сложности:
Реализовать возможность принудительного переключения страниц с помощью энкодера или двух кнопок (D3 — следующая страница, D4 — предыдущая). При отсутствии нажатий в течение 10 секунд возвращаться в автоматический циклический режим. Ожидаемый результат: На LCD-дисплей циклически выводятся три страницы с актуальными данными от всех датчиков. При возникновении ошибок отображаются соответствующие сообщения. Система работает стабильно, без зависаний.
Задание 5 (Экспертный уровень). Распределенная система сбора данных по UART с
выводом на LCD-дисплей Условие: Разработать программу для двух плат Arduino, организовав между ними обмен данными по UART. Первая плата (Master) выполняет роль центра сбора данных: она опрашивает датчики DHT22 и BMP180, а также управляет LCD-дисплеем. Вторая плата (Slave) обслуживает ультразвуковой дальномер HC-SR04 и отправляет результаты измерений на Master по запросу.
Схема взаимодействия:
-
Master каждые 2 секунды отправляет Slave команду "GET_DIST" (один байт, например 0x01).
-
Slave, получив команду, выполняет одно измерение расстояния (с фильтрацией из Задания 3) и отправляет результат обратно на Master в виде двух байтов (целое число от 0 до 400 см, старший и младший байт).
-
Master принимает данные от Slave, объединяет их со своими показаниями и выводит на LCD-дисплей.
Формат вывода на LCD-дисплей (единый, без переключения страниц):
Первая строка:
T:23.5C H:45.2%
Вторая строка:
P:759.9 D:123cm
Индикация статуса связи:
-
Если ответ от Slave получен успешно — в правом верхнем углу первой строки выводится символ "S" (Slave connected).
-
Если ответ не получен (таймаут) — в правом верхнем углу выводится символ "X" (Slave disconnected), а вместо расстояния на второй строке выводится D: ---.
Требования к реализации:
- Подключение:
-
Master Arduino: DHT22 (D2), BMP180 (I²C), LCD 1602 I²C (I²C), UART TX(D1) → RX Slave, UART RX(D0) ← TX Slave.
-
Slave Arduino: HC-SR04 (Trig D12, Echo D11), UART RX(D0) ← TX Master, UART TX(D1) → RX Master.
-
Общий GND между платами обязателен!
-
Организовать обмен данными на скорости 9600 бод.
-
На Slave реализовать обработку входящей команды и отправку ответа. При получении неизвестной команды Slave должен игнорировать её.
-
На Master предусмотреть таймаут ожидания ответа от Slave (100 мс). Если ответ не получен, на дисплее вместо расстояния выводить "---".
-
Использовать аппаратный UART (Serial).
-
Для синхронизации опроса датчиков на Master использовать millis().
-
Упаковка числа в два байта: byte high = distance / 256; byte low = distance % 256;
-
Распаковка на Master: int dist = high * 256 + low; Дополнительное требование повышенной сложности:
Реализовать на Slave возможность калибровки дальномера по команде с Master. При отправке команды "CALIB" (0x02) Slave должен выполнить 10 измерений в отсутствие препятствий, вычислить среднее смещение (если есть систематическая ошибка) и использовать этот коэффициент для коррекции всех последующих измерений. Результат калибровки должен сохраняться в EEPROM Slave. Ожидаемый результат: Две платы Arduino обмениваются данными по UART. На LCD-дисплее, подключенном к Master, отображаются все четыре параметра (температура, влажность, давление, расстояние). При отключении Slave-платы Master продолжает выводить данные с локальных датчиков, а вместо расстояния отображает "---", и в углу экрана появляется индикатор "X". При подключении Slave обратно, данные о расстоянии восстанавливаются, индикатор меняется на "S".
Содержание Отчета
Отчёт о выполнении лабораторной работы должен содержать:
– титульный лист с номером и названием работы;
– цель работы;
– краткие теоретические сведения о подключаемых устройствах и особенностях их
работы; – схемы соединения элементов, выполненные в программе Fritzing или Tinkercad; – описание алгоритма работы собранного устройства; – текст программ, содержащий необходимые комментарии и пояснения; – описание особенностей подключения библиотек и функции, которые были использованы из импортированных библиотек; – общие выводы по работе.
Контрольные вопросы для защиты работы:
- Почему для DHT22 необходима задержка между измерениями не менее 2 секунд?
- Как определить адрес I²C устройства, если он неизвестен?
- В чем отличие синхронного и асинхронного интерфейсов? К какому типу относится
I²C?
-
Для чего в шине I²C используются подтягивающие резисторы и где они находятся в вашей схеме?
-
Каким образом программа определяет, что датчик HC-SR04 не обнаружил препятствие?
-
Почему при работе с BMP180 необходимо сначала измерять температуру, а только потом давление?
-
Какие преимущества дает медианная фильтрация по сравнению с простым усреднением?
-
Как организовать неблокирующие задержки в Arduino с помощью millis() и почему это важно при работе с LCD-дисплеем?
-
Что произойдет на шине I²C, если два устройства (BMP180 и LCD) попытаются передавать данные одновременно?
-
Как изменить адрес I²C устройства (на примере LCD-адаптера PCF8574)?
-
Какие проблемы могут возникнуть при использовании нескольких устройств на одной шине I²C и как их избежать?
-
Почему при UART-соединении двух плат необходимо соединять их земли (GND)?
-
Что такое "таймаут" и зачем он нужен при ожидании ответа от Slave-устройства?
-
Как организовать хранение калибровочных коэффициентов в EEPROM и зачем это нужно?
-
Какие способы экономии выводов микроконтроллера использованы в вашей схеме?