0

i have a problem in my arduino code, i'm using esp8266 to get data from a sensor, and i have to send this data to node red dashboard using mqtt protocol. The problem is that i couldn't publish a "string".


this is my code:

    #include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define Potentiometer A0




char ssid[] = "Fixbox-71CD43";       // your network SSID (name)
char pass[] = "ZTA0NWY2";    // your network password (use for WPA, or use as key for WEP)
//int keyIndex = 0;                  // your network key Index number (needed only for WEP)

const char* mqtt_server = "192.168.0.4";

int status = WL_IDLE_STATUS;
// if you don't want to use DNS (and reduce your sketch size)
// use the static IP instead of the name for the server:
// IPAddress server(74,125,232,128);  // static IP for Google (no DNS)
//char server[] = "www.google.com";     // name address for Google (using DNS)

WiFiClient espclient;
PubSubClient client(espclient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE  (50)
//char msg[MSG_BUFFER_SIZE];

//char message[50];
int sensorValue;

float VWC, Threshold1, Threshold2 , SubCalSlope, SubCalIntercept;


void setup() {


//*********************//*********************
// Declare variables for four 10HS sensors 


//*********************//*********************

//*********************//*********************
unsigned long lastMsg = 0;
//*********************//*********************

//*********************//*********************
// SUBSTRATE CALIBRATION: You have to convert the voltage to VWC using soil or substrate specific calibration. Decagon has generic calibrations (check the 10HS manual at http://manuals.decagon.com/Manuals/13508_10HS_Web.pdf) or you can determine your own calibration. We used our own calibration for Fafard 1P (peat: perlite, Conrad Fafard, Inc., Agawam, MA) 
  SubCalSlope = 1.1785;
  SubCalIntercept = -0.4938;
  // IRRIGATION THRESHOLDS: Values used to trigger irrigation when the sensor readings are below a specific VWC (in units of m3/m3 or L/L)
  Threshold1 = 0.4;
  Threshold2 = 0.6;
//*********************//*********************

 Serial.begin(115200);
 

   // Configure digital pins D2 and D3 as outputs to apply voltage to all four sensors (D2: sensor 1 and 2; D3, sensor 3 and 4)
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);

  
//  client.setCallback(callback);
  // initialize serial communication:
 
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // initialize the WiFi module:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi module not detected");
    // don't continue:
    while (true);
  }

 

  // attempt to connect to Wifi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WiFi network ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }
  Serial.println("Connected.\nWiFi network status:");
  printWifiStatus();

  Serial.println("\nStarting connection to MQTT server...");

  client.setServer(mqtt_server, 1883);
  // if you get a connection, report back via serial:
  
}
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("GW_sensor/humidity", "hello world");
      client.publish("GW_sensor/salinity", "hello world");

      // ... and resubscribe
      client.subscribe("GW_sensor/#");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi device's IP address:
 
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
}
 

void loop() {
  char msg[10];
  char msgtext[25];
  String themsg;
  
  // if there are incoming bytes available
  // from the server, read them and print them:
  // if the server's disconnected, stop the client:
   if (!client.connected()) {
    reconnect();
  }
  client.loop();

  //*********************
   // Apply power to 10HS sensor
 
  // Wait 10 ms,
  delay(10);
  // Measure the analog output from sensor #1 and #2 (red wires connected to analog pins A0 and A1)
  sensorValue = analogRead(0);

  // And turn the power to the sensors off
  digitalWrite(2, LOW);

 
 

    // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 1.1V) that is used to calculate the VWC using a calibration equation
    VWC = sensorValue * (1.1/1023.0) * SubCalSlope + SubCalIntercept;
  
  //*********************//*********************

  // Print the VWC 
  Serial.print("VWC (m3/m3): ");  
    Serial.print(" = ");
    Serial.print(VWC);
    
  
  
  //*********************//*********************

    unsigned long now = millis();
  //send data every 6 second
  if (now - lastMsg > 500) {
    lastMsg = now;
    // Check to see if the VWC reading is below Threshold1
    if (VWC < Threshold1) {   
      // If so, write an error message to the screen
      Serial.print("WARNING:(too low) Irrigation needed. ");
      sprintf(msgtext,"Irrigation needed",VWC);     
    }

    
    // If the measured VWC is > Threshold2
    if (VWC > Threshold2) {  
      // Write an error message to the screen
      Serial.print("WARNING:(too high) Irrigation not needed. "); 
      sprintf(msgtext,"Irrigation not needed",VWC);
         
    }

         sprintf(msg,"%i",VWC);
    
         //publish sensor data to MQTT broker 
          client.publish("GW_sensor/VWC_msg", msgtext);
          client.publish("GW_sensor/VWC_val", msg);
      }

please can you help me to fix my code? it can only send the values to the broker and the msg. thank you all!

2
  • 1
    It's not clear why you've tagged this as Node-RED as it sounds like the message is never leaving the arduino. Please edit the question to show what errors you are getting and to make it clear if the messages are actually making it to the broker. Commented Jun 7, 2021 at 17:11
  • i tagged this as node-red because it's going to publish on an mqtt node and then send it to mongo db, i'm sorry and thank you. Commented Jun 7, 2021 at 17:54

1 Answer 1

0

Payload isn't a "String", its a char buffer.

You need something like this:

snprintf (msg, BUF_SIZE, "msg: %i", VWC)
client.publish("GW_sensor/VWC_msg", msg)

The PubSubClient repo even has an ESP8266 example: https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp8266/mqtt_esp8266.ino

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.