Char arrays and float types?

I am having trouble with my code and it might help to learn more about the HDC1080 and the coding used to get the data. I’m running it off an esp-12 module.
I am using the code from the closedcube project on github. It works great and I have it triggering an LED right now, if humid >50% or temp>30 C.

But I want to use wifimanager from github as well. This will allow me to change the temperature or humidity thresholds (for trigger) in AP mode. (I didn’t change the labels, so mqtt_port is the example parameter I’m playing with, but really it’s tied to my humidity through:

if (hdc1080.readHumidity() >= mqtt_port[3] || hdc1080.readTemperature() >= 30){
  digitalWrite(LED, HIGH);
}

which will trigger my LED.

I have this working almost. I have a problem with the length of data. I’m playing with the size of chars right now and it’s just getting me close.

In the following code I also have a: char mqtt_port[3];

and: WiFiManagerParameter custom_mqtt_port("port", "mqtt port", mqtt_port, 5);

Thank you for looking

#include <FS.h>                   //this needs to be first, or it all crashes and burns...

#include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino

//needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager

#include <ArduinoJson.h>          //https://github.com/bblanchon/ArduinoJson

#include <Wire.h>
#include "ClosedCube_HDC1080.h"

#define LED 15
ClosedCube_HDC1080 hdc1080;

//define your default values here, if there are different values in config.json, they are overwritten.
char mqtt_server[40]; 
char mqtt_port[3];
char blynk_token[34] = "YOUR_BLYNK_TOKEN";

//flag for saving data
bool shouldSaveConfig = false;

//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println();

  //clean FS, for testing
  //SPIFFS.format();
pinMode(LED, OUTPUT);
  //read configuration from FS json
  Serial.println("mounting FS...");

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");

          strcpy(mqtt_server, json["mqtt_server"]);
          strcpy(mqtt_port, json["mqtt_port"]);
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }
  //end read



  // The extra parameters to be configured (can be either global or just in the setup)
  // After connecting, parameter.getValue() will get you the configured value
  // id/name placeholder/prompt default length
  WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 30);
  WiFiManagerParameter custom_mqtt_port("port", "mqtt port", mqtt_port, 5);
  WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 32);

  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wifiManager;

  //set config save notify callback
  wifiManager.setSaveConfigCallback(saveConfigCallback);

  //set static ip
  wifiManager.setSTAStaticIPConfig(IPAddress(10,0,1,99), IPAddress(10,0,1,1), IPAddress(255,255,255,0));
  
  //add all your parameters here
  wifiManager.addParameter(&custom_mqtt_server);
  wifiManager.addParameter(&custom_mqtt_port);
  wifiManager.addParameter(&custom_blynk_token);

  //reset settings - for testing
  wifiManager.resetSettings();

  //set minimu quality of signal so it ignores AP's under that quality
  //defaults to 8%
  //wifiManager.setMinimumSignalQuality();
  
  //sets timeout until configuration portal gets turned off
  //useful to make it all retry or go to sleep
  //in seconds
  //wifiManager.setTimeout(120);

  //fetches ssid and pass and tries to connect
  //if it does not connect it starts an access point with the specified name
  //here  "AutoConnectAP"
  //and goes into a blocking loop awaiting configuration
  if (!wifiManager.autoConnect("WatchDog", "aeronikon23")) {
    Serial.println("failed to connect and hit timeout");
    delay(3000);
    //reset and try again, or maybe put it to deep sleep
    ESP.reset();
    delay(5000);
  }

  //if you get here you have connected to the WiFi
  Serial.println("connected...yeey :)");

  //read updated parameters
  strcpy(mqtt_server, custom_mqtt_server.getValue());
  strcpy(mqtt_port, custom_mqtt_port.getValue());
  strcpy(blynk_token, custom_blynk_token.getValue());

  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["mqtt_server"] = mqtt_server;
    json["mqtt_port"] = mqtt_port;
    json["blynk_token"] = blynk_token;

    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }

    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
  }

  Serial.println("local ip");
  Serial.println(WiFi.localIP());
  
  Serial.println("ClosedCube HDC1080 Arduino Test");

  hdc1080.begin(0x40);

  Serial.print("Manufacturer ID=0x");
  Serial.println(hdc1080.readManufacturerId(), HEX); // 0x5449 ID of Texas Instruments
  Serial.print("Device ID=0x");
  Serial.println(hdc1080.readDeviceId(), HEX); // 0x1050 ID of the device
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.print("T=");
  Serial.print(hdc1080.readTemperature());
  Serial.print("C, RH=");
  Serial.print(hdc1080.readHumidity());
  Serial.println("%");
  Serial.println(mqtt_port);
  //Serial.println("");
 // Serial.println(mqtt_server);
  delay(300);
  if (hdc1080.readHumidity() >= mqtt_port[3] || hdc1080.readTemperature() >= 30){
  digitalWrite(LED, HIGH);
}
else{
  digitalWrite(LED, LOW);

}

}

Thank you for looking

I looked, but I couldn't find a question.

PaulS:
I looked, but I couldn't find a question.

I just looked and I agree. My question is: when I use the char labeled mqtt_port as a trigger threshold for humidity, why will my code save and serial print the correct value I input, but trigger at some seemingly random, but close, value?

when I use the char labeled mqtt_port

You so NOT have a char names mqtt_port. You have a char ARRAY named mqtt_port. As to what you are doing with that array, it is impossible to tell, because your post is littered with crap like:

char mqtt_port[[b]y[/b]];

which hasn't a hope in hell of compiling.

Perhaps if you fixed your post...

PaulS:
You so NOT have a char names mqtt_port. You have a char ARRAY named mqtt_port. As to what you are doing with that array, it is impossible to tell, because your post is littered with crap like:

char mqtt_port[[b]y[/b]];

which hasn't a hope in hell of compiling.

Perhaps if you fixed your post...

Sorry about that. It was an attempt to clear up confusion (HA! that worked) and is not in the full code I posted.

I removed some of the crap from the OP.

The parameter saving example is done with char arrays. My HDC1080 is sending over float type. I think I need to convert between char array and float.

          strcpy(mqtt_server, json["mqtt_server"]);
          strcpy(mqtt_port, json["mqtt_port"]);
          strcpy(blynk_token, json["blynk_token"]);

This code assumes trhat mqtt_server, mqtt_port, and blynk_token are of suitable size to hold the data read from the config file. Is that a valid assumption? Generally, strncpy() is preferred over strcpy(), so you control how much data is copied, and no writing beyond the end of an array can happen.

  if (hdc1080.readHumidity() >= mqtt_port[3] || hdc1080.readTemperature() >= 30){

I frankly can not see the relationship between the humidity as a float and the 4th element of a three element array of chars. Can you explain, in English, what you are trying to do here?

PaulS:

  if (hdc1080.readHumidity() >= mqtt_port[3] || hdc1080.readTemperature() >= 30){

I frankly can not see the relationship between the humidity as a float and the 4th element of a three element array of chars. Can you explain, in English, what you are trying to do here?

I was playing with the number of elements because I had the understanding that it had something to do with how much data is stored, and how much I'm calling of it. Playing with those numbers gave me a sense of progress when the LED triggered either closer or farther away from my input value.

Does anyone else want to take a stab at it?

The code is saving my inputs correctly. Prints them correctly. So when I call mqtt_port, it is equal to 51.7 if I say so.

But when I use that, my LED triggers at 50% humidity. But if I directly type in 51.7 as a threshold, it works perfect and triggers at 51.7.

Why is my program seeing it as 51.7, but treating it like 50.

Frozenguy:
So when I call mqtt_port, it is equal to 51.7 if I say so.

what do you mean here?

are you referring to what is contained in this char array:

char mqtt_port[3];

BulldogLowell:
what do you mean here?

Thank you for checking this out.
I mean instead of saying humidity > 51.7
I say humidity > mqtt_port

mqtt_port can be changed from an input field on my cell phone when my esp8266 is in access point mode.

BulldogLowell:
are you referring to what is contained in this char array:

char mqtt_port[3];

Yes. I can change this on my cell phone. After submit, it prints (on serial monitor) the correct value I just input. However when using the same label to trigger humidity > mqtt_port, it will not trigger at the value it's printing.

Frozenguy:
I mean instead of saying humidity > 51.7
I say humidity > mqtt_port

mqtt_port can be changed from an input field on my cell phone when my esp8266 is in access point mode.

Yes. I can change this on my cell phone. After submit, it prints (on serial monitor) the correct value I just input. However when using the same label to trigger humidity > mqtt_port, it will not trigger at the value it's printing.

so then, you are here:

if (hdc1080.readHumidity() >= mqtt_port[3]

comparing the hdc1080 returned humidity (assumed to be a float) to the char in position 3 of mqtt_port array?

is that what you wish to be doing?

BulldogLowell:
so then, you are here:

if (hdc1080.readHumidity() >= mqtt_port[3]

comparing the hdc1080 returned humidity (assumed to be a float) to the char in position 3 of mqtt_port array?

is that what you wish to be doing?

Yes that is. I guess I’ll need to convert one of them to the other?

Frozenguy:
Yes that is. I guess I'll need to convert one of them to the other?

if your 3 char array somehow fits your data, you could compare the values. Until then you are comparing a float against a signed 8-bit value... that's integers between -128 and 127 (inclusive).

You can NOT store “51.7” in an array that holds three characters.

You can NOT store 51.7 in position 3 of a three element array.

You can NOT store 51.7 in a char.

So, all the things you say you are doing are nonsense.

I converted the char array to a float using atof. Works now.

PaulS:
You can NOT store "51.7" in an array that holds three characters.

You can NOT store 51.7 in position 3 of a three element array.

You can NOT store 51.7 in a char.

So, all the things you say you are doing are nonsense.

That's probably because I'm an aerospace engineer learning my way around something new. 76k posts isn't hard with posts like this. You really couldn't figure out what I was going for in the first post?

You really couldn't figure out what I was going for in the first post?

No, because comparing the humidity (76.3%) to a character outside of the bounds of an array does not make sense. Even if you make the array big enough, comparing the humidity to some character in the string representation of a port number makes no sense to me.