I want to read this sensor, it is an NPK Sensor. For this, I have this board, and this hat of this board to read the Mobus 485 link.
For this, the origin code that the hat gives us. To read the sensor I use the next tutorial, and finally the config of the NPK sensor:
Then after all of this, I generated this code:
#define PIN_5V_EN 0
#define CAN_TX_PIN 22
#define CAN_RX_PIN 21
#define RS485_TX_PIN 19
#define RS485_RX_PIN 18
#define RS485_EN_PIN 23
#define RE 23
#define DE 0
#include <Arduino.h>
#include <HardwareSerial.h>
#include <ModbusMaster.h>
// instantiate ModbusMaster object
ModbusMaster node;
HardwareSerial Serial485(2);
// Modbus RTU requests for reading NPK values
const byte water[] = {0x01, 0x03, 0x02, 0x01, 0x00, 0x01, 0xd4, 0x72};
const byte temp[] = {0x01, 0x03, 0x02, 0x00, 0x00, 0x01, 0x85, 0xb2};
const byte ec[] = {0x01, 0x03, 0x02, 0x02, 0x00, 0x01, 0x24, 0x72};
const byte ph[] = {0x01, 0x03, 0x02, 0x03, 0x00, 0x01, 0x75, 0xb2};
const byte nitro[] = {0x01, 0x03, 0x02, 0x04, 0x00, 0x01, 0xce, 0x73};
const byte phos[] = {0x01, 0x03, 0x02, 0x05, 0x00, 0x01, 0x95, 0xb3};
const byte pota[] = {0x01, 0x03, 0x02, 0x06, 0x00, 0x01, 0x65, 0xb3};
const byte dev_add[] = {0x01, 0x03, 0x10, 0x00, 0x00, 0x01, 0x80, 0xca};
const byte dev_baud[] = {0x01, 0x03, 0x10, 0x01, 0x00, 0x01, 0xd1, 0x0A};
// A variable used to store NPK values
byte values[11];
void CANTask(void *prarm);
void setup()
{
pinMode(RS485_EN_PIN, OUTPUT);
pinMode(PIN_5V_EN, OUTPUT);
Serial.begin(9600);
Serial485.begin(9600, SERIAL_8N1, RS485_RX_PIN, RS485_TX_PIN);
delay(5);
node.begin(2, Serial485);
}
void loop()
{
static uint32_t i;
uint8_t j, result;
uint16_t data[6];
byte val1,val2,val3,val4,val5,val6,val7,val8,val9;
val1 = water_func();
delay(250);
val2 = temperature();
delay(250);
val3 = ec_func();
delay(250);
val5 = ph_func();
delay(250);
val5 = nitrogen();
delay(250);
val6 = phosphorous();
delay(250);
val7 = potassium();
delay(250);
val8 = dev_add_func();
delay(250);
val9 = dev_baud_func();
delay(250);
// Print values to the serial monitor
Serial.print("Water: ");
Serial.print(val1);
Serial.println(" mg/kg");
Serial.print("Tempetature: ");
Serial.print(val2);
Serial.println(" ºC");
Serial.print("EC: ");
Serial.print(val3);
Serial.println(" mg/kg");
Serial.print("PH: ");
Serial.print(val4);
Serial.println(" mg/kg");
Serial.print("Nitrogen: ");
Serial.print(val5);
Serial.println(" mg/kg");
Serial.print("Phosphorous: ");
Serial.print(val6);
Serial.println(" mg/kg");
Serial.print("Potassium: ");
Serial.print(val7);
Serial.println(" mg/kg");
Serial.print("Devive_Address: ");
Serial.println(val8);
Serial.print("Devive_Baud: ");
Serial.println(val8);
delay(20000);
}
byte water_func(){
digitalWrite(DE,HIGH);
digitalWrite(RE,HIGH);
delay(10);
if(Serial485.write(water,sizeof(water))==8){
digitalWrite(DE,LOW);
digitalWrite(RE,LOW);
for(byte i=0;i<7;i++){
Serial.print(Serial485.read(),HEX);
values[i] = Serial485.read();
Serial.print(values[i],HEX);
}
Serial.println();
}
return values[4];
}
byte temperature(){
digitalWrite(DE,HIGH);
digitalWrite(RE,HIGH);
delay(10);
if(Serial485.write(temp,sizeof(temp))==8){
digitalWrite(DE,LOW);
digitalWrite(RE,LOW);
for(byte i=0;i<7;i++){
Serial.print(Serial485.read(),HEX);
values[i] = Serial485.read();
Serial.print(values[i],HEX);
}
Serial.println();
}
return values[4];
}
byte ec_func(){
digitalWrite(DE,HIGH);
digitalWrite(RE,HIGH);
delay(10);
if(Serial485.write(ec,sizeof(ec))==8){
digitalWrite(DE,LOW);
digitalWrite(RE,LOW);
for(byte i=0;i<7;i++){
Serial.print(Serial485.read(),HEX);
values[i] = Serial485.read();
Serial.print(values[i],HEX);
}
Serial.println();
}
return values[4];
}
byte ph_func(){
digitalWrite(DE,HIGH);
digitalWrite(RE,HIGH);
delay(10);
if(Serial485.write(ph,sizeof(ph))==8){
digitalWrite(DE,LOW);
digitalWrite(RE,LOW);
for(byte i=0;i<7;i++){
Serial.print(Serial485.read(),HEX);
values[i] = Serial485.read();
Serial.print(values[i],HEX);
}
Serial.println();
}
return values[4];
}
byte nitrogen(){
digitalWrite(DE,HIGH);
digitalWrite(RE,HIGH);
delay(10);
if(Serial485.write(nitro,sizeof(nitro))==8){
digitalWrite(DE,LOW);
digitalWrite(RE,LOW);
for(byte i=0;i<7;i++){
Serial.print(Serial485.read(),HEX);
values[i] = Serial485.read();
Serial.print(values[i],HEX);
}
Serial.println();
}
return values[4];
}
byte phosphorous(){
digitalWrite(DE,HIGH);
digitalWrite(RE,HIGH);
delay(10);
if(Serial485.write(phos,sizeof(phos))==8){
digitalWrite(DE,LOW);
digitalWrite(RE,LOW);
for(byte i=0;i<7;i++){
Serial.print(Serial485.read(),HEX);
values[i] = Serial485.read();
Serial.print(values[i],HEX);
}
Serial.println();
}
return values[4];
}
byte potassium(){
digitalWrite(DE,HIGH);
digitalWrite(RE,HIGH);
delay(10);
if(Serial485.write(pota,sizeof(pota))==8){
digitalWrite(DE,LOW);
digitalWrite(RE,LOW);
for(byte i=0;i<7;i++){
Serial.print(Serial485.read(),HEX);
values[i] = Serial485.read();
Serial.print(values[i],HEX);
}
Serial.println();
}
return values[4];
}
byte dev_add_func(){
digitalWrite(DE,HIGH);
digitalWrite(RE,HIGH);
delay(10);
if(Serial485.write(dev_add,sizeof(dev_add))==8){
digitalWrite(DE,LOW);
digitalWrite(RE,LOW);
for(byte i=0;i<7;i++){
Serial.print(Serial485.read(),HEX);
values[i] = Serial485.read();
Serial.print(values[i],HEX);
}
Serial.println();
}
return values[4];
}
byte dev_baud_func(){
digitalWrite(DE,HIGH);
digitalWrite(RE,HIGH);
delay(10);
if(Serial485.write(dev_baud,sizeof(dev_baud))==8){
digitalWrite(DE,LOW);
digitalWrite(RE,LOW);
for(byte i=0;i<7;i++){
Serial.print(Serial485.read(),HEX);
values[i] = Serial485.read();
Serial.print(values[i],HEX);
}
Serial.println();
}
return values[4];
}
But when I ran it, this is the output:
I think I have some issues with how to transmit the message and read it, any idea?
Thanks!!!