简介
交通信号灯模块上集成了三颗红黄绿大LED灯和2位用来显示时间的数码管,它可以结合Arduino和micro:bit,做一些与智慧交通相关的互动作品。
以前我们做与红绿灯相关的项目时,我们首先需要找红,黄,绿三颗LED灯,然后自己通过焊接将他们连接在设备/主控板上,最后通过给三颗灯编程,让它们实现简单的红绿灯功能。这样使用起来不仅繁琐,而且在场景上也会产生一定的混淆。现在我们推出的交通信号灯模块,它有突出场景主题的红绿灯外形;结合DFRobot的样例代码,还能实现多种交通信号灯的功能。
比如:上下班高峰期时,调整红绿灯的显示规律;可设置晚上23点,自动调整成黄灯闪烁;可设置多路交通信号灯等。
技术规格
- 工作电压:3V~5V
- 通信接口:I2C
- I2C地址:0X54、0X55、0X56、0X57
- 可输出数据:时、分、秒
- 可显示数据:秒
- 供电方式:I2C
- 三颗8MM直径的大LED灯:红,黄,绿
- 数码管连接方式:共阴极数码管
- 数码管尺寸:13.9 ×10mm
- 模块尺寸:66.40 × 28.09mm
- 智慧交通必备元件
- 模块内置显示规律:红灯11s;黄灯3s;绿灯11s
引脚说明
序号 | 丝印 | 功能描述 |
---|---|---|
1 | VCC/+ | 电源正极 |
2 | GND/- | 电源负极 |
3 | SCL/C | I2C时钟线 |
4 | SDA/D | I2C数据线 |
I2C地址说明
拨动模块背面B0,B1处的开关,用来切换地址。
B1 | B0 | ADDR |
---|---|---|
0 | 0 | 0X54 |
0 | 1 | 0X55 |
1 | 0 | 0X56 |
1 | 1 | 0X57 |
注意:地址修改之后,需要重新烧录程序,然后重新上电才会根据程序中设置的功能执行。不然只会显示模块内置的规律:红灯 11s;黄灯 3s;绿灯 11s。
Arduino使用教程
产品使用的是Gravity标准I2C接口,使用起来比较简单,按接线图所示将传感器与uno(或其它主板)相连接。
准备
- 硬件
- 1 x Arduino UNO控制板
- 1 x Traffic Light Module
- 若干 杜邦线
- 软件
- Arduino IDE, 点击下载Arduino IDE
关于如何安装库文件,点击链接
-
库文件:
DFRobot_Trafficlight -
连接图
- 函数列表
/*!
* @brief 获取此时MCU的时间
* @param NULL
* @return 没有返回值
*/
void getNowTime();
/*!
* @brief 更新MCU的时间,主要用来设置初始化时间。
* @param hour,minute,second
* @return 没有返回值
*/
void updateModuleTime(uint8_t hour,uint8_t minute,uint8_t second);
/*!
* @brief 更新MCU的时间,用来设置在某个时间段改变红、黄、绿显示的规律。
* @param hour,minute,second
* @return 没有返回值
*/
void setBeginTime(uint8_t begin_hour, uint8_t begin_minute, uint8_t begin_second);
/*!
* @brief 清空MCU时刻表,时刻表是用来记录红绿灯在不同时间段红绿黄三个灯持续亮的时间
* @param NULL
* @return 没有返回值
*/
void clearSchedule();
/*!
* @brief 设置三种灯持续亮的时间
* @param R_time:红灯持续时间
* Y_time:黄灯持续时间
* G_time:绿灯持续时间
* @return 没有返回值
*/
void setRYGLightTime(uint8_t R_time, uint8_t Y_time, uint8_t G_time);
/*!
* @brief 发送设置到MCU
* @param NULL
* @return 没有返回值
*/
void sendMessageToMCU();
/*!
* @brief 获取交通灯此时的状态
* @param light:设置想要检测的灯
* @return true: 亮
* false:灭
*/
bool ifLightIsOn(uint8_t light);
/*!
* @brief 修改8S默认的红黄绿三色灯的持续时间
* @param R_time:红灯持续时间
* Y_time:黄灯持续时间
* G_time:绿灯持续时间
* @return NULL
*/
void changeDefaultRYGTime(uint8_t R_time, uint8_t Y_time, uint8_t G_time);
样例代码 - 设置红绿灯的状态
功能描述: 设置当前时间为13::36:10,红黄绿三颗灯分别亮10s,3s,10s。
#include "DFRobot_Trafficlight.h"
#define I2C_ADDRESS 0x54
DFRobot_TRAFFICLIGHT_I2C TRAFFICLIGHT(&Wire ,I2C_ADDRESS);
String active_light = "";
void setup() {
Serial.begin(115200);
while(false==TRAFFICLIGHT.begin())
{
Serial.println("i2c begin fail,please check connect!");
delay(1000);
}
Serial.println("i2c begin success");
/*!
* @brief 更新MCU时间
*/
TRAFFICLIGHT.updateModuleTime(13,36,10);//设置当前时间为13:36:10
/*!
* @brief 修改交通灯默认持续值
*/
TRAFFICLIGHT.changeDefaultRYGTime(/*红灯持续时间*/ 10, /*黄灯持续时间*/ 3, /*绿灯持续时间*/ 10);
}
void loop() {
TRAFFICLIGHT.getNowTime();//获取当前时间
Serial.print(TRAFFICLIGHT._NowTime.hour);
Serial.print(":");
Serial.print(TRAFFICLIGHT._NowTime.minute);
Serial.print(":");
Serial.println(TRAFFICLIGHT._NowTime.second);
delay(1000);
}
结果
程序烧录成功后,红黄绿三颗灯的时间按照10s,3s,10s的规律显示,并且通过串口显示当前时间。
样例代码 - 读取红绿灯的状态,并控制P13脚的灯亮。
功能描述:读取红黄绿三颗灯的状态,并且当交通灯上的红灯亮时,点亮P13脚的LED灯,交通灯上的红灯灭时,熄灭P13脚的LED灯。
#include "DFRobot_Trafficlight.h"
#define I2C_ADDRESS 0x54
DFRobot_TRAFFICLIGHT_I2C TRAFFICLIGHT(&Wire ,I2C_ADDRESS);
String active_light = "";
int ledPin = 13;
void setup() {
Serial.begin(115200);
while(false==TRAFFICLIGHT.begin())
{
Serial.println("i2c begin fail,please check connect!");
delay(1000);
}
Serial.println("i2c begin success");
/*!
* @brief 更新MCU时间
*/
TRAFFICLIGHT.updateModuleTime(13,36,10);//设置当前时间为13:36:10
/*!
* @brief 修改交通灯默认持续值
*/
TRAFFICLIGHT.changeDefaultRYGTime(/*红灯持续时间*/ 10, /*黄灯持续时间*/ 3, /*绿灯持续时间*/ 10);
}
void loop() {
/*!
* @param RED_LIGHT
* YELLOW_LIGHT
* GREEN_LIGHT
*/
if (true == TRAFFICLIGHT.ifLightIsOn(RED_LIGHT))
{
digitalWrite(ledPin, HIGH); //灯打开状态
Serial.println("light is on!");
}else{
digitalWrite(ledPin, LOW); //灯关闭状态
Serial.println("light is off!");
}
delay(1000);
}
结果
当交通灯红灯亮起时,点亮P13脚的LED灯,串口并显示“light is on! ”。红灯熄灭时,P13脚的LED灯熄灭,串口显示“light is off!”。通过该功能我们可以举一反三,用舵机充当路障控制器,当红灯亮起时,转动舵机升起路障。
样例代码 - 定时调整通行时间
功能描述:早上8:30 ~ 9:30这段时间一般是上班高峰期,这时候就可以增加绿灯的时间,让车辆能在该路口通行的多一些。比如平时是按照红灯10s,黄灯3秒,绿灯10秒的时间显示,到了8:30 ~ 9:30的时候就按照红灯10秒,黄灯3秒,绿灯15s的时间显示。9:30过后可以根据车流量调整交通灯显示的时间。
#include "DFRobot_Trafficlight.h"
#define I2C_ADDRESS 0x54
DFRobot_TRAFFICLIGHT_I2C TRAFFICLIGHT(&Wire ,I2C_ADDRESS);
String active_light = "";
void setup() {
Serial.begin(115200);
while(false==TRAFFICLIGHT.begin())
{
Serial.println("i2c begin fail,please check connect!");
delay(1000);
}
Serial.println("i2c begin success");
/*!
* @brief 更新MCU时间
*/
TRAFFICLIGHT.updateModuleTime(8,29,00);//设置当前时间为8:29:00
/*!
* @brief 修改交通灯默认持续值
*/
TRAFFICLIGHT.changeDefaultRYGTime(/*红灯持续时间*/ 10, /*黄灯持续时间*/ 3, /*绿灯持续时间*/ 10);
/*!
* @brief 从8:30:00开始按照“红15秒,黄3秒,绿20秒”的规律显示。
*/
TRAFFICLIGHT.clearSchedule(); //清空MCU时刻表,时刻表是用来记录红绿灯在不同时间段红绿黄三个灯持续亮的时间。
TRAFFICLIGHT.setBeginTime(/*时*/8,/*分*/30,/*秒*/00);
TRAFFICLIGHT.setRYGLightTime(/*红灯持续时间*/ 15, /*黄灯持续时间*/ 3, /*绿灯持续时间*/ 20);
TRAFFICLIGHT.sendMessageToMCU();
/*!
* @brief 从8:31:00开始按照“红10秒,黄3秒,绿15秒”的规律显示。
*/
TRAFFICLIGHT.setBeginTime(/*时*/8,/*分*/31,/*秒*/00);
TRAFFICLIGHT.setRYGLightTime(/*红灯持续时间*/ 10, /*黄灯持续时间*/ 3, /*绿灯持续时间*/ 15);
TRAFFICLIGHT.sendMessageToMCU();
}
void loop() {
/*!
* @brief 打印时间
*/
TRAFFICLIGHT.getNowTime();
Serial.print(TRAFFICLIGHT._NowTime.hour);
Serial.print(":");
Serial.print(TRAFFICLIGHT._NowTime.minute);
Serial.print(":");
Serial.println(TRAFFICLIGHT._NowTime.second);
delay(1000);
}
结果
为了方便查看效果,程序中将时间间隔缩小了。根据程序设置的规律,当8:30之前,交通灯一直按照“红灯10s,黄灯3秒,绿灯10秒”的时间显示。8:30:00就开始按照“红15秒,黄3秒,绿20秒”的规律显示;从8:31:00开始按照“红10秒,黄3秒,绿15秒”的规律显示。
样例代码 - 交通管制
功能描述:平时该路口按照红灯10s,黄灯3秒,绿灯10秒的时间显示,到了晚上23:00~03:00的时候该路口一直亮黄灯,表示这个时间段,该路口可以直接通行。3:00过后就按照正常的规律显示。
#include "DFRobot_Trafficlight.h"
#define I2C_ADDRESS 0x54
DFRobot_TRAFFICLIGHT_I2C TRAFFICLIGHT(&Wire ,I2C_ADDRESS);
void setup() {
Serial.begin(115200);
while(false==TRAFFICLIGHT.begin())
{
Serial.println("i2c begin fail,please chack connect!");
delay(1000);
}
Serial.println("i2c begin success");
/*!
* @brief 更新MCU时间
*/
TRAFFICLIGHT.updateModuleTime(22,59,00);//设置当前时间为22:59:00
/*!
* @brief 修改交通灯默认持续值
*/
TRAFFICLIGHT.clearSchedule();
TRAFFICLIGHT.changeDefaultRYGTime(/*红灯持续时间*/ 10, /*黄灯持续时间*/ 3, /*绿灯持续时间*/ 10);
/*!
* @brief 设置从23时0分0秒开始,持续亮黄灯
* LIGHT_INFINITY_TIME:持续时间为永久
*/
TRAFFICLIGHT.setBeginTime(/*时*/23,/*分*/00,/*秒*/00);
TRAFFICLIGHT.setRYGLightTime(/*红灯持续时间*/ 0, /*黄灯持续时间*/ LIGHT_INFINITY_TIME, /*绿灯持续时间*/ 0);
TRAFFICLIGHT.sendMessageToMCU();
/*!
* @brief 设置从23时2分0秒开始,按照正常规律显示。
*/
TRAFFICLIGHT.setBeginTime(/*时*/23,/*分*/2,/*秒*/00);
TRAFFICLIGHT.setRYGLightTime(/*红灯持续时间*/ 10, /*黄灯持续时间*/ 3, /*绿灯持续时间*/ 10);
TRAFFICLIGHT.sendMessageToMCU();
}
void loop() {
TRAFFICLIGHT.getNowTime();
Serial.print(TRAFFICLIGHT._NowTime.hour);
Serial.print(":");
Serial.print(TRAFFICLIGHT._NowTime.minute);
Serial.print(":");
Serial.println(TRAFFICLIGHT._NowTime.second);
delay(1000);
}
结果
为了方便查看效果,程序中将时间间隔缩小了。根据程序设置的规律,当23:00之前,交通灯一直按照“红灯10s,黄灯3秒,绿灯10秒”的时间显示。23:00就开始持续亮黄灯; 从23:02开始按照正常规律显示。
样例代码 - 设置多路红绿灯
功能描述:设置两路红绿灯,0号路灯按照“红灯10秒,黄灯3秒,绿灯10秒”的规律显示;1号路灯按照“红灯15秒,黄灯3秒,绿灯15秒”的规律显示。
#include "DFRobot_Trafficlight.h"
#define I2C_ADDRESS 0x54
DFRobot_TRAFFICLIGHT_I2C TRAFFICLIGHT0(&Wire ,I2C_ADDRESS);
#define I2C_ADDRESS 0x56
DFRobot_TRAFFICLIGHT_I2C TRAFFICLIGHT1(&Wire ,I2C_ADDRESS);
void setup() {
Serial.begin(115200);
while(false==TRAFFICLIGHT0.begin()&&TRAFFICLIGHT1.begin())
{
Serial.println("i2c begin fail,please check connect!");
delay(1000);
}
Serial.println("i2c begin success");
/*!
* @brief 更新MCU时间
*/
TRAFFICLIGHT0.updateModuleTime(11,32,00);//设置当前时间为11:32:00
TRAFFICLIGHT1.updateModuleTime(11,32,00);//设置当前时间为11:32:00
/*!
* @brief 修改0号交通灯默认持续值
*/
TRAFFICLIGHT0.clearSchedule();
TRAFFICLIGHT0.changeDefaultRYGTime(/*红灯持续时间*/ 10, /*黄灯持续时间*/ 3, /*绿灯持续时间*/ 10);
/*!
* @brief 修改1号交通灯默认持续值
*/
TRAFFICLIGHT1.clearSchedule();
TRAFFICLIGHT1.changeDefaultRYGTime(/*红灯持续时间*/ 15, /*黄灯持续时间*/ 3, /*绿灯持续时间*/ 15);
}
void loop() {
TRAFFICLIGHT1.getNowTime();
Serial.print(TRAFFICLIGHT1._NowTime.hour);
Serial.print(":");
Serial.print(TRAFFICLIGHT1._NowTime.minute);
Serial.print(":");
Serial.println(TRAFFICLIGHT1._NowTime.second);
delay(1000);
}
结果
设置0路交通灯的I2C地址为0x54,1路交通灯的I2C地址为0x56。程序烧录成功后,会按照设定好的规律显示:0号路灯按照“红灯10秒,黄灯3秒,绿灯10秒”;1号路灯按照“红灯15秒,黄灯3秒,绿灯15秒”。
常见问题
还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。
更多
- [数码管手册] 数码管规格书YL2201AR-T.pdf