在物联网和智能家居项目中,环境监测是一个常见的应用场景。今天,我们将通过一个简单的项目,使用 Arduino Uno、MQ2 烟雾传感器、DHT11 温湿度传感器、LED、0.96 寸 OLED 显示屏(I2C)、光敏传感器和低电平触发蜂鸣器,来实现一个完整的环境监测系统。这个项目不仅适合初学者,还能为更复杂的项目提供基础。
硬件材料
- Arduino Uno:作为项目的控制核心,负责数据采集和显示控制。
- MQ2 烟雾传感器:用于检测环境中的烟雾浓度。
- DHT11 温湿度传感器:用于测量环境的温度和湿度。
- 0.96 寸 OLED 显示屏(I2C):用于显示温湿度、烟雾浓度和光照强度数据。
- 光敏传感器:用于检测环境光照强度。
- LED:用于在光照过低时发出提示。
- 低电平触发蜂鸣器:用于在烟雾浓度过高时发出警报。
- 杜邦线:用于连接各个组件。
- 面包板(可选):方便进行电路搭建和测试。
硬件连接
DHT11 温湿度传感器
- VCC 连接到 Arduino Uno 的 5V 引脚。
- GND 连接到 Arduino Uno 的 GND 引脚。
- DATA 连接到 Arduino Uno 的 D2 引脚。
0.96 寸 OLED 显示屏(I2C)
- VCC 连接到 Arduino Uno 的 5V 引脚。
- GND 连接到 Arduino Uno 的 GND 引脚。
- SCL 连接到 Arduino Uno 的 A5 引脚。
- SDA 连接到 Arduino Uno 的 A4 引脚。
MQ2 烟雾传感器
- VCC 连接到 Arduino Uno 的 5V 引脚。
- GND 连接到 Arduino Uno 的 GND 引脚。
- A0 连接到 Arduino Uno 的 A0 引脚。
光敏传感器
- VCC 连接到 Arduino Uno 的 5V 引脚。
- GND 连接到 Arduino Uno 的 GND 引脚。
- A0 连接到 Arduino Uno 的 A1 引脚。
LED
- 阳极(长脚) 连接到 Arduino Uno 的 D3 引脚。
- 阴极(短脚) 连接到 Arduino Uno 的 GND 引脚。
低电平触发蜂鸣器
- VCC 连接到 Arduino Uno 的 5V 引脚。
- GND 连接到 Arduino Uno 的 GND 引脚。
- 控制引脚 连接到 Arduino Uno 的 D4 引脚。
软件库
确保已经安装了以下库:
- Adafruit GFX Library
- Adafruit SSD1306 Library
- DHT Library
可以通过 Arduino IDE 的“库管理器”安装这些库:
- 打开 Arduino IDE,点击“草图”->“包含库”->“管理库...”。
- 在库管理器中搜索并安装
Adafruit GFX Library
、Adafruit SSD1306 Library
和DHT Library
。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#define SCREEN_WIDTH 128 // OLED显示屏幕的宽度,以像素计
#define SCREEN_HEIGHT 64 // OLED显示屏幕的高度,以像素计
#define OLED_RESET -1 // 重置引脚;如果不使用可以设置为 -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define DHTPIN 2 // 定义DHT11传感器连接到Arduino的数字引脚
#define DHTTYPE DHT11 // 定义使用的传感器类型
DHT dht(DHTPIN, DHTTYPE);
#define MQ2_PIN A0 // 定义MQ2传感器连接到Arduino的模拟引脚
#define LIGHT_SENSOR_PIN A1 // 定义光敏传感器连接到Arduino的模拟引脚
#define LED_PIN 3 // 定义LED连接到Arduino的数字引脚
#define BUZZER_PIN 4 // 定义蜂鸣器连接到Arduino的数字引脚
void setup() {
Serial.begin(9600);
// 初始化OLED显示屏
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 这里的0x3C是OLED的I2C地址,根据实际情况可能需要修改
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
// 显示屏初始化
display.clearDisplay();
display.setTextSize(1); // 设置文本大小
display.setTextColor(SSD1306_WHITE); // 设置文本颜色
display.setCursor(0, 0); // 设置文本开始的坐标
display.println(F("环境监测系统")); // 打印文本
display.display(); // 显示以上图形操作
delay(2000); // 稍作延时
// 启动DHT传感器
dht.begin();
// 初始化LED和蜂鸣器
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
// 读取温湿度数据
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// 读取烟雾浓度
int smokeValue = analogRead(MQ2_PIN);
// 读取光照强度
int lightValue = analogRead(LIGHT_SENSOR_PIN);
// 检查是否有读取错误
if (isnan(temperature) || isnan(humidity)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// 清除显示屏内容
display.clearDisplay();
// 显示温度
display.setTextSize(1); // 设置文本大小
display.setTextColor(SSD1306_WHITE); // 设置文本颜色
display.setCursor(0, 0); // 设置文本开始的坐标
display.print(F("Temp: "));
display.print(temperature);
display.print(F(" C"));
// 显示湿度
display.setCursor(0, 10); // 设置文本开始的坐标
display.print(F("humi: "));
display.print(humidity);
display.print(F(" %"));
// 显示烟雾浓度
display.setCursor(0, 20); // 设置文本开始的坐标
display.print(F("fog: "));
display.print(smokeValue);
// 显示光照强度
display.setCursor(0, 30); // 设置文本开始的坐标
display.print(F("light: "));
display.print(lightValue);
// 显示图形
display.display();
// 检测光照强度
if (lightValue > 100) {
digitalWrite(LED_PIN, HIGH); // 光照过低,点亮LED
} else {
digitalWrite(LED_PIN, LOW); // 光照正常,关闭LED
}
// 检测烟雾浓度
if (smokeValue > 520) {
digitalWrite(BUZZER_PIN, LOW); // 烟雾浓度过高,触发蜂鸣器
} else {
digitalWrite(BUZZER_PIN, HIGH); // 烟雾浓度正常,关闭蜂鸣器
}
delay(2000); // 稍作延时
}