I am developing a project for soil monitoring for plants.
I'm using NodeMCU, RS485 expansion base for MAX495, below is the assembly diagram
I asked the sensor manufacturer if they had a code to send me for the 7 in 1 sensor, this code was given to me:
#include <SoftwareSerial.h>
// RO to pin 8 & DI to pin 9 when using AltSoftSerial
#define RE 4
#define DE 3
// const byte temp[] = {0x02,0x03, 0x00, 0x13, 0x00, 0x01, 0x75, 0xcf};//
const byte temp[] = {0x01, 0x03, 0x00, 0x01, 0x00, 0x01, 0xD5, 0xCA};//
// const byte mois[] = {0x02,0x03,0x00,0x12,0x00,0x01,0x24,0x0F};
const byte mois[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
// const byte econ[] = {0x02,0x03, 0x00, 0x15, 0x00, 0x01, 0x95, 0xce};
const byte econ[] = {0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x25, 0xCA};
// const byte ph[] = {0x02,0x03, 0x00, 0x06, 0x00, 0x01, 0x64, 0x0b};//0x0B64
const byte ph[] = {0x01, 0x03, 0x00, 0x03, 0x00, 0x01, 0x74, 0x0A};//0x0B64
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};
byte values[11];
SoftwareSerial mod(6,5);
float envhumidity = 0.0, envtemperature = 0.0, soil_ph = 0.0, soil_mois = 0.0, soil_temp = 0.0;
byte val1 = 0, val2 = 0, val3 = 0, val4 = 0,val5 = 0, val6 = 0, val7 = 0;
unsigned long delayOneK = 1000;
unsigned long pastTime = millis();
int state = 0;
void setup() {
Serial.begin(9600);
mod.begin(9600);
pinMode(RE, OUTPUT);
pinMode(DE, OUTPUT);
// put RS-485 into receive mode
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
delay(3000);
}
void loop() {
switch ( state )
{
case 0:
if ( (millis() - pastTime ) >= delayOneK )
{
val1 = moisture();
soil_mois = val1 / 10.0;
state = 1;
Serial.print("Moisture: "); Serial.print(soil_mois); Serial.println(" %");
pastTime = millis();
}
break;
case 1:
if ( (millis() - pastTime) >= delayOneK )
{
soil_temp = temperature() / 10.0;
Serial.print("Temperature: "); Serial.print(soil_temp); Serial.println(" C");
pastTime = millis();
state = 2;
}
break;
case 2:
if ( (millis() - pastTime) >= delayOneK )
{
val3 = econduc();
Serial.print("EC: "); Serial.print(val3); Serial.println(" us/cm");
pastTime = millis();
state = 3;
}
break;
case 3:
if ( (millis() - pastTime) >= delayOneK )
{
val4 = phydrogen() / 10;
soil_ph = val4;
Serial.print("ph: "); Serial.print(soil_ph); Serial.println(" ph");
pastTime = millis();
state = 4;
}
break;
case 4:
if ( (millis() - pastTime) >= delayOneK )
{
val5 = nitrogen();
Serial.print("Nitrogen: "); Serial.print(val5); Serial.println(" mg/kg");
pastTime = millis();
state = 5;
}
break;
case 5:
if ( (millis() - pastTime) >= delayOneK )
{
val6 = phosphorous();
Serial.print("Phosphorous: "); Serial.print(val6); Serial.println(" mg/kg");
state = 6;
pastTime = millis();
}
break;
case 6:
if ( (millis() - pastTime) >= delayOneK )
{
val7 = potassium();
Serial.print("Potassium: "); Serial.print(val7); Serial.println(" mg/kg");
state = 7;
pastTime = millis();
}
break;
default:
// state = 0;
break;
}
// val1 = moisture();
// soil_mois = val1/10.0;
// delay(1000);
// soil_temp = temperature()/10.0;
// delay(1000);
// val3 = econduc();
// delay(1000);
// val4 = phydrogen()/10;
// soil_ph = val4;
// delay(1000);
// val5 = nitrogen();
// delay(1000);
// val6 = phosphorous();
// delay(1000);
// val7 = potassium();
// delay(1000);
// Serial.print("Moisture: ");Serial.print(soil_mois);Serial.println(" %");
// Serial.print("Temperature: ");Serial.print(soil_temp);Serial.println(" C");
// Serial.print("EC: ");Serial.print(val3);Serial.println(" us/cm");
// Serial.print("ph: ");Serial.print(soil_ph);Serial.println(" ph");
// 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.println();
// delay(3000);
}
byte moisture() {
// clear the receive buffer
// mod.flushInput();
// switch RS-485 to transmit mode
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
delay(1);
// write out the message
for (uint8_t i = 0; i < sizeof(mois); i++) mod.write(mois[i]);
// wait for the transmission to complete
mod.flush();
// switching RS485 to receive mode
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
// delay to allow response bytes to be received!
delay(1000);
// read in the received bytes
for (byte i = 0; i < 7; i++) {
values[i] = mod.read();
// Serial.print(values[i], HEX);
// Serial.print(' ');
}
return values[4];
}
byte temperature() {
// clear the receive buffer
// mod.flushInput();
// switch RS-485 to transmit mode
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
delay(1);
// write out the message
for (uint8_t i = 0; i < sizeof(temp); i++) mod.write(temp[i]);
// wait for the transmission to complete
mod.flush();
// switching RS485 to receive mode
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
// delay to allow response bytes to be received!
delay(1000);
// read in the received bytes
for (byte i = 0; i < 7; i++) {
values[i] = mod.read();
// Serial.print(values[i], HEX);
// Serial.print(' ');
}
return values[3]<<8|values[4];
}
byte econduc() {
// clear the receive buffer
// mod.flushInput();
// switch RS-485 to transmit mode
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
delay(1);
// write out the message
for (uint8_t i = 0; i < sizeof(econ); i++) mod.write(econ[i]);
// wait for the transmission to complete
mod.flush();
// switching RS485 to receive mode
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
// delay to allow response bytes to be received!
delay(1000);
// read in the received bytes
for (byte i = 0; i < 7; i++) {
values[i] = mod.read();
// Serial.print(values[i], HEX);
// Serial.print(' ');
}
return values[4];
}
byte phydrogen() {
// clear the receive buffer
// mod.flushInput();
// switch RS-485 to transmit mode
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
delay(1);
// write out the message
for (uint8_t i = 0; i < sizeof(ph); i++) mod.write(ph[i]);
// wait for the transmission to complete
mod.flush();
// switching RS485 to receive mode
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
// delay to allow response bytes to be received!
delay(1000);
// read in the received bytes
for (byte i = 0; i < 7; i++) {
values[i] = mod.read();
// Serial.print(values[i], HEX);
// Serial.print(' ');
}
return values[4];
}
byte nitrogen() {
// clear the receive buffer
// mod.flushInput();
// switch RS-485 to transmit mode
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
delay(1);
// write out the message
for (uint8_t i = 0; i < sizeof(nitro); i++) mod.write(nitro[i]);
// wait for the transmission to complete
mod.flush();
// switching RS485 to receive mode
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
// delay to allow response bytes to be received!
delay(1000);
// read in the received bytes
for (byte i = 0; i < 7; i++) {
values[i] = mod.read();
// Serial.print(values[i], HEX);
// Serial.print(' ');
}
return values[4];
}
byte phosphorous() {
// mod.flushInput();
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 to allow response bytes to be received!
delay(1000);
for (byte i = 0; i < 7; i++) {
values[i] = mod.read();
// Serial.print(values[i], HEX);
// Serial.print(' ');
}
return values[4];
}
byte potassium() {
// mod.flushInput();
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 to allow response bytes to be received!
delay(1000);
for (byte i = 0; i < 7; i++) {
values[i] = mod.read();
// Serial.print(values[i], HEX);
// Serial.print(' ');
}
return values[4];
}
However, it is giving 255 in all variables, someone help me