问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于STM32F103C8T6的智能温度监测系统设计

创作时间:
作者:
@小白创作中心

基于STM32F103C8T6的智能温度监测系统设计

引用
亚马逊官方网站
8
来源
1.
https://www.amazon.com/EC-Buying-Non-Contact-Temperature-Acquisition/dp/B0B63K5V7T
2.
https://www.amazon.com/Teyleten-Robot-MLX90614-MLX90614ESF-Temperature/dp/B0CLDGFQYS
3.
https://github.com/AhmedSamymoh/Firmware-Over-The-Air
4.
https://news.mit.edu/2024/mit-derived-algorithm-helps-forecast-frequency-extreme-weather-0326
5.
https://community.st.com/t5/stm32-mcus-products/stm32-for-high-speed-adc-gt-100-msps/td-p/731722
6.
https://www.sciencedirect.com/science/article/abs/pii/S1359431124002394
7.
https://community.st.com/t5/stm32-mcus-products/adc-measurement-noise-on-stm32g0-based-mcus/td-p/646002
8.
https://community.st.com/t5/stm32-mcus-embedded-software/adc-read-maximizing-precision-and-accuracy/td-p/654969

随着物联网技术的快速发展,智能温度监测系统在工业控制、智能家居、环境监测等领域发挥着越来越重要的作用。基于STM32F103C8T6单片机的温度监测系统,以其高集成度、低功耗和强大的处理能力,成为众多开发者的选择。本文将详细介绍如何利用STM32F103C8T6和GY-906温度传感器,设计一个具有无线数据传输功能的智能温度监测系统。

01

硬件选型与设计

为什么选择STM32F103C8T6?

STM32F103C8T6是意法半导体(STMicroelectronics)推出的一款基于Cortex-M3内核的32位微控制器,具有以下特点:

  1. 高性能:运行频率可达72MHz,提供充足的处理能力
  2. 丰富的外设:集成多个定时器、USART、SPI、I2C等通信接口
  3. ADC性能:具有12位分辨率的ADC,采样速率可达1MSPS
  4. 低功耗:多种低功耗模式,适合电池供电应用
  5. 成本优势:在高性能微控制器中具有较高的性价比

温度传感器GY-906

GY-906是一款非接触式红外温度传感器,基于MLX90614红外传感器芯片,具有以下特点:

  1. 测量范围:-70°C至+380°C
  2. 精度:±0.5°C(在-20°C至+50°C范围内)
  3. 接口:支持I2C和PWM输出
  4. 使用方便:模块化设计,易于集成

硬件连接

  1. STM32F103C8T6与GY-906的连接

    • VCC连接到3.3V电源
    • GND接地
    • SDA连接到STM32的PB7
    • SCL连接到STM32的PB6
  2. STM32F103C8T6与ESP8266的连接

    • VCC连接到3.3V电源
    • GND接地
    • TXD连接到STM32的PA2(USART2_RX)
    • RXD连接到STM32的PA3(USART2_TX)
02

软件设计

ADC配置

在本设计中,我们将使用STM32F103C8T6的ADC来读取温度传感器的模拟信号。以下是ADC配置的关键参数:

ADC_HandleTypeDef hadc;

void MX_ADC_Init(void) {
    hadc.Instance = ADC1;
    hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    hadc.Init.Resolution = ADC_RESOLUTION_12B;
    hadc.Init.ScanConvMode = DISABLE;
    hadc.Init.ContinuousConvMode = DISABLE;
    hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    hadc.Init.DMAContinuousRequests = DISABLE;
    hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    if (HAL_ADC_Init(&hadc) != HAL_OK) {
        // 错误处理
    }

    ADC_ChannelConfTypeDef sConfig = {0};
    sConfig.Channel = ADC_CHANNEL_0; // 对应PA0
    sConfig.Rank = 1;
    sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
    if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) {
        // 错误处理
    }
}

温度数据读取

由于GY-906是通过I2C接口通信,我们需要使用I2C协议来读取温度数据。以下是一个简单的读取函数:

#include "stm32f1xx_hal.h"
#include "i2c.h"

#define MLX90614_I2C_ADDRESS 0x5A
#define MLX90614_TA_REGISTER 0x06
#define MLX90614_TOBJ1_REGISTER 0x07

float read_temperature() {
    uint16_t raw_temp = 0;
    uint8_t data[2];

    HAL_I2C_Mem_Read(&hi2c1, MLX90614_I2C_ADDRESS << 1, MLX90614_TOBJ1_REGISTER, I2C_MEMADD_SIZE_8BIT, data, 2, HAL_MAX_DELAY);

    raw_temp = (data[0] << 8) | data[1];
    float temperature = (raw_temp * 0.02) - 273.15; // 转换为摄氏度

    return temperature;
}

数据传输

为了实现无线数据传输,我们使用ESP8266作为WiFi模块。以下是一个简单的数据发送示例:

#include "stm32f1xx_hal.h"
#include "usart.h"

void send_data_to_esp8266(float temperature) {
    char buffer[50];
    sprintf(buffer, "AT+CIPSEND=0,%d\r\n", strlen(buffer));
    HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
    sprintf(buffer, "%f\r\n", temperature);
    HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
}
03

数据分析与预测

为了增加系统的智能化程度,我们可以对温度数据进行简单的趋势预测。这里我们采用移动平均法进行预测:

#define MOVING_AVERAGE_SIZE 10
float temperature_buffer[MOVING_AVERAGE_SIZE];
uint8_t buffer_index = 0;

void update_temperature_buffer(float temperature) {
    temperature_buffer[buffer_index] = temperature;
    buffer_index = (buffer_index + 1) % MOVING_AVERAGE_SIZE;
}

float predict_temperature() {
    float sum = 0;
    for (int i = 0; i < MOVING_AVERAGE_SIZE; i++) {
        sum += temperature_buffer[i];
    }
    return sum / MOVING_AVERAGE_SIZE;
}
04

系统运行流程

  1. 系统上电后,STM32F103C8T6初始化ADC、I2C和USART等外设
  2. 通过I2C读取GY-906的温度数据
  3. 将温度数据通过USART发送给ESP8266
  4. ESP8266将数据上传到云端服务器
  5. 云端服务器对数据进行存储和分析,用户可以通过手机APP查看实时温度和历史数据

通过以上步骤,我们构建了一个完整的智能温度监测系统。该系统不仅能够实时监测环境温度,还能通过无线网络将数据传输到云端,实现远程监控和数据分析。这种设计在智能家居、工业控制、环境监测等领域具有广泛的应用前景。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号