Панель мониторинга городской среды, разработанная на базе STM32 (шум окружающей среды, температура и влажность окружающей среды, концентрация пыли)
Панель мониторинга городской среды, разработанная на базе STM32 (шум окружающей среды, температура и влажность окружающей среды, концентрация пыли)

1. Предисловие

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

Этот проект основан на панели мониторинга городской среды, разработанной с использованием STM32 для обеспечения мониторинга и сбора данных в реальном времени о шуме городской среды, температуре, влажности и концентрации пыли. Основной чип управления использует STM32F103C8T6, который обладает высокой производительностью и стабильностью и может эффективно обрабатывать данные, собранные различными датчиками; датчик шума окружающей среды использует АЦП для вывода аналоговых сигналов для представления интенсивности шума окружающей среды, что может точно измерять городской шум окружающей среды; датчик температуры и влажности использует DHT1 1. Он обладает преимуществами высокой точности, быстрого реагирования и низкой стоимости и может точно измерять температуру и влажность городской среды; модуль концентрации пыли использует модуль обнаружения концентрации пыли PM2.5 GP2Y10, который может быстро обнаруживать PM2. .5 концентрация пыли в городском воздухе в режиме реального времени, обеспечивающая поддержку данных для контроля загрязнения окружающей среды.

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

2. Общая дизайнерская идея проекта.

2.1 Идеи дизайна оборудования

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

(2) Выбор датчика: датчик шума окружающей среды использует АЦП для вывода аналогового сигнала, представляющего интенсивность шума окружающей среды. Здесь вы можете выбрать в качестве датчика обычный конденсаторный микрофон или микрофон MEMS. Датчик температуры и влажности окружающей среды использует DHT11, который представляет собой цифровой датчик температуры и влажности с характеристиками низкой стоимости и быстрого реагирования. Модуль концентрации пыли использует GP2Y10, который представляет собой датчик пыли с лазерным рассеянием, который может обнаруживать концентрацию пыли PM2,5 в воздухе в режиме реального времени.

(3) Способ подключения: Чтобы подключить датчик к основной микросхеме управления, вы можете использовать аналоговый входной канал для подключения выхода датчика шума окружающей среды и подключить датчик DHT11 и датчик GP2Y10 через порт GPIO.

(4) Конструкция источника питания: выберите соответствующие модули питания в соответствии с системными требованиями, чтобы обеспечить стабильное электропитание системы.

2.2 Идеи дизайна программного обеспечения

(1) Инициализация системы: инициализируйте систему в начале программы, включая инициализацию порта GPIO, инициализацию модуля АЦП и т. д.

(2) Сбор данных датчиков: сбор данных от датчиков шума окружающей среды, температуры, влажности и концентрации пыли через порт GPIO основного чипа управления или модуля АЦП. Для датчиков шума окружающей среды используйте модуль АЦП для преобразования аналоговых сигналов в цифровые величины для датчиков DHT11 и GP2Y10, считывайте их цифровой выход напрямую;

(3) Обработка и отображение данных: обрабатывайте собранные данные датчиков и отображайте результаты в реальном времени через ЖК-дисплей или другие методы вывода. Соответствующие алгоритмы могут быть разработаны для фильтрации, исправления или преобразования данных в читаемый формат. В то же время в соответствии с различными диапазонами данных могут быть установлены соответствующие пороговые значения, позволяющие определить, достигает ли состояние окружающей среды уровня предупреждения.

(4) Сетевая связь: передача данных на терминалы удаленного мониторинга и облачные платформы через сетевой модуль (ESP8266) для удаленного мониторинга и хранения данных. Такие протоколы, как HTTP и MQTT, могут использоваться для передачи данных, чтобы обеспечить безопасность и надежность данных.

(5) Управление системой: Разработайте соответствующий пользовательский интерфейс и метод управления, чтобы пользователи могли удобно управлять этим проектом. Переключение системы, настройку параметров и другие операции можно выполнять с помощью кнопок, сенсорного экрана или беспроводного пульта дистанционного управления.

3. Подключение оборудования

(1) Датчик шума окружающей среды (выход аналогового сигнала):

Подключите аналоговый выход датчика к одному из входных каналов АЦП (PA0) STM32.

(2) Датчик температуры и влажности окружающей среды (DHT11):

Подключите вывод VCC DHT11 к источнику питания 3,3 В STM32.

Подключите контакт GND DHT11 к контакту GND STM32.

Подключите контакт DATA DHT11 к входному контакту GPIO (PB0) STM32.

(3) Модуль концентрации пыли (GP2Y10):

Подключите вывод VCC GP2Y10 к источнику питания 3,3 В STM32.

Подключите контакт GND GP2Y10 к контакту GND STM32.

Подключите вывод Vo GP2Y10 к входному каналу АЦП (PA1) STM32.

(4) OLED-дисплей (0,96-дюймовый OLED):

Подключите контакт SDA OLED-дисплея к контакту SDA (PB7) шины I2C STM32.

Подключите вывод SCL OLED-дисплея к выводу SCL (PB6) шины I2C STM32.

Подключите контакт VCC OLED-дисплея к источнику питания 3,3 В STM32.

Подключите контакт GND OLED-дисплея к контакту GND STM32.

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

4.1 Основной код ядра

Язык кода:javascript
копировать
// Инициализируйте модули GPIO и ADC.
// Включить шину I2C
// Инициализируйте драйвер OLED-дисплея

// Циклически считывать данные датчика и отображать их.
while(1) {
    // Считывает аналоговый сигнал датчика шума окружающей среды и преобразует его в цифровое значение.
    int noise = read_adc();
  
    // Считайте температуру и влажность датчика DHT11 через данные GPIO.
    float temperature, humidity;
    read_DHT11(&temperature, &humidity);
  
    // Считайте аналоговый сигнал напряжения концентрации пыли и преобразуйте его в значение концентрации частиц PM2,5.
    float dust_level = read_GP2Y10();
  
    // Отображение прочитанных данных на OLED-экране
    oled_clear();
    oled_print_string("Noise: " + noise + "dB");
    oled_print_string("Temp: " + temperature + "C");
    oled_print_string("Humidity: " + humidity + "%");
    oled_print_string("Dust Level: " + dust_level + "ug/m^3");

    // Установите пороговые значения оповещений и поднимайте оповещения по мере необходимости.
    if (noise > 70 || temperature > 30 || dust_level > 50) {
        beep_alarm();
    }
  
    // Подождите некоторое время, прежде чем перейти к следующему циклу.
    delay_ms(1000);
}

4.2 Код подфункции модуля

Язык кода:javascript
копировать
#include "stm32f1xx_hal.h"
#include "ssd1306.h"

void GPIO_Init(void) {
    // Инициализация контактов GPIO
    
    // Установите аналоговый входной контакт датчика шума окружающей среды в режим аналогового входа.
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;  // Включить часы GPIOA
    GPIOA->CRL &= ~GPIO_CRL_MODE0;      // Сбросьте бит MODE0 в регистре режима.
    GPIOA->CRL &= ~GPIO_CRL_CNF0;       // Сбросьте бит CNF0 в регистре конфигурации.

    // Установите вывод DATA DHT11 в режим подтягивающего входа.
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;  // Включить часы GPIOB
    GPIOB->CRL &= ~GPIO_CRL_MODE0;      // Сбросьте бит MODE0 в регистре режима.
    GPIOB->CRL &= ~GPIO_CRL_CNF0_0;     // Сбросьте бит CNF0 в регистре конфигурации.
    GPIOB->CRL |= GPIO_CRL_CNF0_1;      // Установите режим подтягивающего ввода

    // Инициализируйте другие контакты GPIO, такие как контакт Vo GP2Y10, контакты шины I2C и т. д.
}

void ADC_Init(void) {
    // Инициализируйте модуль АЦП
    
    // Включить тактовую частоту АЦП1
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; 
    
    // Конфигурацияканалов АЦП и времени выборки
    ADC1->SMPR2 |= ADC_SMPR2_SMP0_2;   // Установите канал АЦП на 0-й канал и установите время выборки на 28,5 циклов.
    
    // Конфигурация Режим преобразования АЦП — режим одиночного преобразования.
    ADC1->CR2 &= ~ADC_CR2_CONT;        // Отключите режим непрерывного преобразования и используйте режим одиночного преобразования.
    
    // КонфигурацияADC преобразует источник триггера в программный триггер.
    ADC1->CR2 &= ~ADC_CR2_EXTSEL;      // Очистить бит выбора внешнего триггера
    ADC1->CR2 |= ADC_CR2_EXTSEL_0;     // Установите режим программного триггера
    
    // Включить модуль АЦП
    ADC1->CR2 |= ADC_CR2_ADON;
}

void I2C_Init(void) {
    // Инициализируйте шину I2C
    
    // Включить часы I2C1
    RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
    
    // Конфигурация Тактовая частота шины I2C
    I2C1->CR2 |= 36;   // Конфигурация на основе тактовой частоты системы и желаемой скорости шины I2C.
    
    // Конфигурация режима шины I2C и адреса устройства
    I2C1->CR1 &= ~I2C_CR1_SMBUS;  // Выключить режим SMBus
    I2C1->CR1 |= I2C_CR1_PE;      // Включить шину I2C
    
    // Конфигурация контактов GPIO шины I2C
    
    // Установите вывод SCL в режим выхода с открытым стоком.
    GPIOB->CRH |= GPIO_CRH_MODE6_0;
    GPIOB->CRH &= ~GPIO_CRH_MODE6_1;
    GPIOB->CRH |= GPIO_CRH_CNF6_0;
    GPIOB->CRH |= GPIO_CRH_CNF6_1;
    
    // Установите вывод SDA в режим вывода с открытым стоком.
    GPIOB->CRH |= GPIO_CRH_MODE7_0;
    GPIOB->CRH &= ~GPIO_CRH_MODE7_1;
    GPIOB->CRH |= GPIO_CRH_CNF7_0;
    GPIOB->CRH |= GPIO_CRH_CNF7_1;
}

void OLED_Init(void) {
    // Инициализируйте драйвер OLED-дисплея
    
    ssd1306_Init();  // использовать SSD1306 Инициализация драйвера
}

void System_Init(void) {
    // Инициализируйте компоненты системы
    
    HAL_Init();   // использоватьHALбиблиотека для инициализации,Если нет библиотеки использоватьHAL,可以根据芯片厂商提供的библиотека для инициализации
    
    GPIO_Init();  // Инициализировать GPIO
    ADC_Init();   // Инициализируйте модуль АЦП
    I2C_Init();   // Инициализируйте шину I2C
    OLED_Init();  // Инициализируйте драйвер OLED-дисплея
}

4.3 Код драйвера OLED

Язык кода:javascript
копировать
#include "stm32f10x.h"
#include "OLED.h"

#define OLED_CS_GPIO    GPIOB
#define OLED_CS_PIN     GPIO_Pin_12
#define OLED_DC_GPIO    GPIOB
#define OLED_DC_PIN     GPIO_Pin_13
#define OLED_RST_GPIO   GPIOB
#define OLED_RST_PIN    GPIO_Pin_14

void Delay_ms(uint16_t time) {
    while(time--) {
        uint16_t i = 12000;  // Задержка около 1 мс.
        while(i--);
    }
}

void GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ДАВАТЬ ВОЗМОЖНОСТЬ);

    // CS-приколоть Конфигурация
    GPIO_InitStruct.GPIO_Pin = OLED_CS_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed ​​= GPIO_Speed_50 МГц;
    GPIO_Init(OLED_CS_GPIO, &GPIO_InitStruct);
    
    // DCприколоть Конфигурация    GPIO_InitStruct.GPIO_Pin = OLED_DC_PIN;
    GPIO_Init(OLED_DC_GPIO, &GPIO_InitStruct);
    
    // Конфигурация контактов RST
    GPIO_InitStruct.GPIO_Pin = OLED_RST_PIN;
    GPIO_Init(OLED_RST_GPIO, &GPIO_InitStruct);
}

void SPI_Init(void) {
    SPI_InitTypeDef SPI_InitStruct;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

    // Конфигурация шины SPI
    SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
    SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI1, &SPI_InitStruct);

    SPI_Cmd(SPI1, ENABLE);
}

void OLED_WriteCmd(uint8_t cmd) {
    GPIO_ResetBits(OLED_CS_GPIO, OLED_CS_PIN);  // Сигнал выбора чипа понижается, и начинается передача команды данных.
    GPIO_ResetBits(OLED_DC_GPIO, OLED_DC_PIN);  // Сигнал постоянного тока понижается, что указывает на отправку команды.
    SPI_SendData8(SPI1, cmd);                   // Отправить команду
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
    GPIO_SetBits(OLED_CS_GPIO, OLED_CS_PIN);    // Сигнал выбора чипа повышается до высокого уровня, чтобы завершить передачу команды данных.
}

void OLED_WriteData(uint8_t data) {
    GPIO_ResetBits(OLED_CS_GPIO, OLED_CS_PIN);  // Сигнал выбора чипа понижается и начинается передача.
    GPIO_SetBits(OLED_DC_GPIO, OLED_DC_PIN);    // Сигнал постоянного тока повышается, что указывает на отправку данных.
    SPI_SendData8(SPI1,data);                  // отправлятьданные    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
    GPIO_SetBits(OLED_CS_GPIO, OLED_CS_PIN);    // Сигнал выбора чипа повышается до высокого уровня, чтобы завершить передачу данных.
}

void OLED_Init(void) {
    GPIO_Init();
    SPI_Init();
    
    GPIO_SetBits(OLED_RST_GPIO, OLED_RST_PIN);  // OLED сброс
    Delay_ms(100);
    GPIO_ResetBits(OLED_RST_GPIO, OLED_RST_PIN);
    Delay_ms(100);
    GPIO_SetBits(OLED_RST_GPIO, OLED_RST_PIN);

    OLED_WriteCmd(0xAE);  // Выключить OLED-дисплей
    OLED_WriteCmd(0x20);  // Установите режим адреса памяти: режим горизонтальной адреса
    OLED_WriteCmd(0x10);  // Установите старшие четыре бита адреса
    OLED_WriteCmd(0xb0);  // Установить начальное поведение на 0
    OLED_WriteCmd(0xc8);  // Установить направление сканирования: сверху вниз.
    OLED_WriteCmd(0x00);  // Установите младшие восемь бит адреса
    OLED_WriteCmd(0x10);  // Установите старшие четыре бита адреса
    OLED_WriteCmd(0x40);  // Установите начальный столбец на 0
    OLED_WriteCmd(0x81);  // Установить контроль контрастности
    OLED_WriteCmd(0xff);  // Значение контрастности (0–255)
    OLED_WriteCmd(0xa1);  // Установить переназначение сегментов
    OLED_WriteCmd(0xa6);  // Установите режим нормального/обратного отображения: нормальный дисплей.
    OLED_WriteCmd(0xa8);  // Установить коэффициент мультиплексирования
    OLED_WriteCmd(0x3F);  // Чем больше значение, тем выше яркость
    OLED_WriteCmd(0xa4);  // Установить глобальное отображение: включить отображение
    OLED_WriteCmd(0xd3);  // Установить смещение дисплея
    OLED_WriteCmd(0x00);  // Без смещения
    OLED_WriteCmd(0xd5);  // Установить частотный раздел
    OLED_WriteCmd(0xf0);  // частотное разделение
    OLED_WriteCmd(0xd9);  // Установить цикл предварительной зарядки
    OLED_WriteCmd(0x22);  // Чем больше значение, тем слабее яркость
    OLED_WriteCmd(0xda);  // Установить метод сканирования оборудования COM
    OLED_WriteCmd(0x12);  // Сканировать по столбцу
    OLED_WriteCmd(0xdb);  // Установите увеличение напряжения VCOMH
    OLED_WriteCmd(0x20);  // 1.00*VCC
    OLED_WriteCmd(0x8d);  // Установите переключатель подкачивающего насоса
    OLED_WriteCmd(0x14);  // Включите зарядный насос
    OLED_WriteCmd(0xaf);  // Включите OLED-дисплей
}

void OLED_Puts(uint8_t x, uint8_t y, char *str) {
    uint8_t i = 0;
    while(str[i] != '\0') {
        OLED_SetCursor(x + i * 6, y);
        for(uint8_t j = 0; j < 6; j++) {
            OLED_WriteData(Font_6x8[(str[i] - 32) * 6 + j]);
        }
        i++;
    }
}

int OLED(void) {
    OLED_Init();
    OLED_Clear();
}

5. Резюме

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

Используя АЦП для сбора аналогового сигнала, выдаваемого датчиком шума окружающей среды, и в сочетании с алгоритмом обработки система может точно измерять уровень шума в окружающей среде. Датчик температуры и влажности DHT11 предоставляет точные данные о температуре и влажности, которые помогают понять комфорт и изменения в городской среде. Кроме того, с помощью модуля определения концентрации пыли PM2.5 GP2Y10 можно получить информацию о концентрации мелких твердых частиц в городском воздухе для оценки состояния качества воздуха.

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

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

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

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода