简介
太阳总辐射传感器采用光电原理,将太阳光转化为电信号输出,可以测量光谱范围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。
使用教程
硬件准备
- 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, 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.防尘罩内不可有水,如遇到大雨、雪、冰等较长时间的天气,建议最好加盖
