RS485 Photosynthetically Active Radiation(PAR)Sensor for Arduino- DFRobot

Introduction

The photosynthetically active radiation sensor uses the principle of photoelectric sensing and can measure the photosynthetically active radiation value in the spectral range of 400-700nm. The sensor uses high-precision photoelectric sensing elements, wide spectrum absorption, high absorption, and good stability; when there is light, it generates a voltage signal proportional to the intensity of the incident radiation, and its sensitivity is proportional to the cosine of the direct angle of the incident light. The dust cover is specially treated to reduce dust adsorption and effectively prevent environmental factors from interfering with internal components, and can measure the photosynthetically active radiation value more accurately.

The photosynthetically active 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 photosynthetically active radiation value on the Arduino UNO R3, quickly build a test environment, and the wiring method is simple and easy to use. The photosynthetically active radiation sensor has a protection level of IP67 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: umol/m²•s is the unit of photosynthetically active radiation. Photosynthetically active radiation refers to the radiation of effective light energy that plants can absorb and use during photosynthesis. Photosynthetically active radiation usually refers to light with a wavelength in the range of 400-700nm, which is the range of light required for plants to photosynthesize. The umol in umol/m²•s stands for micromoles, a unit that describes the number of photons in the photosynthesis process. m² represents the area per square meter, and s represents the unit of time, i.e. seconds. Therefore, umol/m²•s represents the number of photons of photosynthetically active radiation per square meter per second. The unit of photosynthetically active radiation, umol/m²•s, is often used to measure the intensity of photosynthesis and the growth status of plants. By measuring the number of photons of photosynthetically active radiation per square meter per second, the photosynthetic efficiency and photosynthetic rate of plant leaves can be evaluated, and a reference can be provided for plant growth, photosynthesis research, etc.

Features

Applications

Specifications:

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

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 Photosynthetically active radiation value Read-only True value
0052H Deviation value Read-write Photosynthetically active radiation deviation value (16-bit signed)
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 the current photosynthetically active 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 bit
0x01 0x03 0x00 0x00 0x00 0x01 0x84 0x0A

Response frame:

Address code Function code Return valid bytes Solar radiation value Check code low bit Check code high bit
0x01 0x03 0x02 0x00 0x64 0x9B 0xAF

Photosynthetically active radiation value:

0064 (hexadecimal) = 100=> Photosynthetically active radiation value = 100μmol/㎡·s

3.2, Write deviation value

Inquiry frame: Write value function code 0x06

Address code Function code Register address Modify value Check code low position Check code high position
0x01 0x06 0x00 0x52 0x00 0x0A 0xA8 0x1C

Response frame:

Address code Function code Register address Modify value Check code low position Check code high position
0x01 0x06 0x00 0x52 0x00 0x0A 0xA8 0x1C

Write the current photosynthetically active radiation deviation value 000A (hexadecimal) =10=> photosynthetically active radiation deviation value = 10μmol/㎡·s, deviation value is 10μmol/㎡·s

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

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 PAR;
void setup() {
  Serial.begin(9600);
  mySerial.begin(4800);
}
void loop() {
  readPAR();
  Serial.print("PAR = ");
  Serial.print(PAR);
  Serial.println(" umol/m²·s ");
  delay(1000);
}

void readPAR(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])) {
                    PAR = Data[3] * 256 + Data[4];
                    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;
}

Expected Results

Print the collected photosynthetically active radiation value, which cannot be collected by ordinary indoor light sources.

FAQ

Possible reasons for no output or output errors:

  1. The sensor is a precision device. Please do not disassemble it by yourself when using it to avoid damage to the product.
  2. If the reading value is 0, check whether there is a light source and whether the product protective cover is removed.
  3. The 485 bus is disconnected, or the A and B lines are connected in reverse.
  4. Check whether the power supply meets the marking.

For any questions, advice or cool ideas to share, please visit the DFRobot Forum.

More Documents

Buy Link