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 ***)