DMX512

产品简介

DMX512是一个数字调光协议,它能够对舞台、剧场、演播室等场所的调光器及其他的控制设备进行数字控制,其连线简单,可靠性高。DMX512信号系统是目前应用最广泛的系统,市场上拥有大量的DMX512的灯光驱动器、射灯、控制台等等。它们普遍用于舞台灯光控制,公园灯光效果控制等。

EDGE102-DMX512控制器能让你低成本构建可编程的互动交互灯光效果。它采用ESP32-S3+DMX512协议处理芯片双核构架。其中,ESP32-S3用于用户编程,支持WIFI与蓝牙无线网络。另外一个独立的芯片固化了DMX512协议,两者之间在内部通过I2C通讯,有效的提高了整个系统的稳定性与可靠性。也大幅度的简化了用户编程,你无需了解复杂的DMX512底层通讯协议,仅发送基本的指令即可完成灯光控制。

EDGE102-DMX512采用标准的DMX512协议与接口,可直连市场上几乎所有的DMX512灯带驱动器及灯具,并且具有丰富的外设接口:

  • 8路全隔离工业开关量输入口
  • 1路工业继电器输出口
  • 1路RS485接口
  • 1路ESP32-S3 I2C接口
  • 1路ESP32-S3 UART接口
  • 2路ESP32-S3 GPIO
  • 1路DMX512 XLR接口

丰富的接口可让控制器不仅可直连标准的工业红外传感器、激光传感器、分贝计、变频器、灯具等等设备。还可使用丰富的开源硬件传感器模块。基于传感器检测的灯光互动效果可装饰你的客厅、花园,聚会,酒吧,还可用于公园和商场等场所的灯光交互项目。

DMX512技术简介

DMX512是一种用于控制灯光和舞台效果设备的数字调光协议。它是一种串行通信协议,使用RS-485电平进行数据传输。该协议使用传统的3针XLR连接器进行物理连接,其中一根是信号地线,两根用于数据传输,另外两根用于电源和备用线路。DMX512的数据传输速度为250kbps,每个控制器可以控制最多512个灯光通道。

DMX512协议是开放的标准协议,因此允许多个制造商生产符合协议的设备。这也使得DMX512成为了舞台照明行业中最流行的控制协议之一。除了灯光效果设备,DMX512还可以控制其他类型的设备,如音频效果器、电机、气动设备等等。

在应用方面,DMX512广泛应用于舞台、剧场、影视制作、演播室等领域,可以实现各种灯光效果和特效,如彩虹、渐变、闪烁、显色等等。同时,DMX512还被用于各种商业、公共场所的灯光设计中,如商场、餐厅、酒店、公园等。利用DMX512的优势,可以创造出各种各样的视觉效果和艺术表现,提高环境的美观度和互动性。

产品特性

  • 标准DMX512协议及接口,可直连DMX512驱动器和灯具;
  • 8路光耦隔离开关量输入口,可直连标准PNP开关量传感器;
  • 1路继电器输出接口;
  • 1路RS485接口,支持主机和从机模式;
  • 1路I2C、1路UART接口,2路GPIO,可兼容更多开源传感器;
  • 内置时钟芯片及超级电容,可按时间点和节假日设计不同的功能和效果;
  • ESP32-S3主芯片,支持WIFI、蓝牙,支持Arduino编程,上手简单快速;
  • 固化了DMX512协议的专用芯片,确保程序运行可靠;
  • 金属外壳,支持挂耳安装与导轨卡扣安装;

产品尺寸图

功能指示图

DMX512接口面

功能名称 功能说明
12V~24V Power IN 电源输入,电压范围12V~24V,接线端子与DC2.1接口方式二选一
WIFI/Bluetooth WIFI及蓝牙天线(SMA母头接口)
PWR 电源指示灯
IO21 测试灯,连接在ESP32-S3的IO21接口
USB TYPE-C USB下载程序接口
RST 复位按钮
120R RS485 RS485 120Ω开关
DMX512 OUT(XLR母口) 灯光控制程序输出接口,连接DMX512驱动器

输入输出接口面

功能名称 端口名称 功能说明
RS485 1路RS485接口
A RS485 A口
B RS485 B口
Relay OUT 1路继电器输出端口(继电器线圈通过ESP32-S3的IO46控制)
COM 继电器公共端
NO 继电器常开端
Digital IN 8路开关量输入端口(全隔离)
DGND 开关量输入接地端(全隔离,开关量单独接地,与系统地不通)
DI1 通道1开关量输入端口,连接在ESP32-S3的IO6
DI2 通道2开关量输入端口,连接在ESP32-S3的IO7
DI3 通道3开关量输入端口,连接在ESP32-S3的IO18
DI4 通道4开关量输入端口,连接在ESP32-S3的IO35
DI5 通道5开关量输入端口,连接在ESP32-S3的IO36
DI6 通道6开关量输入端口,连接在ESP32-S3的IO37
DI7 通道7开关量输入端口,连接在ESP32-S3的IO38
DI8 通道8开关量输入端口,连接在ESP32-S3的IO39
GPIO/I2C/UART ESP32-S3原生GPIO/I2C/UART(无隔离)
IO4 ESP32-S3原生IO4,支持数字量和模拟量
IO5 ESP32-S3原生IO5,支持数字量和模拟量
SCL I2C SDA,使用ESP32-S3 IO2
SDA I2C SDA,使用ESP32-S3 IO1
TXD UART TX 使用ESP32-S3 IO6
RXD UART RX 使用ESP32-S3 IO8
POWER 电源接口
3V3 3.3V输出
5V 5V输出
GND 电源负极(系统地)
GND 电源负极(系统地)

规格参数

系统参数

  • 供电电压:12V~24V
  • 供电接口:DC2.1/接线端子
  • 主内核芯片:ESP32-S3
  • 程序下载接口:USB-TYPEC
  • RTC误差:30天±3秒
  • RTC后备电源:超级电容,掉电保持时钟12小时
  • 复位按钮:×1

输入输出接口

  • DMX512输出接口:三芯XLR母口
  • 继电器输出接口:×1
  • 全隔离开关量输入接口:×8
  • 开关量传感器支持极性:PNP
  • I2C接口:×1
  • UART接口:×1
  • GPIO:×2
  • BLINK-LED:×1

物理参数

  • 安装方式:导轨卡扣安装、挂耳安装
  • 外壳:合金钢外壳
  • 产品重量:400g
  • 产品尺寸:158mm×83mm×37mm(详见产品尺寸图)

编程平台的下载及安装

ArduinoIDE下载及安装

下载Arduino IDE

点击进入Arduino官网下载Arduino IDE 根据自己的电脑系统,选择适合的IDE包。

下载及安装SDK

导入ESP32 json链接

点击菜单:文件-首选项,弹出首选项对话框。然后点击如图所示的位置,打开链接填写窗口。

将如下链接地址复制到新弹出的对话框中,然后点击”确认“ 按钮。

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

安装SDK

点击菜单:工具-开发板-开发板管理器。进入开发板管理器,如下图所示:

搜索框内输入esp32,在搜索结果中选择esp32,点击安装。如图所示:

点亮测试灯

功能说明

在DMX512控制器上板载有一颗蓝色LED灯,在内部它连接在ESP32-S3的IO21,这颗LED灯作用是快速验证代码,方便程序的调试。如图所示:

测试步骤

  1. 使用type-c USB线将控制器背后的USB接口连接至电脑。
  2. 打开ArduinoIDE。
  3. 在IDE的菜单中选择:工具-开发板-DFRobot Firebeetle 2 ESP32-S3。
  4. 在IDE的菜单中选择:工具-端口-开发板对应的端口(图中为COM3,端口号会根据不同的电脑发生变化,不固定)。

  1. 复制以下代码至编辑框:
#include "DFRobot_DMX512.h"

DFRobot_DMX512 dmx512; 

void setup() {
    Serial.begin(115200);  
    while(dmx512.begin() != 0){   //初始化DMX512
        Serial.println("init error");
        delay(1000);
    }
    Serial.println("init OK");
    pinMode(21, OUTPUT);//设置引脚21为输出模式
}

void loop() {
    digitalWrite(21, HIGH); //为端口写高电平
    delay(1000);           // 延时一秒
    digitalWrite(21, LOW);  //为端口写低电平  
    delay(1000);           //延时一秒    
}
  1. 编译并下载程序至控制器

  1. 程序下载完成后,此时,你将能看到控制器上的蓝色LED按一秒钟的频率闪烁。

控制灯带

功能说明

控制灯带需要使用到DMX512驱动器。驱动器的主要功能是驱动灯带发光,DMX512可相互级联使用组成更多通道的灯带。并且这些多个驱动器可以由一个DMX512编程控制器进行控制。

DMX512解码驱动器说明与设置

本资料例程中使用的驱动器是一款24通道LED灯带或8路RGB灯带的驱动设备。你也可以将多个驱动器通过RJ45口或者卡侬口级联使用,最多可级联21个驱动器组成512条LED灯带或170条RGB灯带。

该设备可与DMX512编程控制器通过三芯卡侬口连接获取DMX512控制信号,以此来实现对灯光效果的控制。

其它驱动器的使用方法与例程中相似,具体使用方法请参考对应的解码驱动器说明书。

功能指示图

硬件连接与设置

控制器与驱动解码器连线图

DMX512接口内部是一个RS485总线,不论接口连接IN还是OUT,效果都是一样的,不用刻意区分。可根据你手上的连接线的公母头来选择插公口还是母口。

驱动器需要单独进行供电才能正常运行,驱动器的供电电压在5V~24V之间,需要注意的时,供电电压要和灯带的额定电压一致,例如灯带为12V的话,驱动器的供电电压就必须是12V。

LED灯带连线图

RGB灯带连线图

本例中的驱动器支持的灯带为共阳极RGB灯带。RGB灯带分为共阳和共阴两种,区别在公共极是正极(共阳)还是负极(共阴),在购买灯带时需注意分辨。

驱动器地址设置

RGB灯带是由红、绿、蓝三个不同颜色的灯组成的。分别连接驱动器上的三个通道,一根RGB灯带占用3个通道地址。

驱动器由于可以级联,所以,每个通道都有自己的通道地址,设置第一个通道的地址后,后面通道的地址依次加1。

通道地址设置方式如下:

  • 第一步:长按“A:Address”按键,或者长按“H:Mode”按键,此时,数码管亮度提升。
  • 第二步:按“-”减地址,按“+”加地址,地址范围:1-512 。
  • 第三步:将开始地址设置为:A001 。
  • 完成开始地址设置。

如图所示:

示例:点亮和熄灭灯带

首先下载并导入DMX512库,库链接:
https://github.com/DFRobot/DFRobot_DMX512

下面将采用三种方法来点亮和熄灭灯带,以便介绍三种API的功能和使用方法。

指定地址写数据

API原型:dmx512.write(DMX512地址1-512,写入的数据0-255)

API说明:这是最基础的命令,为DMX512的地址写入数据。基于该命令,可完成几乎所有的DMX512控制功能。

数据范围:

  • DMX512地址:1-512
  • 要写的数据:0-255
Arduino代码

代码功能:点亮第一根LED灯带,并按1秒的间隔闪烁。

#include "DFRobot_DMX512.h"

DFRobot_DMX512 dmx512; 

void setup() {
    Serial.begin(115200);  
    while(dmx512.begin() != 0){   //初始化DMX512
        Serial.println("init error");
        delay(1000);
    }
    Serial.println("init OK");
}

void loop() {
    dmx512.write(1,255); //给通道1赋值255
    delay(1000);         //延时1秒
    dmx512.write(1,0);   //给通道1赋值0
    delay(1000);         //延时1秒
}

LED灯控制

API原型:dmx512.LEDLight(开始地址,LED灯的个数,亮度)

API说明:这是专门控制LED灯带的命令,基于该命令,可非常方便的控制LED灯带。

数据范围:

  • 开始地址:1-512
  • LED灯的个数:1-512
  • 亮度:0-255
Arduino代码

点亮第1根到第8根LED灯带,并按1秒的间隔闪烁。

#include "DFRobot_DMX512.h"

DFRobot_DMX512 dmx512; 

void setup() {
    Serial.begin(115200);  
    while(dmx512.begin() != 0){   //初始化DMX512
        Serial.println("init error");
        delay(1000);
    }
    Serial.println("init OK");
}

void loop() {
    dmx512.LEDLight(1,8,255); //从起始通道1开始,点亮共8个通道的LED,亮度最亮
    delay(1000);         //延时1秒
    dmx512.LEDLight(1,8,0);   //熄灭第1根到第8根灯带
    delay(1000);         //延时1秒
}

RGB灯控制

API原型:dmx512.RGBLight(开始地址,RGB灯的条数,R通道值,G通道值,B通道值)

API说明:一条RGB灯带会占用3个通道,不便于计算。为了方便使用,专门设计了控制RGB灯带的命令,基于该命令,可非常方便的控制RGB灯带。

数据范围:

  • 开始地址:1-512
  • RGB灯带的条数:1-170
  • RGB通道值:0-255

Arduino代码
点亮第1根到第8根RGB灯带,显示颜色为蓝色,并按1秒的间隔闪烁。

#include "DFRobot_DMX512.h"

DFRobot_DMX512 dmx512; 

void setup() {
    Serial.begin(115200);  
    while(dmx512.begin() != 0){   //初始化DMX512
        Serial.println("init error");
        delay(1000);
    }
    Serial.println("init OK");
}

void loop() {
    dmx512.RGBLight(1,8,0,0,255); //从地址1开始,点亮共8根RGB灯带,RGB灯带显示为蓝色
    delay(1000);         //延时1秒
    dmx512.RGBLight(1,8,0,0,0);   //熄灭从地址1开始,共8根RGB灯带
    delay(1000);         //延时1秒
}

驱动帕灯

帕灯是一种常见的舞台DMX512灯具,可XY两个方向360度转动角度。不同厂家的帕灯的指令有所不同,但总体使用方法是一致的。下面例子中将举例说明控制帕灯的方法。

帕灯指令

下面将举例说明帕灯的控制指令,如下表:

通道/地址/Channel 数值 功能描述
1 0-255 X轴转动灯头部
2 0-255 Y轴转动灯头部
3 0-7 关闭灯光
8-134 总调光
135-239 频闪功能
240-255 打开灯光
4 0-255 光线红色值
5 0-255 光线绿色值
6 0-255 光线蓝色值

每个帕灯的功能不同,控制指令也不同,必须参考帕灯的功能说明进行操作和控制。

连接图

DMX512控制器与帕灯均需要独立供电。相互之间仅需一根卡侬口连接线通讯即可。同时,也可以帕灯和灯带控制器级联,或者与其它DMX512设备级联,实现同时控制。

程序编写

如果你还未下载并导入DMX512库,请在该链接下载并导入:https://github.com/DFRobot/DFRobot_DMX512

下面程序将演示如何控制帕灯的灯光及角度。程序每隔一秒变换一次灯光投射的角度及颜色。

#include "DFRobot_DMX512.h"

DFRobot_DMX512 dmx512; 

void setup() {
    Serial.begin(115200);  
    while(dmx512.begin() != 0){   //初始化DMX512
        Serial.println("init error");
        delay(1000);
    }
    Serial.println("init OK");
    dmx512.write(3,255); //打开灯光
}

void loop() {
    dmx512.write(1,255); //给通道1赋值120,调整X轴角度
    dmx512.write(2,50); //给通道2赋值50,调整Y轴角度
    dmx512.write(4,200); //给通道4赋值200,调整灯光的红色值
    dmx512.write(5,100); //给通道5赋值100,调整灯光的绿色值
    dmx512.write(6,120); //给通道6赋值120,调整灯光的蓝色值
    delay(1000);
    dmx512.write(1,120); //给通道1赋值30,调整X轴角度
    dmx512.write(2,150); //给通道2赋值150,调整Y轴角度
    dmx512.write(4,50); //给通道4赋值50,调整灯光的红色值
    dmx512.write(5,160); //给通道5赋值160,调整灯光的绿色值
    dmx512.write(6,40); //给通道6赋值40,调整灯光的蓝色值
    delay(1000);
}

点亮WS2812灯带

功能说明

WS2812是一种单线控制灯带,每颗灯珠均集成了控制芯片,可以独立控制每一颗灯珠的亮灭、颜色。可做出酷炫的灯光效果。

DMX512控制器预留了IO4和IO5两个IO口,可使用该端口驱动WS2812灯带。

注:WS2812灯带功率较大,灯带需外接5V供电,仅控制器供电的话,会造成供电不足,甚至损坏控制器电源芯片。

连接图

示例1:WS2812彩虹灯

WS2812灯带库下载链接:https://github.com/adafruit/Adafruit_NeoPixel

程序功能:灯带以彩虹色方式显示。

#include <Adafruit_NeoPixel.h>

#define LED_PIN     4 //设置接入的引脚号

#define LED_COUNT  137 //设置灯珠的总数量

#define BRIGHTNESS 255// 设置亮度,最大255

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRBW + NEO_KHZ800);

void setup() {
    strip.begin();           
    strip.show();            
    strip.setBrightness(BRIGHTNESS);
    for(int i=0; i<strip.numPixels(); i++) { 
        uint32_t pixelHue = 40 + (i * 65536L / strip.numPixels());
        strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue, 255,255 )));         
    }
    strip.show(); 
}

void loop() {
    delay(1);

}

示例2:WS2812流水灯

程序功能:灯带就像流水一样动态跑动。

#include <Adafruit_NeoPixel.h>

#define LED_PIN     4

#define LED_COUNT  137 

#define BRIGHTNESS 255 

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRBW + NEO_KHZ800);
void setup() {
    strip.begin();           
    strip.show();            
    strip.setBrightness(BRIGHTNESS);
}

void loop() {
    for(uint32_t firstPixelHue = 0; firstPixelHue < 3*65536;
        firstPixelHue += 256) {

            for(int i=0; i<strip.numPixels(); i++) { 
                uint32_t pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
                strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue, 255,
                    255)));
            }

            strip.show();
            delay(3);
        }

}

示例3:WS2812呼吸灯

程序功能:灯带就像呼吸一样渐变。

#include <Adafruit_NeoPixel.h>

#define LED_PIN     4

#define LED_COUNT  137

#define BRIGHTNESS 255

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRBW + NEO_KHZ800);
void setup() {
    strip.begin();           
    strip.show();          
    strip.setBrightness(BRIGHTNESS);
}

void loop() {
    for(int j=0; j<256; j++) { 
        strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));
        strip.show();
        delay(5);
    }

    for(int j=255; j>=0; j--) { 
        strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));
        strip.show();
        delay(5);
    }

}

示例4:WS2812跑马灯

程序功能:灯带就像跑马场一样循环动态跑动。

#include <Adafruit_NeoPixel.h>

#define LED_PIN     4

#define LED_COUNT  137

#define BRIGHTNESS 255

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRBW + NEO_KHZ800);

int      head          = 10 - 1;
int      tail          = 0;
uint32_t lastTime      = millis();
uint32_t firstPixelHue = 0;
int whiteSpeed = 20;

void setup() {
    strip.begin();           
    strip.show();            
    strip.setBrightness(BRIGHTNESS);
}

void loop() {
    for(int i=0; i<strip.numPixels(); i++) {  
        if(((i >= tail) && (i <= head)) ||      
            ((tail > head) && ((i >= tail) || (i <= head)))) {
            strip.setPixelColor(i, strip.Color(0, 0, 0, 255)); 
        } else {                                             
            int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
            strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
        }
    }

    strip.show(); 
    firstPixelHue += 40; 

    if((millis() - lastTime) > whiteSpeed) { 
        if(++head >= strip.numPixels()) {      
            head = 0;
        }
        if(++tail >= strip.numPixels()) {      
            tail = 0;
        }
        lastTime = millis();                   
    }

    if(firstPixelHue > 3 * 65536)
        firstPixelHue = 0;

}

Relay OUT(继电器输出接口)

功能说明

DMX512引出1路继电器输出端口,线圈由IO46控制,可用于驱动中间继电器,控制电机、音响设备的通断等。功能端口如下:

端口编号 端口说明
COM 继电器公共极
NO 继电器常开端口

注:本控制器内置为小功率低压继电器,仅适用于30V以内,2A以下的DC电源开关操作。大电流的设备需外接中间继电器,避免损坏内置继电器。

连线图

功能说明:下方连线图将说明继电器内部开关的原理示意,以及外部设备的连接方法。

程序编写

下列程序将演示如何通过编程的方式驱动继电器每隔一秒钟就循环闭合和断开。程序运行时,可听到继电器每间隔一秒钟被吸合的声音。用万用表的通断挡位测量COM端和NO端,能看到每隔一秒钟就接通一次。如果有外接设备,此时,可看到外接设备每间隔一秒运行一次。

#include "DFRobot_DMX512.h"

DFRobot_DMX512 dmx512; 

void setup() {
  Serial.begin(115200);  
    while(dmx512.begin() != 0){   //初始化DMX512
        Serial.println("init error");
        delay(1000);
    }
    Serial.println("init OK");
}

void loop() {
    dmx512.relayOUT(1); 
    delay(1000);                    
    dmx512.relayOUT(0);   
    delay(1000);                       
}

DI1-DI8工业开关量输入接口(全隔离)

功能说明

DMX512控制器共设置了8路全隔离开关量输入端口,支持PNP传感器接入。或者通过板载电源的方式连接无源开关输入。开关量电平支持12V-24V。如下所示:

端口编号 ESP32-S3控制引脚 端口说明
DGND 数字输入地
DI1 IO6 开关量输入端口1
DI2 IO7 开关量输入端口2
DI3 IO8 开关量输入端口3
DI4 IO35 开关量输入端口4
DI5 IO36 开关量输入端口5
DI6 IO37 开关量输入端口6
DI7 IO38 开关量输入端口7
DI8 IO39 开关量输入端口8

示例:红外开关控制灯带亮灭

下面,我们将在D1口连接一个PNP红外开关传感器。当红外开关检测到被遮挡后,灯带就亮,反之就灭。

连线图

程序编写

如果你还未下载并导入DMX512库,请在该链接下载并导入:https://github.com/DFRobot/DFRobot_DMX512

该程序演示了使用红外开关来控制DMX512灯光的亮灭。当红外开关被遮挡时,灯亮,反之灯灭。

#include "DFRobot_DMX512.h"

DFRobot_DMX512 dmx512; 

void setup() {
    Serial.begin(115200);  
    while(dmx512.begin() != 0){   //初始化DMX512
        Serial.println("init error");
        delay(1000);
    }
    Serial.println("init OK");

}

void loop() {
    
    if (dmx512.digitalIN(DI1) == HIGH) {  //红外开关接在DI1接口
        dmx512.RGBLight(1,8,0,0,0);   //熄灭第1根到第8根灯带   
    } else {
        dmx512.RGBLight(1,8,0,0,255); //点亮第1根到第8根灯带,显示为蓝色
    }
}

RS485接口

功能说明

本产品内置了全隔离RS485接口,支持RS485主机和从机模式,并支持标准ModBus协议。

RS485主机模式下,可外接485工业传感器、485继电器、485采集器、电机变频器等设备,在项目部署中具备很强的实用性。

RS485从机模式下,可实现控制器级联通讯,灯光同步等功能。

RS485连接在IO12与IO13引脚上,映射为:IO12: TX ,IO13: RX 映射为Serial1,RS485收发控制引脚为IO11。

485数据收发

下面两个程序是485接口的数据收发示例。

//在该示例中,可通过其它设备给485接口发送数据。485接收到外部数据后,发给ESP32-S3的USB串口,从电脑打印出来


void setup() {
    Serial.begin(115200);  //ESP32 USB
    Serial1.begin(115200, SERIAL_8N1, /*rx =*/13, /*tx =*/12);  //定义485引脚
    pinMode(11, OUTPUT);  //485控制引脚,用于控制485的收发
}

void loop() {
    digitalWrite(11, LOW);  //拉低,485处于接受状态
    if(Serial1.available()){  //判断485端口是否有数据
      Serial.write(Serial1.read()); //把485接受到的数据从ESP32 USB发出去
    }        
}
//在该示例中,将数据通过485接口发送出去,在485接口上连接一个485转USB转换器,电脑上可打印出数据

void setup() {
    Serial1.begin(115200, SERIAL_8N1, /*rx =*/13, /*tx =*/12);  //定义485引脚
    pinMode(11, OUTPUT);  //485控制引脚,用于控制485的收发
}

void loop() {
    digitalWrite(11, HIGH);   //拉高,485处于发送状态
    Serial1.println("12345678");  //485接口对外发送数据“12345678”
    delay(200);       
}

Modbus示例

连线图

该例程将演示使用RS485接口读取激光测距传感器的距离值,并在串口打印距离值。通过该例程,你可使用RS485接口连接更多的其它工业设备,如ADC采集,多通道开关量采集等等,实现灯光效果的更多互动。

RS485激光测距传感器资料链接:

https://wiki.dfrobot.com.cn/SKU_SEN0492_Laser_Ranging_Sensor_RS485_4m

程序编写

下面例程演示了使用RS485接口读取激光传感器测量的距离,并串口打印出距离值,单位为mm。

#include "DFRobot_RTU.h"

DFRobot_RTU modbus(/*s =*/&Serial1,11); //设置RS485的数据通道为Serial1,收发控制引脚为IO11

void setup() {
    Serial.begin(115200);
    Serial1.begin(115200, SERIAL_8N1, /*rx =*/13, /*tx =*/12); //波特率115200,数据位8和停止位1,rx引脚IO13,tx引脚IO12
    delay(1000);
}

void loop() {
    int ret = modbus.readHoldingRegister(/*设备485地址*/0x50, /*寄存器地址*/ 0x0034); //对应功能码0x03(读保持寄存器),读取寄存器数量为1个
    Serial.println(ret);
    delay(1000);
}

RTC(内部时钟)

功能说明

DMX512控制器内置了RTC时钟芯片,可在离线的状态下保持系统时钟的运行,后备电源可在断电的情况下保存时钟12小时左右。

你可对RTC时钟进行日期和时间的设置及读取。包括:年、月、日、小时、分、秒、闹钟的设置和读取。

时钟功能的加入,将大大方便做各种时序控制,例如定时开关灯,不同时间段变化灯光的颜色或者花色等等。

程序编写

如果你还未下载并导入DMX512库,请在该链接下载并导入:https://github.com/DFRobot/DFRobot_DMX512

下方例程中,将演示如何设置与读取RTC,并在监视窗口中打印出来。当你第二次使用仅需要读取时钟时,你可以删除“Setup”中时钟设置的这部分代码。

#include "DFRobot_Peripheral.h"

DFRobot_RTC rtc;

void setup() {
  Serial.begin(115200);
  while(rtc.begin() != 0){
    Serial.println("init error");
    delay(1000);
  }
  Serial.println("init succeed");
  rtc.stopClock();
  rtc.setYear(24);
  rtc.setMonth(rtc.eFeb);
  rtc.setDay(19);
  rtc.setWeek(rtc.eWed);
  rtc.setHour(9);
  rtc.setMinute(10);
  rtc.setSecond(30);
  rtc.startClock();
}

void loop(){
  sTime_t time;
  time = rtc.getTime();
  Serial.print("year:20");
  Serial.println(time.year);
  Serial.print("month:");
  Serial.println(time.month);
  Serial.print("day:");
  Serial.println(time.day);
  Serial.print("weekday:");
  Serial.println(time.week);
  Serial.print("hour:");
  Serial.println(time.hour);
  Serial.print("minute:");
  Serial.println(time.minute);
  Serial.print("second:");
  Serial.println(time.second);
  Serial.println("--------------------------------------------------------");
  delay(100);
}

ESP32-S3原生IO口

功能说明

DMX512引出两路GPIO,IO4和IO5,支持数字输入输出,模拟量采集。可接入开关量传感器、驱动两路舵机、2路模拟量输入,或驱动WS2812灯带等。其使用方法与常规的ESP32完全一致。

示例:音乐频谱灯

连线图

程序编写

下面代码演示了使用IO4连接模拟量分贝计模块,用声音大小驱动RGB灯带的条数。实现简单的音乐频谱灯效果。

#include "DFRobot_DMX512.h"

DFRobot_DMX512 dmx512;

void setup() { 
    Serial.begin(115200);  
    while(dmx512.begin() != 0){   //初始化DMX512
        Serial.println("init error");
        delay(1000);
    }
    Serial.println("init OK");     
}

void loop() {
    int datasound = analogRead(4);
    Serial.println(datasound);
    int leddata = map(datasound, 1000, 2500, 0, 8);
    dmx512.RGBLight(1,leddata,0,0,255);
    delay(30);
    dmx512.RGBLight(leddata*3+1,8,0,0,0);
    delay(30);
}

ESP32-S3原生I2C接口

功能说明

DMX512控制器引出了一路I2C接口,利用该接口,可连接大量的开源硬件传感器与执行器,从而极大的拓宽了控制器的应用场景。

I2C引脚对应关系如下:

引脚号 引脚功能
SDA 使用ESP32-S3 IO1
SCL 使用ESP32-S3 IO2

示例1:光线感应灯

程序功能:下方例子将演示使用I2C接口读取LTR390光照传感器的值。该传感器支持3.3V~5V供电,UART和I2C两种通讯方式,且有Arduino库可直接使用。

商品链接:Gravity: LTR390-UV紫外线传感器-光线&图像传感器-DFRobot创客商城

下载Arduino库:紫外线传感器库

连线图

使用时请将传感器的通讯模式开关切换到I2C侧。

程序编写

程序功能:下方例子将演示使用I2C接口读取LTR390光照传感器的值。

#include "DFRobot_LTR390UV.h"
#include "DFRobot_DMX512.h"

DFRobot_LTR390UV ltr390(/*addr = */LTR390UV_DEVICE_ADDR, /*pWire = */&Wire);
DFRobot_DMX512 dmx512;

void setup()
{
    Serial.begin(115200);  
    while(dmx512.begin() != 0){   //初始化DMX512
        Serial.println("init error");
        delay(1000);
    }
    Serial.println("init OK");

    while(ltr390.begin() != 0){
        Serial.println(" Sensor initialize failed!!");
        delay(1000);
    }
    Serial.println(" Sensor  initialize success!!");
    ltr390.setALSOrUVSMeasRate(ltr390.e18bit,ltr390.e100ms);//18位数据,采样时间100ms 
    ltr390.setALSOrUVSGain(ltr390.eGain3);//3倍增益
    ltr390.setMode(ltr390.eALSMode);//设置环境光模式 
}

void loop()
{
    float als = 0;
    als = ltr390.readALSTransformData();//获取环境光数据
    Serial.println(als);
    int dataals = map(als,0,14500,1,8);
    Serial.println(dataals);
    dmx512.RGBLight(1,dataals,0,0,255);
    delay(30);
    dmx512.RGBLight(dataals*3+1,8,0,0,0);
    delay(30);

}

示例2:语音识别灯

该例程演示了使用离线语音识别的方式对DMX512灯光进行控制。需外接一个I2C接口的离线语音识别模块。

商品链接如下:Gravity: 语音识别模块 - I2C & UART-AI 人工智能-DFRobot创客商城

Arduino库下载链接:GitHub - DFRobot/DFRobot_DF2301Q

连线图

使用时请将语音识别模块的通讯模式开关切换到I2C侧。

程序编写

程序功能如下:

  • 唤醒:小智你好
  • 说:打开灯光 //此时灯光打开
  • 说:设置为红色 //此时灯光设置为红色
  • 说:设置为蓝色 //此时灯光设置为蓝色
  • 说:设置为绿色 //此时灯光设置为绿色
  • 说:关闭灯光 //此时关闭灯光
#include "DFRobot_DF2301Q.h"
#include "DFRobot_DMX512.h"

DFRobot_DMX512 dmx512;
DFRobot_DF2301Q_I2C asr;

uint8_t state = 0;

void setup() {
    Serial.begin(115200);  
    while(dmx512.begin() != 0){      //初始化DMX512
        Serial.println("init error");
        delay(1000);
    }
    Serial.println("init OK");

    while (!(asr.begin())) {
        Serial.println("Communication with device failed, please check connection");
        delay(3000);
    }
    Serial.println("Begin ok!");

    asr.setVolume(4);
    asr.setMuteMode(0);
    asr.setWakeTime(20);

    uint8_t wakeTime = 0;
    wakeTime = asr.getWakeTime();
    Serial.print("wakeTime = ");
    Serial.println(wakeTime);

}

void loop() {
    uint8_t CMDID = asr.getCMDID();
    switch (CMDID) {
        case 117:                                                  //指令“打开灯光”
            state = 1;
            dmx512.RGBLight(1,8,255,255,255);
            break;

        case 118:                                                  //指令“关闭灯光”
            state = 0;
            dmx512.RGBLight(1,8,0,0,0);
            break;

        case 130:                                                  //指令“设置为红色”
            if(state == 1)
                dmx512.RGBLight(1,8,100,0,0);
            break;


        case 133:                                                  //指令“设置为绿色”
            if(state == 1)
                dmx512.RGBLight(1,8,0,100,0);
            break;

        case 135:                                                  //指令“设置为蓝色”                          
            if(state == 1)
                dmx512.RGBLight(1,8,0,0,100);
            break;

        default:
            if (CMDID != 0) {
                Serial.print("CMDID = ");  //打印命令ID
                Serial.println(CMDID);
            }
    }
    delay(300);
}

ESP32-S3原生UART接口

功能说明

在DMX512控制器中引出了ESP32-S3原生UART,如图所示:

在引出的端子上,UART的引脚配置如下表:

引脚号 对应ESP32-S3引脚
TXD IO6
RXD IO8

示例:语音控制灯光

下方例子将演示使用离线语音识别的方式的UART接口对DMX512灯光进行控制。

商品链接:

串口驱动程序库下载链接:DFRobot_RTU库

连线图

使用时请将传感器的通讯模式开关切换到UART侧。

程序编写

#include "DFRobot_DF2301Q.h"

#define Led 21

DFRobot_DF2301Q_UART asr(/*hardSerial =*/&Serial2, /*rx =*/8, /*tx =*/6);


void setup() {
  Serial.begin(115200);

  pinMode(Led, OUTPUT);    //初始化LED引脚为输出模式
  digitalWrite(Led, LOW);  //LED引脚低电平

  while (!(asr.begin())) {
    Serial.println("Communication with device failed, please check connection");
    delay(3000);
  }
  Serial.println("Begin ok!");


  asr.settingCMD(DF2301Q_UART_MSG_CMD_SET_MUTE, 0);
  asr.settingCMD(DF2301Q_UART_MSG_CMD_SET_VOLUME, 7);
  asr.settingCMD(DF2301Q_UART_MSG_CMD_SET_WAKE_TIME, 20);

  asr.playByCMDID(23);
}

void loop() {

  uint8_t CMDID = asr.getCMDID();
  switch (CMDID) {
    case 117:                                                  //若是指令“打开灯光”
      digitalWrite(Led, HIGH);                                 //点亮LED
      Serial.println("received'打开灯光',command flag'117'");  //串口发送received"打开灯光",command flag"117"
      break;

    case 118:                                                  //若是指令“关闭灯光”
      digitalWrite(Led, LOW);                                  //熄灭LED
      Serial.println("received'关闭灯光',command flag'118'");  //串口发送received"关闭灯光",command flag"118"
      break;

    default:
      if (CMDID != 0) {
        Serial.print("CMDID = ");  //打印命令ID
        Serial.println(CMDID);
      }
  }
  delay(300);
}

ESP32-S3-WIFI及蓝牙

DMX512采用ESP32-S3模组。该模组内置WIFI及蓝牙5.0,通过SMA棒状天线进行无线连接。WIFI蓝牙功能的加入,将可实现远程灯光控制、组网控制等多种灯光效果。WIFI蓝牙的开发方法与常规ESP32-S3一致,具体可参考文档:

DFROBOT DFR0975 FireBeetle 2 Board ESP32-S3 产品资料 进阶教程