Панель мониторинга городской среды, разработанная на базе 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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose