基于Arduino Uno的多彩LED灯光秀与环境监测系统
创作时间:
作者:
@小白创作中心
基于Arduino Uno的多彩LED灯光秀与环境监测系统
引用
CSDN
1.
https://m.blog.csdn.net/2301_78925693/article/details/145213679
在这个项目中,我们将构建一个集成了多彩LED灯光秀和环境监测功能的系统。该系统将使用Arduino Uno作为核心控制器,结合0.96英寸OLED显示屏、DS3231实时时钟模块和DHT11温湿度传感器。系统将通过OLED显示屏显示当前时间和温湿度信息,同时控制红色、黄色、绿色、蓝色和白色LED灯,实现多种灯光变换效果。
硬件组件
- Arduino Uno:作为项目的控制核心。
- 0.96英寸OLED显示屏(I2C接口):显示时间、温湿度信息。
- DS3231实时时钟模块:提供准确的时间信息。
- DHT11温湿度传感器:监测环境的温度和湿度。
- 红色、黄色、绿色、蓝色、白色LED:用于灯光秀。
硬件连接
1. OLED显示屏(I2C接口)
- VCC连接到 Arduino Uno 的 5V 引脚
- GND连接到 Arduino Uno 的 GND 引脚
- SDA连接到 Arduino Uno 的 A4 引脚
- SCL连接到 Arduino Uno 的 A5 引脚
2. DS3231实时时钟模块(I2C接口)
- VCC连接到 Arduino Uno 的 5V 引脚
- GND连接到 Arduino Uno 的 GND 引脚
- SDA连接到 Arduino Uno 的 A4 引脚
- SCL连接到 Arduino Uno 的 A5 引脚
3. DHT11温湿度传感器
- VCC连接到 Arduino Uno 的 5V 引脚
- DATA连接到 Arduino Uno 的数字引脚 2
- GND连接到 Arduino Uno 的 GND 引脚
4. LED
- 红色LED: 连接到 Arduino Uno 的数字引脚 3
- 黄色LED:连接到 Arduino Uno 的数字引脚 4
- 绿色LED:连接到 Arduino Uno 的数字引脚 5
- 蓝色LED:连接到 Arduino Uno 的数字引脚 6
- 白色LED:连接到 Arduino Uno 的数字引脚 7
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <RTClib.h>
#define SCREEN_WIDTH 128 // OLED显示屏幕的宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED显示屏幕的高度,以像素为单位
#define OLED_RESET -1 // 重置引脚,如果不使用可以设置为 -1
#define DHTPIN 2 // DHT11的数据引脚连接到数字引脚2
#define DHTTYPE DHT11 // DHT 11
#define RED_LED_PIN 3
#define YELLOW_LED_PIN 4
#define GREEN_LED_PIN 5
#define BLUE_LED_PIN 6
#define WHITE_LED_PIN 7
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;
void setup() {
pinMode(RED_LED_PIN, OUTPUT);
pinMode(YELLOW_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT);
pinMode(WHITE_LED_PIN, OUTPUT);
dht.begin();
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 这里的0x3C是OLED的I2C地址,根据实际情况调整
Serial.println(F("SSD1306 allocation failed"));
for(;;); // 进入无限循环,无法初始化显示屏
}
display.display(); // 显示启动画面
delay(2000); // 等待2秒
display.clearDisplay(); // 清除画面
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 使用编译日期和时间
}
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
DateTime now = rtc.now();
display.clearDisplay(); // 清除画面
display.setTextSize(1); // 设置文本大小
display.setTextColor(SSD1306_WHITE); // 设置文本颜色
display.setCursor(0,10); // 设置文本开始的坐标
display.cp437(true); // 使用扩展字符集
display.println(F("LED Light Show & Env Monitor")); // 显示标题
display.print(F("Time: "));
display.print(now.hour(), DEC);
display.print(':');
display.print(now.minute(), DEC);
display.print(':');
display.print(now.second(), DEC);
display.println(F(" "));
display.print(F("Temp: "));
display.print(t);
display.print(F("*C Humidity: "));
display.print(h);
display.println(F("%"));
display.display(); // 将以上内容显示出来
// LED灯光秀
ledShow();
delay(100); // 每0.1秒更新一次
}
void ledShow() {
static unsigned long lastTime = 0;
static int patternIndex = 0;
const int patternDelay = 100; // 每个模式的持续时间(毫秒)
if (millis() - lastTime > patternDelay) {
lastTime = millis();
patternIndex = (patternIndex + 1) % 10; // 10种模式
}
switch (patternIndex) {
case 0: // 顺序点亮
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
digitalWrite(WHITE_LED_PIN, LOW);
break;
case 1:
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
digitalWrite(WHITE_LED_PIN, LOW);
break;
case 2:
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(BLUE_LED_PIN, LOW);
digitalWrite(WHITE_LED_PIN, LOW);
break;
case 3:
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, HIGH);
digitalWrite(WHITE_LED_PIN, LOW);
break;
case 4:
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
digitalWrite(WHITE_LED_PIN, HIGH);
break;
case 5: // 交替闪烁
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(BLUE_LED_PIN, LOW);
digitalWrite(WHITE_LED_PIN, HIGH);
break;
case 6:
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, HIGH);
digitalWrite(WHITE_LED_PIN, LOW);
break;
case 7: // 全部点亮
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(YELLOW_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(BLUE_LED_PIN, HIGH);
digitalWrite(WHITE_LED_PIN, HIGH);
break;
case 8: // 全部关闭
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
digitalWrite(WHITE_LED_PIN, LOW);
break;
case 9: // 随机闪烁
digitalWrite(RED_LED_PIN, random(2));
digitalWrite(YELLOW_LED_PIN, random(2));
digitalWrite(GREEN_LED_PIN, random(2));
digitalWrite(BLUE_LED_PIN, random(2));
digitalWrite(WHITE_LED_PIN, random(2));
break;
}
}
项目功能
- 温湿度监测:通过DHT11传感器实时监测环境的温度和湿度,并将结果显示在OLED显示屏上。
- 时间显示:DS3231实时时钟模块提供准确的时间信息,并将当前时间显示在OLED显示屏上。
- LED灯光秀:
- 顺序点亮:依次点亮红色、黄色、绿色、蓝色和白色LED。
- 交替闪烁:红色、绿色、白色LED交替闪烁,黄色、蓝色LED交替闪烁。
- 全部点亮:所有LED同时点亮。
- 全部关闭:所有LED同时关闭。
- 随机闪烁:每个LED随机点亮或关闭,实现随机闪烁效果。
- OLED显示:OLED显示屏用于显示当前时间、温湿度信息,方便用户实时查看环境状态。
热门推荐
紫外线灯对眼睛的危害有哪些
煮鸡蛋可以隔夜第二天吃吗
事业单位与省考差异解析:联考省份的事业单位特色探究
群山环抱的“轴承之乡”,如何成为机器人“摇篮”?
上法院上诉案件需要提交什么手续
国家重点研发专项“双蛋白工程”取得进展 助力增强细胞免疫力
没签合同离职需要提前几天通知?一文详解相关法律问题
桦甸干细胞治疗甲亢医院排名
税审报告与审计报告的差异及法律适用性探析
税审报告与审计报告的差异及法律适用性探析
显卡升级指南:IT专家教你如何选择与升级显卡型号
中国古代刑罚简史
喝了酒可以吃布洛芬吗
如何缓解骑行后产生的膝盖酸痛
“2025科幻力”年度产业观察与趋势发布,探讨科幻创作新切口
美空军推进“三位一体”模拟训练模式
童心勇者与梦魇之间的斗争,在冒险中找回内心的勇气与梦想
微信运动步数为0?巧妙设置与健康同行
研究发现:吃黑巧克力可以降低高血压风险27%
可可是「超級食物」!能降膽固醇、顧腸胃 營養師教你選對巧克力更健康
在河南,追寻大禹治水的足迹
拉丁舞的舞蹈风格有哪些?
旅游行业试水人工智能实际体验到底如何?
电脑显示器如何设置不卡顿?有哪些技巧?
左旋肉碱减肥方法运动,左旋肉碱茶多酚胶囊真的可以减肥吗
清华大学发布2025年“攀登计划”招生简章
拍人像应该用什么焦段的镜头?
外国各类舞蹈介绍
有机光伏技术迈向20%效率的新进展
猫咪食欲不振?巧用妙招恢复食欲