项目概述
本项目实现了一个多功能环境监测系统,具备以下功能:
实时监测环境温度和湿度
通过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 SDA | PB7 (I2C1 SDA) |
| OLED SCL | PB6 (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开发。代码结构清晰,功能完整,提供了良好的扩展基础。
以上代码和项目设计仅供参考,实际实施时请根据具体硬件版本调整引脚配置和库版本。欢迎在评论区分享您的实现经验和改进建议!
