RS485环境光传感器

简介

光亮度数据参考:
晚上: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

使用教程

硬件准备

软件准备

硬件连接

若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;
}

结果

打印采集到的光照值

DFshopping_car1.png DFRobot商城购买链接

WIKI文档修改历史

文档版本号 修改时间 修改人 修改内容
V1.0 2024.11.28 刘念 第一版发布

产品修改历史

产品版本号 修改时间 修改人 产品修改内容
V1.0 2024.11.28 刘念 第一版发布