NPK sensor interface with Esp32

#include <Arduino.h>

#define TAG      "RS485_MODB_APP"
#define mod      Serial2
#define TXD      17
#define RXD      16
#define RE       2
#define DE       4
#define BUF_SIZE 11

#define NITRO 0
#define PHOS  1
#define POTA  2

const uint32_t TIMEOUT = 500;

const byte moist[] = {0x3C, 0x61, 0x05, 0x11, 0xDD, 0xA4};
const byte temp[]  = {0x01, 0x03, 0x00, 0x01, 0x00, 0x01, 0xD5, 0xCA};
const byte EC[]    = {0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x25, 0xCA};
const byte PH[]    = {0x01, 0x03, 0x00, 0x03, 0x00, 0x01, 0x74, 0x0A};
const byte nitro[] = {0xFF, 0x03, 0x00, 0x00, 0x00, 0x01, 0x91, 0xD4};
const byte phos[]  = {0x01, 0x03, 0x00, 0x1f, 0x00, 0x01, 0xb5, 0x0cc};
const byte pota[]  = {0x01, 0x03, 0x00, 0x20, 0x00, 0x01, 0x85, 0x0c0};

byte values[11];

void setup() {
  // Serial.begin(9600);
  Serial.begin(9600);
  mod.begin(9600);
  pinMode(RE, OUTPUT);
  pinMode(DE, OUTPUT);

  delay(500);
}

void loop() {
  uint16_t val1, val2, val3, val4, val5, val6, val7;

  Serial.println("Moisture: ");
  val1 = moisture();
  float Val1 = val1 * 0.1;
  delay(1000);
  //Serial.print(val1);
  Serial.print(Val1);
  Serial.println(" %");
  Serial.println("-----");
  //delay(1000);

  Serial.println("Temperature: ");
  val2 = temperature();
  float Val2 = val2 * 0.1;
  delay(1000);
  //Serial.print(val2);
  Serial.print(Val2);
  Serial.println(" *C");
  Serial.println("-----");
  //delay(1000);

  Serial.println("EC: ");
  val3 = conductivity();
  delay(1000);
  Serial.print(val3);
  Serial.println(" us/cm");
  Serial.println("-----");

  Serial.println("Ph: ");
  val4 = ph();
  float Val4 = val4 * 0.1;
  delay(1000);
  //Serial.print(val4);
  Serial.print(Val4);
  Serial.println(" ph");
  Serial.println("-----");

    Serial.println("Nitrogen (N): ");
  val5 = N();
//  float Val2 = val2 * 0.1;
  delay(1000);
  Serial.print(val5);
//  Serial.print(Val5);
  Serial.println(" mg/kg\n");
  Serial.println("-----");
  //delay(1000);

  Serial.println("Phosphorous (P): ");
  val6 = P();
  delay(1000);
  Serial.print(val6);
  Serial.println(" mg/kg\n");
  Serial.println("-----");

  Serial.println("Potassium (K): ");
  val7 = K();
//  float Val7 = val7 * 0.1;
  delay(1000);
  Serial.print(val4);
//  Serial.print(Val7);
  Serial.println(" mg/kg\n");
  Serial.println("-----");

  delay(5000);
}

int16_t moisture() {
  uint32_t startTime = 0;
  uint8_t byteCount = 0;

  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  delay(10);
  mod.write(moist, sizeof(moist));
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);

  startTime = millis();
  while ( millis() - startTime <= TIMEOUT ) {
    if (mod.available() && byteCount < sizeof(values) ) {
      values[byteCount++] = mod.read();
      printHexByte(values[byteCount - 1]);
    }
  }
  Serial.println();
  return (int16_t)(values[4] << 8 | values[5]);

}

int16_t temperature() {
  uint32_t startTime = 0;
  uint8_t byteCount = 0;

  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  delay(10);
  mod.write(temp, sizeof(temp));
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);

  startTime = millis();
  while ( millis() - startTime <= TIMEOUT ) {
    if (mod.available() && byteCount < sizeof(values) ) {
      values[byteCount++] = mod.read();
      printHexByte(values[byteCount - 1]);
    }
  }
  Serial.println();
  return (int16_t)(values[4] << 8 | values[5]);

}

int16_t conductivity() {
  uint32_t startTime = 0;
  uint8_t byteCount = 0;

  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  delay(10);
  mod.write(EC, sizeof(EC));
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);

  startTime = millis();
  while ( millis() - startTime <= TIMEOUT ) {
    if (mod.available() && byteCount < sizeof(values) ) {
      values[byteCount++] = mod.read();
      printHexByte(values[byteCount - 1]);
    }
  }
  Serial.println();
  return (int16_t)(values[4] << 8 | values[5]);

}

int16_t ph() {
  uint32_t startTime = 0;
  uint8_t byteCount = 0;

  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  delay(10);
  mod.write(PH, sizeof(PH));
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);

  startTime = millis();
  while ( millis() - startTime <= TIMEOUT ) {
    if (mod.available() && byteCount < sizeof(values) ) {
      values[byteCount++] = mod.read();
      printHexByte(values[byteCount - 1]);
    }
  }
  Serial.println();
  return (int16_t)(values[4] << 8 | values[5]);

}

int16_t N() {
  uint32_t startTime = 0;
  uint8_t byteCount = 0;

  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  delay(10);
  mod.write(nitro, sizeof(nitro));
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);

  startTime = millis();
  while ( millis() - startTime <= TIMEOUT ) {
    if (mod.available() && byteCount < sizeof(values) ) {
      values[byteCount++] = mod.read();
      printHexByte(values[byteCount - 1]);
    }
  }
  Serial.println();
  return (int16_t)(values[4] << 8 | values[5]);

}

int16_t P() {
  uint32_t startTime = 0;
  uint8_t byteCount = 0;

  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  delay(10);
  mod.write(phos, sizeof(phos));
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);

  startTime = millis();
  while ( millis() - startTime <= TIMEOUT ) {
    if (mod.available() && byteCount < sizeof(values) ) {
      values[byteCount++] = mod.read();
      printHexByte(values[byteCount - 1]);
    }
  }
  Serial.println();
  return (int16_t)(values[4] << 8 | values[5]);

}

int16_t K() {
  uint32_t startTime = 0;
  uint8_t byteCount = 0;

  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  delay(10);
  mod.write(pota, sizeof(pota));
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);

  startTime = millis();
  while ( millis() - startTime <= TIMEOUT ) {
    if (mod.available() && byteCount < sizeof(values) ) {
      values[byteCount++] = mod.read();
      printHexByte(values[byteCount - 1]);
    }
  }
  Serial.println();
  return (int16_t)(values[4] << 8 | values[5]);

}

void printHexByte(byte b)
{
  Serial.print((b >> 4) & 0xF, HEX);
  Serial.print(b & 0xF, HEX);
  Serial.print(' ');
}

I have written this code to read data NPK, Moisture, Temp, EC, and PH over RS485 through ESP32. But I am getting Zero values, If anyone of you know how to work with 7 in 1 sensor please help me.

mod.available returns the number of bytes available in the buffer for you to read. You are running this code even if ONLY one byte is available and miss all the bytes that might still being transmitted.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.