Introduction
The solar radiation sensor uses the photoelectric principle to convert sunlight into electrical signal output, and can measure the solar radiation value in the spectral range of 400-1100nm. The sensor uses high-precision photosensitive elements, wide spectrum absorption, and good stability. At the same time, a dust cover with a transmittance of up to 95% is installed outside the sensing element. The dust cover is specially treated to reduce dust absorption and effectively prevent environmental factors from interfering with internal components, so that the solar radiation can be measured more accurately.
The solar radiation sensor uses the standard Modbus-RTU 485 communication protocol and DC5-30V wide voltage power supply. It can be used with the TTL to RS485 expansion board (DFR0259) or Gravity: Active Isolated RS485 to UART Signal Adapter Module (DFR0845) to read the solar radiation value on the Arduino UNO R3, quickly build a test environment, and the wiring method is simple and easy to use. The solar radiation sensor has an IP67 protection level and is made of metal aluminum shell. It is widely used in crop growth monitoring, photovoltaic systems, meteorological monitoring, plant physiology research, environmental protection and ecological research, and other fields.
Explanation of measurement units: W/m²: In solar radiation, it represents the power of solar radiation received per square meter of area. Solar radiation refers to the process by which the energy of sunlight propagates through space and reaches the earth. Solar radiation is one of the main sources of energy for various organisms and natural processes on Earth. The intensity of solar radiation can be expressed by measuring the energy received per square meter of area, in units of W/m². This unit can be used to measure the intensity of solar radiation. For example, in solar power generation, W/m² can be used to represent the power of solar energy received per square meter of area of solar panels.
Features
- DC 5~30V wide voltage power supply
- Adopt high-precision photosensitive elements, high absorption in the full spectrum range
- Equipped with a level and adjustment handwheel, convenient for on-site adjustment
- Adopt RS485 interface, standard Modbus-RTU protocol
- Highly transparent dust cover, good sensitivity, special surface treatment to prevent dust absorption
- Metal aluminum shell material, IP67 protection level
Applications
- Crop growth monitoring
- Photovoltaic system
- Weather monitoring
- Plant physiology research
- Environmental protection and ecological research
Specifications:
- Power supply voltage: DC5~30V
- Working current: <10mA
- Output mode: RS485
- Measurement object: Sunlight
- Measurement range: 0~1800W/m²
- Wavelength range: 400-1100nm
- Accuracy: ±5%
- Resolution: 1W/m²
- Response time: ≤10S
- Non-linearity: <±2%
- Annual stability: ≤±2%
- Cosine response: ≤±10%
- Working temperature: -25°C~+60°C
- Protection level: IP67
- Sensor cable length: 20cm
- Adapter cable length: 70cm
Board Overview
Num | Label | Description |
---|---|---|
Brown line | VCC | Power input positive pole, DC5-30V power supply |
Black line | GND | Power ground wire |
Yellow line | 485-A | RS485 data line A |
Blue line | 485-B | RS485 data line B |
Dimensional Drawing

Communication Protocol
1. Basic communication parameters
Interface | Encoding | Data bits | Parity bits | Stop bits | Error checking | Baud rate |
---|---|---|---|---|---|---|
RS485 | 8-bit binary | 8 | None | 1 | CRC | 2400bit/s, 4800bit/s, 9600 bit/s configurable, default 4800bit/s |
2. Data frame format definition
Using Modbus-RTU communication protocol, the format is as follows:
Initial structure ≥4 bytes of time
Address code = 1 byte
Function code = 1 byte
Data area = N bytes
Error check = 16-bit CRC code
End structure ≥4 bytes of time
Address code: The address of the sensor, which is unique in the communication network (factory default 0x01).
Function code: The function indication of the command sent by the host. This sensor reads the register function code 0x03 and writes the register function code 0x06
Data area: The data area is the specific communication data. Note that the high byte of 16-bit data is in front!
CRC code: A two-byte check code.
Host inquiry frame structure:
Address code | Function code | Register start address | Register length | Check code low bit | Check code high bit |
---|---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 1byte | 1byte |
Slave response frame structure:
Address code | Function code | Number of valid bytes | Data area 1 | Data area 2 | Nth data area | Check code |
---|---|---|---|---|---|---|
1byte | 1byte | 1byte | 2byte | 2byte | 2byte | 2byte |
Register address
Register address | Content | Operation | Range and definition |
---|---|---|---|
0000H | Solar radiation value | Read-only | True value |
0052H | Deviation value | Read-write | Solar radiation deviation value (0~1800) |
07D0H | Device address | Read-write | 1~254 (factory default 1) |
07D1H | Device baud rate | Read-write | 0 represents 2400, 1 represents 4800, 2 represents 9600 |
3. Communication protocol example and explanation
3.1 Read current solar radiation value
Inquiry frame: Read value function code 0x03
Address code | Function code | Register start address | Register length | Check code low bit | Check code high position |
---|---|---|---|---|---|
0x01 | 0x03 | 0x00 0x00 | 0x00 0x01 | 0x84 | 0x0A |
Response frame:
Address code | Function code | Return valid bytes | Solar radiation value | Check code low position | Check code high position |
---|---|---|---|---|---|
0x01 | 0x03 | 0x02 | 0x00 0x64 | 0x9B | 0xAF |
Solar radiation value:
0064(hexadecimal) =100=>Solar radiation value=100W/㎡
3.2Write deviation value
Inquiry frame: Write value function code 0x06
Address code | Function code | Register address | Modify value | Check code low bit | Check code high bit |
---|---|---|---|---|---|
0x01 | 0x06 | 0x00 0x52 | 0x00 0x0A | 0xA8 | 0x1C |
Response frame:
Address code | Function code | Register address | Modify value | Check code low bit | Check code high bit |
---|---|---|---|---|---|
0x01 | 0x06 | 0x00 0x52 | 0x00 0x0A | 0xA8 | 0x1C |
Write the current solar radiation deviation value 000A (hexadecimal) =10=> Solar radiation deviation value = 10W/㎡, deviation value is 10W/㎡
3.3 modify the current address
Inquiry frame: (modify the current address to 0x02)
Address code | Function code | Register address | Modify value | Check code low position | Check code high position |
---|---|---|---|---|---|
0x01 | 0x06 | 0x07 0xD0 | 0x00 0x02 | 0x08 | 0x86 |
Response frame:
Address code | Function code | Register address | Modify value | Check code low position | Check code high position |
---|---|---|---|---|---|
0x01 | 0x06 | 0x07 0xD0 | 0x00 0x02 | 0x08 | 0x86 |
3.4 Modify the current baud rate
Inquiry frame: (Modify the current baud rate to 9600)
Address code | Function code | Register address | Modify value | Check code low bit | Check code high bit |
---|---|---|---|---|---|
0x01 | 0x06 | 0x07 0xD1 | 0x00 0x02 | 0x59 | 0x46 |
Response frame:
Address code | Function code | Register address | Modify value | Check code low bit | Check code high |
---|---|---|---|---|---|
0x01 | 0x06 | 0x07 0xD1 | 0x00 0x02 | 0x59 | 0x46 |
3.5 Query current address and baud rate
Inquiry frame:
Address code | Function code | Register address | Data length | Check code low | Check code high |
---|---|---|---|---|---|
0xFF | 0x03 | 0x07 0xD0 | 0x00 0x02 | 0xD1 | 0x58 |
Response frame:
Address code | Function code | Return valid bytes | Address | Baud rate | Checksum low bit | Checksum high bit |
---|---|---|---|---|---|---|
0x01 | 0x03 | 0x04 | 0x00 0x01 | 0x00 0x01 | 0x6A | 0x33 |
The real address of the device read is 01, and the baud rate is 0x01, that is, 4800.
Tutorial
Requirements
- Hardware
- DFRduino UNO R3 (or similar) x 1
- Gravity: Active Isolated RS485 to UART Signal Adapter Module x1
- RS485 Photoelectric Solar Radiation Sensor x1
- Software
Connection Diagram
If the power of the RS485 device is small and the required current is less than 12V-160mA, the RS485 to UART signal conversion module does not require a 12V external power supply, making wiring more convenient.

Sample Code
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3);
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;
}
Expected Results
Print the collected solar radiation values, which cannot be collected by ordinary indoor light sources.

FAQ
Possible reasons for no output or output errors:
The sensor is a precision device, please do not remove the protective transparent cover at will
If the reading value is 0, check whether there is a light source and whether the product protective cover is removed
The 485 bus is disconnected, or the A and B lines are connected in reverse
Check whether the power supply meets the marking
The dust cover must be kept clean and wiped with a soft cloth regularly
There must be no water in the dust cover. If there is heavy rain, snow, ice and other long-term weather, it is recommended to cover it
For any questions, advice or cool ideas to share, please visit the DFRobot Forum.