RS485太阳辐射

简介

太阳总辐射传感器采用光电原理,将太阳光转化为电信号输出,可以测量光谱范围400-1100nm的太阳总辐射值。传感器采用高精度的感光元件,宽光谱吸收,稳定性好。同时感应元件外安装透光率高达 95%的防尘罩,防尘罩采用特殊处理,减少灰尘吸附,有效防止环境因素对内部元件的干扰,能够较为精准的测量太阳辐射量。

太阳总辐射传感器采用标准Modbus-RTU 485通讯协议,DC5-30V宽电压供电,可以搭配TTL转RS485扩展板(DFR0259)或Gravity: RS485转UART 有源隔离型 信号转换模块(DFR0845)在Arduino UNO R3上读取太阳辐射值,快速搭建测试环境,接线方式简单,使用方便。太阳总辐射传感器防护等级IP67,金属铝壳材质,广泛用于农作物生长监测、光伏系统、气象监测、植物生理研究、环保生态研究等领域。

测量单位解释:
W/m²:在太阳辐射中表示每平方米的面积上接收到的太阳能辐射的功率。太阳辐射是指太阳光的能量在空间中传播并到达地球的过程。太阳辐射是地球上各种生物和自然过程的主要能量来源之一。太阳辐射的强度可以通过测量每平方米面积上接收到的能量来表示,以W/m²为单位。这个单位可以用来衡量太阳辐射的强度,比如在太阳能发电中,可以用W/m²来表示太阳能电池板每平方米面积上接收到的太阳能的功率。

特性

  • DC 5~30V宽电压供电
  • 采用高精度感光元件,全光谱范围内吸收量高
  • 自带水平仪及调节手轮,现场方便调节
  • 采用RS485接口,标准Modbus-RTU协议
  • 高透明防尘罩,感光度好,表面特殊处理,防止灰尘吸附
  • 金属铝壳材质,IP67防护等级

应用场景

  • 农作物生长监测
  • 光伏系统
  • 气象监测
  • 植物生理研究
  • 环保生态研究

技术规格

  • 供电电压:DC5~30V
  • 工作电流:<10mA
  • 输出方式:RS485
  • 测量对象:太阳光
  • 测量范围:0~1800W/m²
  • 波长范围:400-1100nm
  • 精度:±5%
  • 分辨率:1W/m²
  • 响应时间:≤10S
  • 非线性:<±2%
  • 年稳定度:≤±2%
  • 余弦响应:≤±10%
  • 工作温度:-25°C~+60°C
  • 工作湿度:0%~100%RH
  • 防护等级:IP67
  • 传感器线长:20cm
  • 转接线线长:70cm

引脚示意图

线序 功能描述
棕线 DC5-30V供电
黑线 GND
黄线 RS485-A
蓝线 RS485-B

尺寸图

通讯协议

1、通讯基本参数

接口 编码 数据位 奇偶校验位 停止位 错误校验 波特率
RS485 8位二进制 8 1 CRC 2400bit/s、4800bit/s、9600 bit/s 可设,默认4800bit/s

2、数据帧格式定义

采用 Modbus-RTU 通讯规约,格式如下:
初始结构 ≥4 字节的时间
地址码 = 1 字节
功能码 = 1 字节
数据区 = N 字节
错误校验 = 16 位 CRC 码
结束结构 ≥4 字节的时间
地址码:为传感器的地址,在通讯网络中是唯一的(出厂默认 0x01)。
功能码:主机所发指令功能指示,本传感器读取寄存器功能码0x03,写入寄存器功能码0x06
数据区:数据区是具体通讯数据,注意 16bits 数据高字节在前!
CRC 码:二字节的校验码。

主机问询帧结构:

地址码 功能码 寄存器起始地址 寄存器长度 检验码低位 检验码高位
1byte 1byte 2byte 2byte 1byte 1byte

从机应答帧结构:

地址码 功能码 有效字节数 数据一区 第二数据区 第N数据区 检验码
1byte 1byte 1byte 2byte 2byte 2byte 2byte

寄存器地址

寄存器地址 内容 操作 范围及定义说明
0000H 太阳辐射值 只读 真实值
0052H 偏差值 读写 太阳辐射偏差值(0~1800)
07D0H 设备地址 读写 1~254(出厂默认1)
07D1H 设备波特率 读写 0代表2400,1代表4800,2代表9600

3、通讯协议示例及解释

3.1、读取当前太阳辐射值

问询帧:读取数值功能码 0x03

地址码 功能码 寄存器起始地址 寄存器长度 检验码低位 检验码高位
0x01 0x03 0x00 0x00 0x00 0x01 0x84 0x0A

应答帧:

地址码 功能码 返回有效字节数 太阳辐射值 校验码低位 校验码高位
0x01 0x03 0x02 0x00 0x64 0x9B 0xAF

太阳辐射值:
0064(16进制) =100=> 太阳辐射值=100W/㎡

3.2、写入偏差值

问询帧:写入数值功能码 0x06

地址码 功能码 寄存器地址 修改数值 检验码低位 检验码高位
0x01 0x06 0x00 0x52 0x00 0x0A 0xA8 0x1C

应答帧:

地址码 功能码 寄存器地址 修改数值 校验码低位 校验码高位
0x01 0x06 0x00 0x52 0x00 0x0A 0xA8 0x1C

写入当前太阳辐射偏差值
000A(16进制) =10=> 太阳辐射偏差值=10W/㎡,偏差值为10W/㎡

3.3、修改当前地址

问询帧:(修改当前地址为 0x02 )

地址码 功能码 寄存器地址 修改数值 检验码低位 检验码高位
0x01 0x06 0x07 0xD0 0x00 0x02 0x08 0x86

应答帧:

地址码 功能码 寄存器地址 修改数值 校验码低位 校验码高位
0x01 0x06 0x07 0xD0 0x00 0x02 0x08 0x86

3.4、修改当前波特率

问询帧:(修改当前波特率为9600 )

地址码 功能码 寄存器地址 修改数值 检验码低位 检验码高位
0x01 0x06 0x07 0xD1 0x00 0x02 0x59 0x46

应答帧:

地址码 功能码 寄存器地址 修改数值 校验码低位 校验码高位
0x01 0x06 0x07 0xD1 0x00 0x02 0x59 0x46

3.5、查询当前地址、波特率

问询帧:

地址码 功能码 寄存器地址 数据长度 检验码低位 检验码高位
0xFF 0x03 0x07 0xD0 0x00 0x02 0xD1 0x58

应答帧:

地址码 功能码 返回有效字节数 地址 波特率 校验码低位 校验码高位
0x01 0x03 0x04 0x00 0x01 0x00 0x01 0x6A 0x33

读取到设备的真实地址为 01,波特率为 0x01,即 4800。

使用教程

硬件准备

软件准备

硬件连接

若RS485设备的功率较小,需求电流小于12V-160mA,RS485转UART信号转换模块则无需12V外部供电,接线更方便。

演示代码

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3);//定义软串口,3号端口为TX,2号端口为RX
uint8_t Com[8] = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A };  //太阳总辐射
int TSR;
void setup() {
  Serial.begin(9600);
  mySerial.begin(4800);  //初始化串口
}
void loop() {
  readTSR();
  Serial.print("TSR = ");
  Serial.print(TSR);
  Serial.println(" W/m² ");
  delay(1000);
}

void readTSR(void) {
  uint8_t Data[10] = { 0 };
  uint8_t ch = 0;
  bool flag = 1;
  while (flag) {
    delay(100);
    mySerial.write(Com, 8);
    delay(100);
    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 == 0x02) {
                Data[2] = ch;
                if (readN(&Data[3], 4) == 4) {
                  if (CRC16_2(Data, 5) == (Data[5] * 256 + Data[6])) {
                    TSR = Data[3] * 256 + Data[4];
                    flag = 0;
                  }
                }
              }
            }
          }
        }
      }
    }
    Serial.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;
}

结果

打印采集到的太阳辐射值,室内普通光源无法采集。

常见问题

1.传感器属于精密器件,请勿随意拆卸保护透明罩
2.若读取数值显示为 0,检查是否有光源,检查产品保护盖是否取下
3.485 总线有断开,或者 A、B 线接反
4.检查电源是否符合标注
5.防尘罩需保持光洁,定期软布擦拭
6.防尘罩内不可有水,如遇到大雨、雪、冰等较长时间的天气,建议最好加盖

DFshopping_car1.png DFRobot商城购买链接