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