基于STM32F103C8T6的智能环境监测系统:DHT11温湿度检测与OLED显示实现

分享作者:XIUYUAN
作者昵称:XIUYUAN
评测品牌:iCEasy
评测型号:敲击模块/KY-031
发布时间:2025-09-16 10:26:54
3
概要
在嵌入式系统开发中,STM32微控制器因其强大的性能和丰富的外设接口而备受开发者青睐。本文将介绍如何使用Arduino IDE开发环境,结合STM32微控制器、OLED显示屏、DHT11温湿度传感器以及KY-031敲击传感器模块,构建一个智能环境监测与控制系统。
开源口碑分享内容

项目概述

本项目实现了一个多功能环境监测系统,具备以下功能:

       实时监测环境温度和湿度

       通过0.96寸OLED显示屏显示传感器数据和系统状态

       使用敲击传感器实现LED灯的触摸式控制

       提供直观的用户界面和状态反馈

硬件组件介绍

1. STM32开发板

本项目采用STM32F103C8T6最小系统板(Blue Pill),基于ARM Cortex-M3内核,具有丰富的GPIO接口和足够的处理能力。

2. SSD1306 OLED显示屏

128x64像素的I2C接口OLED显示屏,用于显示温湿度数据和系统状态信息。

3. DHT11温湿度传感器

数字式温湿度复合传感器,提供20-90%RH湿度测量和0-50℃温度测量范围。

4. KY-031敲击传感器模块

高灵敏度振动检测模块,可用于检测敲击或振动信号。

硬件连接方式

组件STM32引脚
OLED SDAPB7 (I2C1 SDA)
OLED SCLPB6 (I2C1 SCL)
DHT11数据线PA0
LED指示灯PA1
敲击传感器PA2

代码实现解析

以下是本项目的主要代码实现:

// cpp
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
 
// OLED显示屏设置
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
 
// 引脚定义
#define DHTPIN PA0     // DHT11连接引脚
#define LED_PIN PA1    // LED连接引脚
#define KNOCK_PIN PA2  // 敲击模块连接引脚
 
// DHT传感器设置
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
 
// 全局变量
bool ledState = false;        // LED状态,初始为关闭
unsigned long lastKnockTime = 0;  // 上次敲击时间
const unsigned long debounceDelay = 300;  // 去抖动延迟
 
void setup() {
  // 初始化串口
  Serial.begin(9600);
 
  // 初始化OLED显示屏
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // 循环直到显示屏初始化成功
  }
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
 
  // 初始化DHT传感器
  dht.begin();
 
  // 初始化引脚
  pinMode(LED_PIN, OUTPUT);
  pinMode(KNOCK_PIN, INPUT);
 
  // 初始LED状态
  digitalWrite(LED_PIN, ledState);
 
  // 显示初始信息
  updateDisplay(0, 0);
}
 
void loop() {
  // 读取DHT11传感器数据
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
 
  // 检查读取是否成功
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println(F("Failed to read from DHT sensor!"));
  } else {
    // 更新显示屏
    updateDisplay(temperature, humidity);
  }
 
  // 检测敲击信号
  int knockValue = digitalRead(KNOCK_PIN);
  unsigned long currentTime = millis();
 
  // 检测到敲击且超过去抖动时间
  if (knockValue == HIGH && currentTime - lastKnockTime > debounceDelay) {
    // 切换LED状态
    ledState = !ledState;
    digitalWrite(LED_PIN, ledState);
    lastKnockTime = currentTime;
    Serial.print(F("Knock detected! LED "));
    Serial.println(ledState ? F("ON") : F("OFF"));
  }
 
  // 延时一段时间再进行下一次检测
  delay(1000);
}
 
// 更新OLED显示内容
void updateDisplay(float temp, float humi) {
  display.clearDisplay();
 
  // 第一行居中显示"iCEazy"
  display.setTextSize(2);
  int16_t x1, y1;
  uint16_t w, h;
  String title = "iCEazy";
  display.getTextBounds(title, 0, 0, &x1, &y1, &w, &h);
  display.setCursor((SCREEN_WIDTH - w) / 2, 0);
  display.print(title);
 
  // 显示温度
  display.setTextSize(1);
  display.setCursor(0, 24);
  display.print(F("Temperature: "));
  display.print(temp);
  display.print(F(" C"));
 
  // 显示湿度
  display.setCursor(0, 36);
  display.print(F("Humidity: "));
  display.print(humi);
  display.print(F(" %"));
 
  // 显示LED状态
  display.setCursor(0, 48);
  display.print(F("LED State: "));
  display.print(ledState ? F("ON") : F("OFF"));
 
  display.display();
}

开发板选择图(关于这一步部分可以见 CSDN 或自行在Arduino IDE中配置STM32开发环境)

可运行的实物图

关键功能解析

1. 显示屏初始化与使用

代码中使用Adafruit SSD1306库驱动OLED显示屏,通过I2C接口与STM32通信。显示屏用于实时展示环境数据和系统状态。

2. 传感器数据读取

DHT11传感器通过单总线协议通信,代码中使用DHT库简化数据读取过程,每秒钟更新一次数据。

3. 敲击检测与去抖动处理

敲击传感器模块检测到振动时会输出高电平信号。代码中实现了去抖动逻辑,防止多次误触发,确保每次敲击只触发一次状态切换。

4. 用户界面设计

显示屏布局经过精心设计,顶部显示项目名称,中间区域显示温湿度数据,底部显示LED状态,信息层次清晰。


实际应用与扩展

本系统可应用于多种场景:家庭环境监测站、实验室环境监控、智能家居控制接口等;

可能的功能扩展:添加更多环境传感器(如光照、气压)、实现数据记录和回放功能、添加无线通信模块(Wi-Fi或蓝牙)、开发手机APP远程监控等。


总结

本项目展示了如何使用STM32微控制器与常用传感器模块构建一个实用的环境监测系统。通过Arduino IDE开发环境,即使初学者也能快速上手STM32开发。代码结构清晰,功能完整,提供了良好的扩展基础。

以上代码和项目设计仅供参考,实际实施时请根据具体硬件版本调整引脚配置和库版本。欢迎在评论区分享您的实现经验和改进建议!

全部评论
暂无评论
0/144