MAX485 TTL to RS-485 Modules for soil NPK sensor

Hi folks,

After diging codes and checking my supplyers manual i had to change the original code found on internet regarding this sensor.
My hardware came in 4800 baud as default, so, i had to fix this, also i bought a serial to rs485 adaptor so i could check data on computer and change baud default to 9600. The request message to sensor is diferent on my npk sensor, so, one more fix, after sending request i had to insert a delay to get a proper result from sensor, some times responses came with 0x00 at beggining...

#include <SoftwareSerial.h>
#include <Wire.h>
#include <stdio.h>

 
#define SCREEN_WIDTH 128    // OLED display width, in pixels
#define SCREEN_HEIGHT 64    // OLED display height, in pixels
#define OLED_RESET -1       // Reset pin # (or -1 if sharing Arduino reset pin)

 
#define RE 8
#define DE 7

 
const byte cond[] = {0x01,0x03, 0x00, 0x02, 0x00, 0x01, 0x25, 0xca};
const byte ph[]   = {0x01,0x03, 0x00, 0x03, 0x00, 0x01, 0x74, 0x0a};
const byte nitro[]= {0x01,0x03, 0x00, 0x04, 0x00, 0x01, 0xc5, 0xcb};
const byte phos[] = {0x01,0x03, 0x00, 0x05, 0x00, 0x01, 0x94, 0x0b};
const byte pota[] = {0x01,0x03, 0x00, 0x06, 0x00, 0x01, 0x64, 0x0b};
const byte sali[] = {0x01,0x03, 0x00, 0x07, 0x00, 0x01, 0x35, 0xcb};

uint16_t values[11];
char buffer[40];
 
SoftwareSerial mod(2,3);
 
void setup() {
  Serial.begin(9600);
  mod.begin(9600);
  pinMode(RE, OUTPUT);
  pinMode(DE, OUTPUT);
  pinMode(2, INPUT);
  pinMode(3, OUTPUT);
  delay(1000);
}


void loop() {
 uint16_t val1,val2,val3,val4,val5,val6;
 
  val1 = sensor_request(nitro[0],nitro[1],nitro[2],nitro[3],nitro[4],nitro[5],nitro[6],nitro[7]);
  sprintf(buffer, "Nitrogenio    = %04u mg/kg\r\n",    val1);
  Serial.print(buffer);  delay(450);
  
  val2 = sensor_request(phos[0],phos[1],phos[2],phos[3],phos[4],phos[5],phos[6],phos[7]);
  sprintf(buffer, "Phosphorous   = %04u mg/kg\r\n", val2);
  Serial.print(buffer);  delay(450);
 
  val3 = sensor_request(pota[0],pota[1],pota[2],pota[3],pota[4],pota[5],pota[6],pota[7]);
  sprintf(buffer, "Potassium     = %04u mg/kg\r\n",   val3);
  Serial.print(buffer); delay(450);

  val4 = sensor_request(ph[0],ph[1],ph[2],ph[3],ph[4],ph[5],ph[6],ph[7]);
  sprintf(buffer, "PH            = %04u  \r\n",               val4);
  Serial.print(buffer); delay(450);

  val5 = sensor_request(cond[0],cond[1],cond[2],cond[3],cond[4],cond[5],cond[6],cond[7]);
  sprintf(buffer, "Condutividade = %04u us/cm\r\n",val5);
  Serial.print(buffer); delay(450);
 
  val6 = sensor_request(sali[0],sali[1],sali[2],sali[3],sali[4],sali[5],sali[6],sali[7]);
  sprintf(buffer, "Salinidade    = %04u mg/L\r\n",    val6);
  Serial.print(buffer);
 
  delay(3000);

}
 
 uint16_t sensor_request(byte d1,byte d2,byte d3,byte d4,byte d5,byte d6,byte d7,byte d8){
  byte inicio;
  uint16_t hbyte;
  while (mod.available()) mod.read(); //Esvazia Buffer Leitura...
  digitalWrite(DE,HIGH);
  digitalWrite(RE,HIGH);
  delay(1);
  mod.write(d1);mod.write(d2);mod.write(d3);mod.write(d4);
  mod.write(d5);mod.write(d6);mod.write(d7);mod.write(d8);
  mod.flush(); 
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);
  delay(250);
 
  inicio=0;
   for (byte i = 0; i < 7; i++) {
    values[i] = mod.read();
    if (inicio == 0 and values[i] ==0 and mod.available()) values[i] = mod.read();
    if (inicio == 0 and values[i] ==0 and mod.available()) values[i] = mod.read();
    if (inicio == 0 and values[i] ==0 and mod.available()) values[i] = mod.read();
    inicio=1;
  }
 /*
  sprintf(buffer,"%02x %02x %02x %02x %02x %02x %02x %02x ", d1,d2,d3,d4,d5,d6,d7,d8);
  Serial.print(buffer);
  Serial.print(" => ");
  for(byte i=0;i<7;i++){
        sprintf(buffer,"%02x ", values[i]);
        Serial.print(buffer);
  }
  Serial.println();  
*/ 
  return (values[3] << 8 | values[4]);
}

















uint8_t salinidade(){
  while (mod.available()) mod.read(); //Esvazia Buffer Leitura...
  digitalWrite(DE,HIGH);
  digitalWrite(RE,HIGH);
  delay(1);
  for (uint8_t i = 0; i < sizeof(sali); i++ ) mod.write( sali[i] );
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);
  delay(200);
  if (mod.available()>7) mod.read();
  for (byte i = 0; i < 7; i++) {
    values[i] = mod.read();
  }
    for(byte i=0;i<8;i++) {
        sprintf(buffer,"%02x ", sali[i]);
        Serial.print(buffer);
  }
  Serial.print(" => ");
  for(byte i=0;i<7;i++){
        sprintf(buffer,"%02x ", values[i]);
        Serial.print(buffer);
  }
  Serial.println();
  return (values[3] << 16 | values[4]);
}


uint8_t PH(){
  uint8_t ph_val=0;
  while (mod.available()) mod.read(); //Esvazia Buffer Leitura...
  digitalWrite(DE,HIGH);
  digitalWrite(RE,HIGH);
  delay(1);
  for (uint8_t i = 0; i < sizeof(ph); i++ ) mod.write( ph[i] );
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);
  delay(200);
  if (mod.available()>7) mod.read();
  for (byte i = 0; i < 7; i++) {
    values[i] = mod.read();
  }
    for(byte i=0;i<8;i++) {
        sprintf(buffer,"%02x ", ph[i]);
        Serial.print(buffer);
  }
  Serial.print(" => ");
  for(byte i=0;i<7;i++){
        sprintf(buffer,"%02x ", values[i]);
        Serial.print(buffer);
  }
  Serial.println();
  ph_val = values[3] << 16 | values[4];
  return (ph_val);
}


uint8_t condutividade(){
  while (mod.available()) mod.read(); //Esvazia Buffer Leitura...
  digitalWrite(DE,HIGH);
  digitalWrite(RE,HIGH);
  delay(1);
  for (uint8_t i = 0; i < sizeof(cond); i++ ) mod.write( cond[i] );
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);
  delay(200);
  if (mod.available()>7) mod.read();
  for (byte i = 0; i < 7; i++) {
    values[i] = mod.read();
  }
  for(byte i=0;i<8;i++) {
        sprintf(buffer,"%02x ", cond[i]);
        Serial.print(buffer);
  }
  Serial.print(" => ");
  for(byte i=0;i<7;i++){
        sprintf(buffer,"%02x ", values[i]);
        Serial.print(buffer);
  }
  Serial.println();  
  return (values[3] << 16 | values[4]);
}

 
uint8_t phosphorous(){
  while (mod.available()) mod.read(); //Esvazia Buffer Leitura...
  digitalWrite(DE,HIGH);
  digitalWrite(RE,HIGH);
  delay(1);
  for (uint8_t i = 0; i < sizeof(phos); i++ ) mod.write( phos[i] );
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);
  delay(200);
  if (mod.available()>7) mod.read();  
  for (byte i = 0; i < 7; i++) {
    values[i] = mod.read();
  }
  for(byte i=0;i<8;i++) {
        sprintf(buffer,"%02x ", phos[i]);
        Serial.print(buffer);
        // Serial.print(nitro[i] ,HEX); Serial.print(" ");
  }
  Serial.print (" => ");
  for(byte i=0;i<7;i++){
        sprintf(buffer,"%02x ", values[i]);
        Serial.print(buffer);
  }
  Serial.println();
  return (values[3] << 16 | values[4]);
}
 
uint8_t potassium(){
  while (mod.available()) mod.read(); //Esvazia Buffer Leitura...
  digitalWrite(DE,HIGH);
  digitalWrite(RE,HIGH);
  delay(1);
  for (uint8_t i = 0; i < sizeof(pota); i++ ) mod.write( pota[i] );
  mod.flush();
  digitalWrite(DE, LOW);
  digitalWrite(RE, LOW);
  delay(200);
  if (mod.available()>7) mod.read();  
  for (byte i = 0; i < 7; i++) {
    values[i] = mod.read();
  }
  for(byte i=0;i<8;i++) {
        sprintf(buffer,"%02x ", pota[i]);
        Serial.print(buffer);
  }
  Serial.print(" => ");
  for(byte i=0;i<7;i++){
        sprintf(buffer,"%02x ", values[i]);
        Serial.print(buffer);
  }
  Serial.println();
  return (values[3] << 16 | values[4]);
 }


NPK Sensor results X commercial measure devices
(*** I had some wrong pontual NPK sensor readings when PH and Conductivity measure devices were in the same jar ***)

1 Like