简介
光亮度数据参考:
晚上:0.001-0.02 lx;
月夜:0.02-0.3 lx;
多云室内:5-50 lx;
多云室外:50-500 lx;
晴天室内:100-1000 lx;
夏天中午光照下:大约10*6 lx;
阅读书籍时的照明度:50-60 lx;
家庭录像标准照明度:1400 lx;
特性
- 防水等级IP68
- DC 5~32V宽电压供电
- 0~200000lux大量程测量范围
- 采用RS485接口,标准Modbus-RTU协议
应用场景
- 气象站
- 蔬菜大棚
- 户外照明
- 花卉培养 工厂车间照明
- 汽车智能灯
技术规格
- 供电电压:DC5~32V
- 工作电流:<10mA
- 输出方式:RS485
- 测量范围:0~200000Lux
- 分辨率:0.01Lux
- 精度:±5%
- 工作温度:-40°C~+80°C
- 防护等级:IP68
- 螺纹长度:10mm
- 开孔尺寸:25mm
- 扳手尺寸:33mm
- 电缆直径:4-10mm
- 传感器线长:1m
引脚示意图

线序 | 功能描述 |
---|---|
红线 | DC5-32V供电 |
蓝线 | GND |
黄线 | RS485-A |
绿线 | RS485-B |
尺寸图

通讯协议
1、通讯基本参数
接口 | 编码 | 数据位 | 奇偶校验位 | 停止位 | 错误校验 | 波特率 |
---|---|---|---|---|---|---|
RS485 | 8位二进制 | 8 | 无 | 1 | CRC | 1200、2400、4800、9600、19200、38400、57600bit/s 可设,默认9600bit/s |
2、数据帧格式定义
采用 Modbus-RTU 通讯规约,格式如下:
初始结构 ≥4 字节的时间
地址码 = 1 字节
功能码 = 1 字节
数据区 = N 字节
错误校验 = 16 位 CRC 码
结束结构 ≥4 字节的时间
地址码:为传感器的地址,在通讯网络中是唯一的(出厂默认 0x01)。
功能码:主机所发指令功能指示,本传感器读取寄存器功能码0x03,写入寄存器功能码0x06
数据区:数据区是具体通讯数据,注意 16bits 数据高字节在前!
CRC 码:二字节的校验码。
寄存器地址
寄存器地址 | 内容 | 操作 | 范围及定义说明 |
---|---|---|---|
0002H | 光照值高16位数据 | 只读 | 两个字节 |
0003H | 光照值低16位数据 | 只读 | 两个字节 |
0046H | 光照采集速率 | 读写 | 1-20级 |
0047H | 光照校准使能位 | 读写 | 01 使能光照校准功能、00 关闭光照校准功能 |
0048H | 光照校准补偿值 | 读写 | 该值为实际值扩大 100 倍写入;比如需要补偿 1.4,写入值需要扩大 100 倍,也就是 140; 计算方法:(采集光照值÷环境光照值)×100 = 补偿值 举例说明:采集光照值 221,实际环境光照为 260,计算补偿值 = (221÷260)×100 = 85 |
0064H | 16 位设备地址 | 读写 | 范围为(1-254),255 为通用控制命令地址 |
0065H | 16 位波特率选择 | 读写 | 0-1200、1-2400、2-4800、3-9600、 4-19200、5-38400、6-57600 |
0066H | 奇偶校验位 | 读写 | 00 无校验、01 奇校验、02 偶校验 |
0067H | 版本信息 | 只读 | 1-20级 |
00E0H | 设备软复位写指令 | 只写 | 1-20级 |
00F0H | 设备恢复出厂设置写指令 | 只写 | 1-20级 |
3、通讯协议示例及解释
3.1、读取多寄存器光照数据指令
问询帧:
地址码 | 功能码 | 寄存器起始地址 | 寄存器长度 | 检验码低位 | 检验码高位 |
---|---|---|---|---|---|
0x01 | 0x03 | 0x00 0x02 | 0x00 0x02 | 0x65 | 0xCB |
应答帧:
地址码 | 功能码 | 返回有效字节数 | 光照数据高16位 | 光照数据低16位 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|---|
0x01 | 0x03 | 0x04 | 0x00 0x0C | 0xF4 0x73 | 0x3D | 0x15 |
光照值:
00 0C F4 73(16进制) =849011/1000 =>光照值= 849.011Lux
3.2、修改当前地址
问询帧:(修改当前地址为 0x02 )
地址码 | 功能码 | 寄存器地址 | 修改数值 | 检验码低位 | 检验码高位 |
---|---|---|---|---|---|
0x01 | 0x06 | 0x00 0x64 | 0x00 0x02 | 0x49 | 0xD4 |
应答帧:
地址码 | 功能码 | 寄存器地址 | 修改数值 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|
0x01 | 0x06 | 0x00 0x64 | 0x00 0x02 | 0x49 | 0xD4 |
3.3、修改地址、波特率
问询帧:(修改地址为0x01,波特率为9600 )
修改地址或波特率后,传感器需要断电重连
地址码 | 功能码 | 寄存器起始地址 | 寄存器长度 | 修改地址 | 修改波特率 | 奇偶检验 | 检验码低位 | 检验码高位 |
---|---|---|---|---|---|---|---|---|
0x01 | 0x10 | 0x00 0x64 | 0x00 0x03 | 0x00 0x01 | 0x00 0x03 | 0x00 0x00 | 0xA9 | 0x03 |
应答帧:
地址码 | 功能码 | 寄存器起始地址 | 寄存器长度 | 修改地址 | 修改波特率 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|---|---|
0x01 | 0x10 | 0x00 0x64 | 0x00 0x03 | 0x00 0x01 | 0x00 0x03 | 0x9C | 0x05 |
3.4、查询当前地址、波特率
问询帧:
地址码 | 功能码 | 寄存器起始地址 | 数据长度 | 检验码低位 | 检验码高位 |
---|---|---|---|---|---|
0xFF | 0x03 | 0x00 0x64 | 0x00 0x02 | 0x90 | 0x0A |
应答帧:
地址码 | 功能码 | 返回有效字节数 | 设备地址 | 波特率 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|---|
0x01 | 0x03 | 0x04 | 0x00 0x01 | 0x00 0x03 | 0xEB | 0xF2 |
读取到设备的真实地址为 01,波特率为 0x03,即 9600。
3.5、设备恢复出厂设置指令
问询帧:
地址码 | 功能码 | 寄存器地址 | 修改数据 | 检验码低位 | 检验码高位 |
---|---|---|---|---|---|
0xFF | 0x06 | 0x00 0xF0 | 0x00 0x00 | 0x9C | 0x27 |
应答帧:
地址码 | 功能码 | 寄存器地址 | 修改数据 | 检验码低位 | 检验码高位 |
---|---|---|---|---|---|
0xFF | 0x06 | 0x00 0xF0 | 0x00 0x00 | 0x9C | 0x27 |
使用教程
硬件准备
- Arduino UNO x1
- RS485防水型环境光传感器 x1
- Gravity: RS485转UART 有源隔离型 信号转换模块 x1
软件准备
- 下载Arduino IDE: 点击下载Arduino IDE
硬件连接
若RS485设备的功率较小,需求电流小于12V-160mA,RS485转UART信号转换模块则无需12V外部供电,接线更方便。
演示代码
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3);//定义软串口,3号端口为TX,2号端口为RX
uint8_t Com[8] = { 0x01, 0x03, 0x00, 0x02, 0x00, 0x02, 0x65, 0xCB }; //采集光照
float LUX;
void setup() {
Serial.begin(9600); //初始化串口
mySerial.begin(9600);
}
void loop() {
readLux();
Serial.print("Lux = ");
Serial.print(LUX, 3);
Serial.println(" (lux) ");
delay(1000);
}
void readLux(void) {
uint8_t Data[10] = { 0 };
uint8_t ch = 0;
bool flag = 1;
while (flag) {
delay(100);
mySerial.write(Com, 8);
delay(10);
if (readN(&ch, 1) == 1) {
if (ch == 0x01) {
Data[0] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x03) {
Data[1] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x04) {
Data[2] = ch;
if (readN(&Data[3], 6) == 6) {
if (CRC16_2(Data, 7) == (Data[7] * 256 + Data[8])) {
LUX = (Data[3] * 0x1000000 + Data[4] * 0x10000 + Data[5] * 0x100 + Data[6]) / 1000.000;
flag = 0;
}
}
}
}
}
}
}
}
mySerial.flush();
}
}
uint8_t readN(uint8_t *buf, size_t len) {
size_t offset = 0, left = len;
int16_t Tineout = 500;
uint8_t *buffer = buf;
long curr = millis();
while (left) {
if (mySerial.available()) {
buffer[offset] = mySerial.read();
offset++;
left--;
}
if (millis() - curr > Tineout) {
break;
}
}
return offset;
}
unsigned int CRC16_2(unsigned char *buf, int len) {
unsigned int crc = 0xFFFF;
for (int pos = 0; pos < len; pos++) {
crc ^= (unsigned int)buf[pos];
for (int i = 8; i != 0; i--) {
if ((crc & 0x0001) != 0) {
crc >>= 1;
crc ^= 0xA001;
} else {
crc >>= 1;
}
}
}
crc = ((crc & 0x00ff) << 8) | ((crc & 0xff00) >> 8);
return crc;
}
结果
打印采集到的光照值
WIKI文档修改历史
文档版本号 | 修改时间 | 修改人 | 修改内容 |
---|---|---|---|
V1.0 | 2024.11.28 | 刘念 | 第一版发布 |
产品修改历史
产品版本号 | 修改时间 | 修改人 | 产品修改内容 |
---|---|---|---|
V1.0 | 2024.11.28 | 刘念 | 第一版发布 |