SGP40空气质量传感器

简介

交通信号灯模块上集成了三颗红黄绿大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
    • 若干 杜邦线
  • 软件

关于如何安装库文件,点击链接

  • 函数列表
/*!
 *  @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或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多

DFshopping_car1.png DFRobot商城购买链接