基于arduino的智能城市课设模块4——路灯控制系统

        此项目名为智能城市设计,是本人物联网短距离通信技术的课程设计。它属于入门级别的设计,却在课程答辩时得到了老师和同学的一致好评,所以想分享给大家希望能够帮助更多的同道中人。但是仅适用新手入门小白,对于资深大佬而言较为简单。

一、项目介绍

        智能城市项目共分为五个部分,即交通信号灯系统、火灾报警系统、环境监测系统、路灯控制系统和智能垃圾桶。在下打算用六篇文章来发布,分别对应这五个系统和最后的总结。在文章后面附上模块代码都可以单独编译上传,便于大家使用。本文章介绍第四个模块——路灯控制系统。

二、模块介绍

       路灯控制系统使用了一个光敏电阻传感器,两个白色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”为关闭路灯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值