repkatech
repkatech
407 просмотров0 комментариев

Проект “Метеостанция”

#PWM #UART #I2C #SPI #CAN

Это статья №1 цикла статей с примерами проектов на базе Repka Pi 4

Первый проект нашего цикла - система для мониторинга погодных условий в реальном времени или метеостанция. Это проект “Метеостанция”, разработанный и доступный в рамках учебно-методического комплекса на базе одноплатного компьютера Repka PI 4. Проект будет собираться с использованием компонентов учебно-методический комплекса УМК “REPKA”. Монтажные и принципиальные схемы и подробное описание можно найти в разделе "Примеры готовых проектов" учебного пособия УМК “REPKA”, а в рамках статьи будут даны так же инструкции для более простого монтажа в домашних условиях.

Построим пример такого проекта с использованием датчика BME280, который измеряет атмосферное давление, температуру и влажность, а отображение данных реализуем на ЖК дисплее 1602 I2C и в консоли одноплатника Repka Pi.

Также все необходимые материалы и схемы подключения доступны в репозитории на платформе Gitflic.

Используемые в проекте компоненты

1. Датчик атмосферного давления и температуры (BME280) см. рисунок 1. Измеряет атмосферное давление, температуру и влажность.

2. ЖК дисплей (1602 I2C). Отображает показания с датчика BME280 и позволяет пользователю видеть информацию о текущих погодных условиях.

Вы можете приобрести все необходимые компоненты отдельно от "Учебно-методический комплекс REPKA". Ссылки на модули приведены в таблице ниже.

Компонент Ссылка на приобретение
Монтажная/макетная плата Ссылка
Шлейф Ссылка
Переходник с шлейфа на макетную плату Ссылка
Соединительные провода

Провода соединительные м-п

Провода соединительные п-п

Провода соединительные п-п

Датчик атмосферного давления и температуры (BME280) Ссылка
ЖК дисплей (1602 I2C) Ссылка

Подготовительный этап

1. Подключим дополнительное питание 5V к макетной плате:

2. После чего выведем дополнительное питание на макетную плату:

3. Подключим переходник с шлейфа на макетную плату:

4. Соединим шлейф с переходником для подключения к макетной плате и Repka Pi 4:

5. Итоговый результат должен выглядеть таким образом:

Сборка проекта

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

Для разработки кода будет использоваться текстовый редактор Geany, который входит в состав стандартного ПО Репка ОС.

Электрическая принципиальная схема

Монтажная схема

Т-образная расширительная плата GPIO полностью повторяет конфигурацию распиновки:

1. Подключение датчика BME280.

Как видно из рисунков 3 и 4 датчик подключается через интерфейс I2C и питается от 3.3V.

1.1. Подключаем BME280 к макетной плате согласно таблице 1:

Макетная плата BME280
3.3V VIN
GND GND
SCL1 SCL
SDA1 SDA

Таблица 1. Подключение датчика BME280 к макетной плате.

1.2.  Результат подключения будет выглядеть следующим образом, см. рисунок 5:

2. Для проверки правильности подключения используем Python скрипт из репозитория repka-pi_iot-examples.

2.1. Клонируем репозиторий:

git clone git@gitflic.ru:repka_pi/repka-pi_iot-examples.git

2.2. Переходим в репозиторий:

cd repka-pi_iot-examples/

2.3. Выполним установку зависимостей.

2.3.1. Если хотите установить зависимости только для датчик атмосферного давления и температуры (BME280), выполните:

make setup-bme280

2.3.2. Если хотите установить зависимости для всех датчиков и проектов, выполните:

make setup-all

2.4. Запускаем скрипт для проверки:

make bme280

2.5. Если на этапе 2.4. возникает ошибка, то измените в python скрипте, который находится по пути: /devices/sensors/BME280_example/py, номер шины – bus_number, если ошибок нет, то пропустите данный пункт.

 # Укажите номер шины
bus_number = 1 
# Инициализация I2C-шины
bus = SMBus(bus_number)
sensor = BME280(i2c_dev=bus)  # Инициализация

2.6. Из рисунка 6 видим, что скрипт успешно выполнился, нам удалось считать показания с датчика.

3. Подключение ЖК дисплея (1602 I2C).

Из рисунков 3 и 4 видно, что устройство подключается аналогично датчику BME280 по интерфейсу I2c, но питается уже от 5V.

3.1. Выполним подключение к макетной плате согласно таблице 2.

Макетная плата

1602 I2C

5V

VCC

GND

GND

SCL1

SCL

SDA1

SDA

Таблица 2. Подключение ЖК дисплея (1602 I2C) к макетной плате.

3.2. Результат подключения будет выглядеть следующим образом, см. рисунок 7:

4. Аналогично пункту 2 выполним проверку подключения датчика:

4.1. Установим зависимости для ЖК дисплея (1602 I2C), выполнив:

make setup-display-1602-i2c

4.2. Выполните команду:

make display-1602-i2c

4.3. Как видно из рисунка 8 датчик успешно подключен.

Запуск проекта

Теперь, когда все компоненты подключены, можно запустить проект "Метеостанция". Для этого в репозитории repka-pi_iot-examples выполняем команду:

make weather-station

Данные о температуре, давлении и влажности теперь отображаются на дисплее и выводятся в консоль, см. рисунок 9 и 10.

Вы можете собрать более бюджетную версию данного проекта.

Для более бюджетной реализации проекта можно обойтись без активного охлаждения, используя Repka Pi 4 в стандартной комплектации, а также макетную плату без внешнего источника питания — при этом остальные компоненты остаются неизменными.

Для подключения нам потребуется “Распиновка портов на 40 pin разъёме на Repka Pi 4“, см. изображение ниже.

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

5. В соответствии с таблицей 1 и рисунком 13, выполним подключение датчика BME280:

Проверка подключения датчика осуществляется аналогично пункту 2.

6. В соответствии с таблицей 2 и рисунком, выполним подключение ЖК дисплея (1602 I2C):

Питание устройств также можно осуществлять с использованием:

Внимание! Подаваемое напряжение не должно превышать 5 В.

А. Лабораторного блока питания:

Б. Аккумуляторного блока питания:

Проверка подключения датчика осуществляется аналогично пункту 4.

Разбор кода проекта.

Проект реализован на языке python. Для того чтобы понять логику работы программы рассмотрите блок схему ниже:

Используется парсер аргументов командной строки для задания номера I2C-шины и адреса дисплея:

parser = argparse.ArgumentParser(description="BME280 + LCD1602 I2C вывод в консоль и на дисплей")
parser.add_argument('--bus', type=int, default=1, help="I2C шина (по умолчанию 1)")
parser.add_argument('--lcd_addr', type=lambda x: int(x,0), default=0x27, help="Адрес LCD дисплея (например, 0x27)")
args = parser.parse_args()

Инициализация I2C-шины, датчика BME280 и LCD-дисплея:

bus = SMBus(args.bus)
sensor = BME280(i2c_dev=bus)
lcd = CharLCD('PCF8574', args.lcd_addr)

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

try:
    while True:
        temperature = sensor.get_temperature()
        pressure = sensor.get_pressure()
        humidity = sensor.get_humidity()

Значения выводятся в консоль:

print(f"Температура = {temperature:.2f} °C")
        print(f"Давление    = {pressure:.2f} hPa")
        print(f"Влажность   = {humidity:.2f} %")
        print("-------------------------------")

Дисплей очищается и на него выводятся новые значения:

lcd.clear()
        lcd.write_string(f"T:{temperature:.1f}C P:{pressure:.0f}hPa")
        lcd.crlf()
        lcd.write_string(f"H:{humidity:.1f}%")

Пауза 4 секунды перед следующим измерением:

time.sleep(4)

При прерывании программы (Ctrl+C) дисплей очищается и выводится сообщение о завершении:

except KeyboardInterrupt:
    lcd.clear()
    print("Завершение работы")

Пример кода выше с использованием ООП #

Класс WeatherStation инкапсулирует всю логику работы погодной станции. Это делает код более структурированным, удобным для расширения и повторного использования:

class WeatherStation:

Метод init отвечает за инициализацию всех устройств (I2C, датчик, дисплей) при создании экземпляра класса:

    def __init__(self, bus_num=1, lcd_addr=0x27):
        """
        Конструктор класса. Здесь происходит инициализация всех необходимых устройств:
        - I2C-шины
        - датчика BME280
        - LCD-дисплея
        """
        self.bus = SMBus(bus_num)
        self.sensor = BME280(i2c_dev=self.bus)
        self.lcd = CharLCD('PCF8574', lcd_addr)


Метод read_data
изолирует логику получения данных с датчика, возвращая сразу все необходимые параметры:

    def read_data(self):
        """
        Считывает данные с датчика BME280.
        Возвращает кортеж: (температура, давление, влажность)
        """
        temperature = self.sensor.get_temperature()
        pressure = self.sensor.get_pressure()
        humidity = self.sensor.get_humidity()
        return temperature, pressure, humidity

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

    def display_data(self, temperature, pressure, humidity):
        """
        Очищает дисплей и выводит на него новые значения температуры, давления и влажности.
        """
        self.lcd.clear()
        self.lcd.write_string(f"T:{temperature:.1f}C P:{pressure:.0f}hPa")
        self.lcd.crlf()
        self.lcd.write_string(f"H:{humidity:.1f}%")
    def print_data(self, temperature, pressure, humidity):
        """
        Выводит значения температуры, давления и влажности в консоль.
        """
        print(f"Температура = {temperature:.2f} °C")
        print(f"Давление    = {pressure:.2f} hPa")
        print(f"Влажность   = {humidity:.2f} %")
        print("-------------------------------")

Метод run реализует основной рабочий цикл станции: опрос датчика, вывод данных, ожидание, обработка прерывания:

    def run(self):
        """
        Основной цикл работы станции: периодически считывает данные, выводит их на дисплей и в консоль.
        Ожидает 4 секунды между обновлениями.
        При прерывании работы очищает дисплей и завершает выполнение.
        """
        try:
            while True:
                temperature, pressure, humidity = self.read_data()
                self.print_data(temperature, pressure, humidity)
                self.display_data(temperature, pressure, humidity)
                time.sleep(4)
        except KeyboardInterrupt:
            self.lcd.clear()
            print("Завершение работы")

Блок if name == "_main_": позволяет использовать этот файл как самостоятельную программу или как модуль для импорта в другие проекты.

if __name__ == "__main__":
    # Создаём экземпляр класса WeatherStation с нужными параметрами (можно изменить при необходимости)
    station = WeatherStation(bus_num=1, lcd_addr=0x27)
    # Запускаем основной цикл работы станции
    station.run()

Преимущества ООП-подхода:

1. Модульность и повторное использование кода

В ООП каждая функциональная часть системы (например, работа с датчиком, реле, дисплеем) оформляется в виде отдельного класса.

Это позволяет легко переиспользовать эти классы в других проектах или расширять функциональность без переписывания кода.

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


2. Упрощение поддержки и масштабирования

Код, разделённый на классы с чётко определённой ответственностью, проще читать, тестировать и отлаживать.

Если возникает ошибка или требуется доработка, достаточно изменить только соответствующий класс, не затрагивая остальной код.

Это особенно важно для сложных или развивающихся проектов, где часто появляются новые требования.


3. Инкапсуляция и защита данных

ООП позволяет скрыть внутренние детали реализации (например, работу с I2C или обработку ошибок) внутри класса.

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

Это снижает вероятность ошибок, связанных с неправильным использованием компонентов, и делает интерфейс системы более понятным и безопасным.

Практическая значимость проекта:

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

Метеостанция может также стать полезным инструментом для наблюдения за изменениями микроклимата, а также для анализа влияния погодных условий на окружающую среду. В сельском хозяйстве, например, она может помочь оптимизировать аграрные процессы, предупреждая о неблагоприятных климатических явлениях.

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

Расширение проекта

Проект "Метеостанция" можно значительно расширить, добавив новые функциональные возможности. Например, можно интегрировать дополнительные датчики, такие как:

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

Датчик UV-излучения — для измерения уровня ультрафиолетового излучения, что может быть полезно для контроля солнечной активности.

Сенсоры качества воздуха — для мониторинга загрязнения воздуха в реальном времени.

Глобальная система позиционирования (GPS) — для отслеживания точных координат метеостанции и анализа данных по географическому расположению.

Видеообзор проекта

Для более детального ознакомления с проектом, вы можете посмотреть видеообзор на платформе Rutube:

Пример использования с Python

Проект полностью реализован на языке Python. Код для работы с метеостанцией можно найти в репозитории на платформе Gitflic.


Комментарии (0)

Для участия в обсуждении Вы должны быть авторизованным пользователем

Еще посты по теме

Новые посты



Темы

Навигация

ВойтиРегистрация