ПМК 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! Требования к реализации:

  1. Подключить датчик DHT22 к цифровому пину (например, D2).

  2. Подключить LCD-дисплей по I²C (SDA → A4, SCL → A5). Определить адрес дисплея (0x27, 0x3F или другой).

  3. Использовать библиотеки: DHT.h, Wire.h, LiquidCrystal_I²C.h.

  4. Обеспечить защиту от ложных срабатываний — проверять возвращаемые значения на NaN.

  5. Перед выводом новых данных необходимо очищать соответствующие позиции на дисплее или выводить поверх старых данных (использовать пробелы при необходимости).

  6. Между измерениями должна быть пауза не менее 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

Требования к реализации:

  1. Подключить датчик BMP180 по интерфейсу I²C (SDA → A4, SCL → A5). Дисплей подключен к той же шине I²C.

  2. Использовать библиотеки: SFE_BMP180.h, Wire.h, LiquidCrystal_I²C.h.

  3. Реализовать корректную обработку ошибок на каждом этапе. При любой ошибке на дисплей выводится сообщение BMP180 ERROR на первой строке и код ошибки на второй (например, INIT FAIL, TEMP FAIL, PRESS FAIL).

  4. Для пересчета использовать коэффициент: 1 гПа = 0,7500637554192 мм рт. ст.

  5. Переключение страниц организовать с помощью millis() (без использования delay для длительных пауз).

  6. Обеспечить сохранение температуры на обеих страницах. Ожидаемый результат: На LCD-дисплее циклически переключаются две страницы с отображением температуры и давления в разных единицах измерения. Данные обновляются каждые 5 секунд (полный цикл измерений).

Задание 3 (Продвинутый уровень). Ультразвуковой дальномер с фильтрацией и выводом на

LCD-дисплей Условие: Разработать программу для Arduino, которая измеряет расстояние до препятствия с помощью датчика HC-SR04 и выводит его на LCD-дисплей. Для повышения точности необходимо реализовать медианную фильтрацию: брать 5 измерений подряд, отбрасывать минимальное и максимальное значение, а из оставшихся трех вычислять среднее арифметическое. Результат выводить в сантиметрах.

Формат вывода:

  • Первая строка: Distance:
  • Вторая строка: 123 cm Если дальномер не обнаруживает препятствие (превышение таймаута), на дисплей

выводится:

  • Первая строка: No object
  • Вторая строка: detected Для визуализации процесса измерения и фильтрации предусмотреть режим отладки

(включение нажатием кнопки, подключенной к пину D3):

  • При нажатой кнопке на дисплей вместо отфильтрованного значения выводятся все 5 сырых измерений в формате: R: 12 13 11 14 12 (на второй строке).

Требования к реализации:

  1. Подключить датчик HC-SR04 (Trig → D12, Echo → D11).

  2. Подключить кнопку (D3) с подтяжкой к питанию (INPUT_PULLUP).

  3. Реализовать функцию int getFilteredDistance(), которая возвращает отфильтрованное расстояние в сантиметрах (целое число).

  4. Функция pulseIn() должна использоваться с таймаутом 30 мс.

  5. Измерения производить каждые 500 мс.

  6. Организовать антидребезг для кнопки.

  7. Обновлять показания на дисплее только при изменении значения (чтобы избежать лишнего мерцания). Ожидаемый результат: В обычном режиме на дисплее отображается стабильное расстояние до объекта. При нажатии кнопки студент видит сырые данные для оценки эффективности фильтрации.

Задание 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

Требования к реализации:

  1. Все датчики подключаются одновременно:
  • 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)
  1. Использовать библиотеки: DHT.h, SFE_BMP180.h, Wire.h, LiquidCrystal_I²C.h.

  2. Обновление показаний датчиков производить каждые 3 секунды (кроме дальномера — он опрашивается каждые 500 мс, но на дисплей выводится последнее измерение).

  3. Предусмотреть корректную обработку ошибок:

  • При сбое DHT22 на странице 1 выводить T:ERR H:ERR
  • При сбое BMP180 на странице 2 выводить PRESS ERR на обеих строках
  • При отсутствии сигнала HC-SR04 на странице 3 выводить No object
  1. Организовать переключение страниц с помощью millis().
  2. Для дальномера применить фильтрацию из Задания 3.
  3. Предусмотреть индикацию текущей страницы (например, мигающий курсор или символ в правом верхнем углу: "1", "2", "3").

Дополнительное требование повышенной сложности:

Реализовать возможность принудительного переключения страниц с помощью энкодера или двух кнопок (D3 — следующая страница, D4 — предыдущая). При отсутствии нажатий в течение 10 секунд возвращаться в автоматический циклический режим. Ожидаемый результат: На LCD-дисплей циклически выводятся три страницы с актуальными данными от всех датчиков. При возникновении ошибок отображаются соответствующие сообщения. Система работает стабильно, без зависаний.

Задание 5 (Экспертный уровень). Распределенная система сбора данных по UART с

выводом на LCD-дисплей Условие: Разработать программу для двух плат Arduino, организовав между ними обмен данными по UART. Первая плата (Master) выполняет роль центра сбора данных: она опрашивает датчики DHT22 и BMP180, а также управляет LCD-дисплеем. Вторая плата (Slave) обслуживает ультразвуковой дальномер HC-SR04 и отправляет результаты измерений на Master по запросу.

Схема взаимодействия:

  1. Master каждые 2 секунды отправляет Slave команду "GET_DIST" (один байт, например 0x01).

  2. Slave, получив команду, выполняет одно измерение расстояния (с фильтрацией из Задания 3) и отправляет результат обратно на Master в виде двух байтов (целое число от 0 до 400 см, старший и младший байт).

  3. Master принимает данные от Slave, объединяет их со своими показаниями и выводит на LCD-дисплей.

Формат вывода на LCD-дисплей (единый, без переключения страниц):

Первая строка:

T:23.5C H:45.2%

Вторая строка:

P:759.9 D:123cm

Индикация статуса связи:

  • Если ответ от Slave получен успешно — в правом верхнем углу первой строки выводится символ "S" (Slave connected).

  • Если ответ не получен (таймаут) — в правом верхнем углу выводится символ "X" (Slave disconnected), а вместо расстояния на второй строке выводится D: ---.

Требования к реализации:

  1. Подключение:
  • 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 между платами обязателен!

  1. Организовать обмен данными на скорости 9600 бод.

  2. На Slave реализовать обработку входящей команды и отправку ответа. При получении неизвестной команды Slave должен игнорировать её.

  3. На Master предусмотреть таймаут ожидания ответа от Slave (100 мс). Если ответ не получен, на дисплее вместо расстояния выводить "---".

  4. Использовать аппаратный UART (Serial).

  5. Для синхронизации опроса датчиков на Master использовать millis().

  6. Упаковка числа в два байта: byte high = distance / 256; byte low = distance % 256;

  7. Распаковка на 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; – описание алгоритма работы собранного устройства; – текст программ, содержащий необходимые комментарии и пояснения; – описание особенностей подключения библиотек и функции, которые были использованы из импортированных библиотек; – общие выводы по работе.

Контрольные вопросы для защиты работы:

  1. Почему для DHT22 необходима задержка между измерениями не менее 2 секунд?
  2. Как определить адрес I²C устройства, если он неизвестен?
  3. В чем отличие синхронного и асинхронного интерфейсов? К какому типу относится

I²C?

  1. Для чего в шине I²C используются подтягивающие резисторы и где они находятся в вашей схеме?

  2. Каким образом программа определяет, что датчик HC-SR04 не обнаружил препятствие?

  3. Почему при работе с BMP180 необходимо сначала измерять температуру, а только потом давление?

  4. Какие преимущества дает медианная фильтрация по сравнению с простым усреднением?

  5. Как организовать неблокирующие задержки в Arduino с помощью millis() и почему это важно при работе с LCD-дисплеем?

  6. Что произойдет на шине I²C, если два устройства (BMP180 и LCD) попытаются передавать данные одновременно?

  7. Как изменить адрес I²C устройства (на примере LCD-адаптера PCF8574)?

  8. Какие проблемы могут возникнуть при использовании нескольких устройств на одной шине I²C и как их избежать?

  9. Почему при UART-соединении двух плат необходимо соединять их земли (GND)?

  10. Что такое "таймаут" и зачем он нужен при ожидании ответа от Slave-устройства?

  11. Как организовать хранение калибровочных коэффициентов в EEPROM и зачем это нужно?

  12. Какие способы экономии выводов микроконтроллера использованы в вашей схеме?


← Практическая работа №4 · Практическая работа №6 →

Оригинал материала на GitHub