此项目名为智能城市设计,是本人物联网短距离通信技术的课程设计。它属于入门级别的设计,却在课程答辩时得到了老师和同学的一致好评,所以想分享给大家希望能够帮助更多的同道中人。但是仅适用新手入门小白,对于资深大佬而言较为简单。
一、项目介绍
智能城市项目共分为五个部分,即交通信号灯系统、火灾报警系统、环境监测系统、路灯控制系统和智能垃圾桶。在下打算用六篇文章来发布,分别对应这五个系统和最后的总结。在文章后面附上模块代码都可以单独编译上传,便于大家使用。本文章介绍第四个模块——路灯控制系统。
二、模块介绍
路灯控制系统使用了一个光敏电阻传感器,两个白色LED发光二极管,OLED显示屏和蓝牙。路灯控制系统由自动模式和手动模式两种控制方式,可以通过蓝牙切换。自动模式下,当光照强度低时开灯,光照强度高时关灯。手动模式下可通过蓝牙,在手机app上控制路灯的开关。
三、所需材料
光敏电阻传感器GL5516、两个白色LED发光二极管、蓝牙HC-06/HC-05、SSD1315 OLED显示屏、arduino uno r3开发板、杜邦线若干。还需要手机app“蓝牙调试器”来连接蓝牙查看数值,这个大家直接在CSDN上搜索下载即可。
四、接线
光敏电阻传感器GL5516引脚连接表:
引脚编号 | GL5516 引脚名称 | Arduino Uno R3 引脚名称 |
1 | Vcc | 5V |
2 | Do | A1 |
3 | GND | GND |
LED发光二极管引脚连接表:
引脚编号 | LED发光二极管引脚名称 | Arduino Uno R3 引脚名称 |
1 | Vcc | D13 |
2 | GND | GND |
(注:两个LED发光二极管连接在同一接口,可使用面包板来实现)
SSD1315 OLED显示屏引脚连接表:
引脚编号 | OLED显示引脚名称 | Arduino Uno R3 引脚名称 |
1 | Vcc | 3.3V |
2 | SCL | A5 |
3 | GND | GND |
4 | SDA | A4 |
HC-06蓝牙模块引脚连接表:
引脚编号 | HC-06 引脚名称 | Arduino Uno R3 引脚名称 |
1 | Vcc | 5V |
2 | TXD | D0 |
3 | GND | GND |
4 | RXD | D1 |
五、代码介绍
#include <Adafruit_SSD1306.h> // 引入Adafruit的SSD1306 OLED显示屏库
// 定义OLED显示屏的尺寸
#define SCREEN_WIDTH 128 // OLED显示屏宽度
#define SCREEN_HEIGHT 64 // OLED显示屏高度
// 初始化OLED显示屏对象,假设使用I2C通信,地址为0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// 定义LED引脚
#define LED_PIN 13
// 定义蓝牙接收到的命令
#define CMD_MANUAL 'B' // 手动模式命令
#define CMD_AUTO 'A' // 自动模式命令
#define CMD_ON '1' // 手动模式下打开LED命令
#define CMD_OFF '0' // 手动模式下关闭LED命令
// 定义LED的工作模式
enum LEDMode {
MANUAL, // 手动模式
AUTO // 自动模式
};
// 当前LED的工作模式
LEDMode currentMode = AUTO; // 初始模式设置为自动
// 定义光敏电阻传感器的引脚
#define LIGHT_SENSOR_PIN A1
void setup() {
Serial.begin(9600); // 初始化串行通信
// 初始化OLED显示屏
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed")); // 如果初始化失败,打印错误信息
for(;;); // 初始化失败则停止程序
}
display.display(); // 显示OLED屏幕
delay(1000); // 延时1秒
// 设置LED引脚为输出模式
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// 检查是否有蓝牙数据可读
if (Serial.available()) {
char cmd = Serial.read(); // 读取接收到的蓝牙数据
switch (cmd) {
case CMD_MANUAL:
currentMode = MANUAL; // 设置为手动模式
Serial.println("LED Mode: MANUAL"); // 打印当前模式
break;
case CMD_AUTO:
currentMode = AUTO; // 设置为自动模式
Serial.println("LED Mode: AUTO"); // 打印当前模式
break;
case CMD_ON:
if (currentMode == MANUAL) { // 仅在手动模式下执行
digitalWrite(LED_PIN, HIGH); // 打开LED
}
break;
case CMD_OFF:
if (currentMode == MANUAL) { // 仅在手动模式下执行
digitalWrite(LED_PIN, LOW); // 关闭LED
}
break;
default:
// 忽略未知命令
break;
}
}
// 读取光敏电阻值(模拟值)
int light = analogRead(LIGHT_SENSOR_PIN); // 读取光敏电阻的模拟值
int szjz = 1023; // 假设ADC的最大值为1023(Arduino Uno的默认值)
int lightValue = szjz - light; // 转换为光强度值(这里简单地将ADC值反转)
// 如果在自动模式下,根据光敏电阻的值控制LED
if (currentMode == AUTO) {
if(lightValue < 500) {
digitalWrite(LED_PIN, HIGH); // 如果光强度低,打开LED
} else {
digitalWrite(LED_PIN, LOW); // 如果光强度高,关闭LED
}
}
// 清除OLED屏幕并显示光强度信息
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("Intensidad de la luz: "); // 显示“光强度: ”
if(lightValue < 500) {
display.println("baja"); // 如果光强度低,显示“低”
} else {
display.println("alta"); // 如果光强度高,显示“高”
}
display.display(); // 更新OLED屏幕显示
delay(500); // 延时500毫秒
}
路灯的初始状态为自动模式,可根据光照强度来控制路灯的开关。在“蓝牙调试器”中,可在对话模式中输入和按键控制中定义宏变量来调节小灯的模式。输入“A”为将路灯设置成自动模式,输入“B”为将路灯设置成手动模式。在手动模式下输入“1”为打开路灯,输入“0”为关闭路灯。