引言

在电子制作与物联网应用日益普及的今天,利用微控制器实现环境参数监测与设备控制是非常有趣且实用的项目。本文将详细介绍如何使用 Arduino Uno R3 开发板,结合 DHT11 温湿度传感器、0.96 寸 OLED 显示屏、PWM 风扇以及红绿蓝三个独立 LED,构建一个温湿度控制风扇系统。通过这个项目,我们可以实时监测环境温湿度,并根据设定的温度阈值自动调节风扇转速,同时以直观的方式在 OLED 屏幕上显示相关信息。

硬件准备

Arduino Uno R3 开发板

Arduino Uno R3 是一款广受欢迎的开源电子原型平台,它具备易用的硬件和软件特性。其拥有数字引脚和模拟引脚,能够方便地与各类传感器和执行器连接,为项目开发提供了基础支撑。

DHT11 温湿度传感器

DHT11 是一款常用的温湿度传感器,它能够实时准确地测量环境的温度和湿度数据。该传感器有三个引脚,分别为电源正极(+)、电源负极(-)和数据输出引脚(dat) 。

DHT11温湿度传感器引脚 Arduino Uno 引脚
VCC 3.3V
DAT D2
GND GND

0.96 寸 OLED 显示屏(I2C 接口)

OLED 显示屏具有自发光、对比度高、视角广等优点。0.96 寸的 OLED 显示屏通过 I2C 接口与 Arduino Uno R3 连接,仅需少量引脚即可实现数据传输与显示控制。以下是其硬件连接方式:

OLED 引脚 Arduino Uno 引脚
GND GND
VCC 5V
SDA A4
SCL A5

PWM 风扇

PWM 风扇能够通过脉冲宽度调制(PWM)信号来调节转速。它有三个引脚,分别是接地引脚(G)、电源引脚(V)和信号引脚(S)。我们将通过 Arduino 的 PWM 引脚输出信号来控制风扇转速。

PWM风扇引脚 Arduino Uno 引脚
G GND
V 5V
S D9

红绿蓝三个独立 LED

这三个 LED 用于直观地指示当前温度状态。红色 LED 代表温度过高,绿色 LED 代表温度适宜,蓝色 LED 代表温度过低。每个 LED 需要串联一个 220 - 330Ω 的电阻(如果是LED模块的话,将每个LED的IN引脚和Arduino Uno的对应引脚连接),以限制电流,保护 LED 和开发板。它们与 Arduino Uno R3 的连接引脚分别为:

LED 颜色 Arduino Uno 引脚
红色 D10
绿色 D11
蓝色 D12

软件实现

下面是整个项目的完整 Arduino 代码,它实现了温湿度数据读取、OLED 屏幕显示以及根据温度阈值控制 LED 和风扇的功能。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"

// 定义引脚
#define DHTPIN 2          // DHT11数据引脚连接到Arduino的D2
#define DHTTYPE DHT11     // DHT11类型
#define FAN_PIN 9         // 风扇控制引脚(PWM输出)
#define RED_LED_PIN 10    // 红色LED引脚
#define GREEN_LED_PIN 11  // 绿色LED引脚
#define BLUE_LED_PIN 12   // 蓝色LED引脚

// OLED显示屏设置
#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels
#define OLED_RESET    -1  // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// 创建DHT对象
DHT dht(DHTPIN, DHTTYPE);

// 温度阈值设置(摄氏度)
const float HIGH_TEMP_THRESHOLD = 30.0;  // 高温阈值
const float LOW_TEMP_THRESHOLD = 20.0;   // 低温阈值

// 风扇PWM值设置
const int HIGH_SPEED = 255;    // 高速
const int MEDIUM_SPEED = 150;  // 中速
const int LOW_SPEED = 80;      // 低速
const int OFF_SPEED = 0;       // 关闭

void setup() {
  // 初始化串口通信
  Serial.begin(9600);
  
  // 初始化DHT传感器
  dht.begin();
  
  // 初始化OLED显示屏
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 display allocation failed"));
    for(;;);
  }
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  
  // 设置LED和风扇引脚为输出模式
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);
  pinMode(BLUE_LED_PIN, OUTPUT);
  pinMode(FAN_PIN, OUTPUT);
  
  // 初始状态:所有LED熄灭,风扇停止
  digitalWrite(RED_LED_PIN, LOW);
  digitalWrite(GREEN_LED_PIN, LOW);
  digitalWrite(BLUE_LED_PIN, LOW);
  analogWrite(FAN_PIN, OFF_SPEED);
  
  // 显示启动信息
  displayStartupMessage();
  delay(2000);
}

void loop() {
  // 读取温湿度数据
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();
  
  // 检查读取是否成功
  if (isnan(temperature) || isnan(humidity)) {
    Serial.println("Failed to read from DHT sensor!");
    displayError();
    delay(2000);
    return;
  }
  
  // 控制LED和风扇
  controlLEDAndFan(temperature);
  
  // 在OLED上显示信息
  displayInfo(temperature, humidity);
  
  // 延时2秒再进行下一次读取
  delay(2000);
}

void displayStartupMessage() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("Temperature Control");
  display.println("   Fan System");
  display.println("");
  display.println("Initializing...");
  display.display();
}

void displayError() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("Error reading");
  display.println("sensor data!");
  display.display();
}

void displayInfo(float temperature, float humidity) {
  display.clearDisplay();
  display.setTextSize(1);
  
  // 标题
  display.setCursor(0, 0);
  display.println("TEMPERATURE CONTROL");
  
  // 温湿度信息
  display.setTextSize(2);
  display.setCursor(0, 15);
  display.print(temperature);
  display.print(" C");
  
  display.setCursor(0, 35);
  display.print(humidity);
  display.print(" %");
  
  // 当前状态
  display.setTextSize(1);
  display.setCursor(0, 50);
  if (temperature > HIGH_TEMP_THRESHOLD) {
    display.println("Status: TOO HOT");
  } else if (temperature < LOW_TEMP_THRESHOLD) {
    display.println("Status: TOO COLD");
  } else {
    display.println("Status: NORMAL");
  }
  
  display.display();
}

void controlLEDAndFan(float temperature) {
  // 关闭所有LED
  digitalWrite(RED_LED_PIN, LOW);
  digitalWrite(GREEN_LED_PIN, LOW);
  digitalWrite(BLUE_LED_PIN, LOW);
  
  // 根据温度控制LED和风扇
  if (temperature > HIGH_TEMP_THRESHOLD) {
    // 温度过高 - 红灯亮,风扇高速
    digitalWrite(RED_LED_PIN, HIGH);
    analogWrite(FAN_PIN, HIGH_SPEED);
  } else if (temperature < LOW_TEMP_THRESHOLD) {
    // 温度过低 - 蓝灯亮,风扇低速或关闭
    digitalWrite(BLUE_LED_PIN, HIGH);
    if (temperature < (LOW_TEMP_THRESHOLD - 5)) {
      analogWrite(FAN_PIN, OFF_SPEED); // 温度很低时完全关闭风扇
    } else {
      analogWrite(FAN_PIN, LOW_SPEED);
    }
  } else {
    // 温度适宜 - 绿灯亮,风扇中速
    digitalWrite(GREEN_LED_PIN, HIGH);
    analogWrite(FAN_PIN, MEDIUM_SPEED);
  }
}

代码详解

  1. 库引入:代码开头引入了必要的库,Wire.h用于 I2C 通信(OLED 显示屏使用),Adafruit_GFX.hAdafruit_SSD1306.h用于 OLED 显示屏的图形绘制与控制,DHT.h用于读取 DHT11 传感器数据。
  2. 引脚定义:通过宏定义明确各个传感器、执行器与 Arduino 引脚的连接关系,方便后续代码中使用。
  3. 对象创建与参数设置:创建 DHT 对象用于读取温湿度数据,设置温度阈值以及风扇在不同状态下的 PWM 值。
  4. setup 函数:初始化串口通信用于调试信息输出;初始化 DHT 传感器和 OLED 显示屏;设置 LED 和风扇引脚为输出模式,并将它们初始化为关闭状态;显示启动信息。
  5. loop 函数:循环读取温湿度数据,若读取失败则显示错误信息;根据温度值调用controlLEDAndFan函数控制 LED 和风扇状态;调用displayInfo函数在 OLED 屏幕上显示温湿度及当前状态信息,然后延时 2 秒进行下一次循环。
  6. 辅助函数displayStartupMessage函数用于在 OLED 屏幕显示启动信息;displayError函数用于在读取传感器数据失败时显示错误信息;displayInfo函数负责在 OLED 屏幕上格式化显示温湿度及状态;controlLEDAndFan函数根据温度阈值控制 LED 亮灭和风扇转速。

功能演示

温湿度监测与显示

当系统正常运行时,OLED 屏幕会实时显示当前环境的温度(单位为 °C)和湿度(单位为 %)。例如,在适宜的室内环境下,屏幕会清晰呈现当前准确的温湿度数值。

LED 指示与风扇转速调节

  • 温度过高:当温度超过 30°C 时,红色 LED 亮起,同时风扇以最高速(PWM 值为 255)运转,快速散热。
  • 温度适宜:温度处于 20°C 到 30°C 之间时,绿色 LED 亮起,风扇以中等速度(PWM 值为 150)运行,维持适宜的环境温度。
  • 温度过低:温度低于 20°C 时,蓝色 LED 亮起。若温度进一步低于 15°C,风扇停止运转(PWM 值为 0);否则以低速(PWM 值为 80)运转。

实物运行效果展示

总结与展望

通过本次项目开发,我们成功实现了一个基于 Arduino Uno R3 的温湿度控制风扇系统。该系统能够准确监测温湿度,并通过直观的显示和自动调节机制,为环境温度控制提供了有效的解决方案。在未来,可以进一步扩展该项目功能,例如添加无线通信功能,实现远程温湿度监测与控制;或者结合更多传感器,实现更复杂的环境参数综合监测与智能控制。希望本文能为对电子制作和物联网项目感兴趣的读者提供有益的参考和启发。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐