I have an app which connects to io.adafruit MQTT and publishes to my feeds when new data is available, NO PROBLEM.
I am working with Arduino programing on an ESP8266-01.
I do this by setting up the connection into and publish info in my header? (space before void setup() like this:
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "xxxxxxxx"
#define AIO_KEY "xxxxxxxxxxxxxxxxxxxxxxx"
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");
Adafruit_MQTT_Publish level = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/level");
Adafruit_MQTT_Publish level2 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/level2");
Adafruit_MQTT_Publish battery = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/battery");
Adafruit_MQTT_Publish date = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/date");
Adafruit_MQTT_Publish trip = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/trip");
Adafruit_MQTT_Publish video1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/video");
I would like to make it so I can add the AIO_USERNAME and AIO_KEY when the app first starts up and the user enters their WiFi name and password.
I have set it up so the userName and Key are saved to eprom and read from there.
I have even redefined the AIO_USERNAME and AIO_KEY after they are retrieved from eprom.
void setup(){
WiFiManagerParameter customAPIKey("authorizationKey", "Authorization Code",authorizationKey, 32);
WiFiManagerParameter customAPIKey2("apiKey", "Time Zone #", apiKey, 3);
WiFiManagerParameter customAPIKey3("userNameKey", "User Name",userNameKey, 29);
wifiManager.addParameter(&customAPIKey);
wifiManager.addParameter(&customAPIKey2);
wifiManager.addParameter(&customAPIKey3);
strcpy(authorizationKey, customAPIKey.getValue());
strcpy(apiKey, customAPIKey2.getValue());
strcpy(userNameKey, customAPIKey3.getValue());
//write to eeprom
EEPROM.begin(512); //Initialize EEPROM
EEPROM.write(addr, 'A'); //Write character A
addr++; //Increment address
EEPROM.write(addr, 'B'); //Write character A
addr++; //Increment address
EEPROM.write(addr, 'C'); //Write character A
addr++; //Increment address
EEPROM.write(addr, 'D'); //Write character A
//Write string to eeprom
String uuu = authorizationKey;
Serial.print("uuu");
Serial.print(uuu);
String www = apiKey;//Homenetwork + uuu;
Serial.print("www");
Serial.print(www);
String yyy = userNameKey;
String vvv = String(www)+String(yyy)+String(",");
Serial.print("vvv");
Serial.print(vvv);
for(int i=0;i<uuu.length();i++) //loop upto string lenght www.length() returns length of string
{
EEPROM.write(0x0F+i,uuu[i]); //Write one by one with starting address of 0x0F
}
for(int i=0;i<vvv.length();i++) //loop upto string lenght www.length() returns length of string
{
EEPROM.write(0x0+i,vvv[i]); //Write one by one with starting address of 0x0F
}
EEPROM.commit(); //Store data to EEPROM
//this is where I retrieve the info from the eeprom
void loop {
EEPROM.begin(512);
Serial.println(""); //Goto next line, as ESP sends some garbage when you reset it
Serial.print(char(EEPROM.read(addr))); //Read from address 0x00
addr++; //Increment address
Serial.print(char(EEPROM.read(addr))); //Read from address 0x01
addr++; //Increment address
Serial.println(char(EEPROM.read(addr))); //Read from address 0x02
addr++; //Increment address
Serial.println(char(EEPROM.read(addr))); //Read from address 0x03
//addr++; //Increment address
//Serial.println(char(EEPROM.read(addr))); //Read from address 0x04
//Read string from eeprom
String www;
//Here we dont know how many bytes to read it is better practice to use some terminating character
//Lets do it manually www.circuits4you.com total length is 20 characters
for(int i=0;i<32;i++)
{
www = www + char(EEPROM.read(0x0F+i)); //Read one by one with starting address of 0x0F
}
String zzz;
String uuu;
for(int i=0;i<3;i++)
{uuu = uuu + char(EEPROM.read(0x0+i));
}
String yyy = userNameKey;
String vvv;
for(int i=3;i<29;i++)
{vvv = vvv + char(EEPROM.read(0x0+i));
}
www.toCharArray(auth,33);
#define AIO_KEY auth
Serial.println("KEY");
Serial.print(AIO_KEY);
Serial.println("this");
Serial.print(www); //Print the text on serial monitor
Serial.println("that");
Serial.print(uuu);
Serial.println("those");
Serial.print(vvv);
int firstCommaIndex = vvv.indexOf(',');
String wstemp = vvv.substring(0, firstCommaIndex);
Serial.println("some");
Serial.print(wstemp);
int len = firstCommaIndex;
wstemp.toCharArray(user,len+1);
#define AIO_USERNAME user
Serial.println("userr");
Serial.print(AIO_USERNAME);
//when I print out the AIO_USERNAME and AIO_KEY I get the correct data but the app
fails to connect to my account at adafruit.
I have tried moving the info into
void MQTT_connect() {
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");
Adafruit_MQTT_Publish level = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/level");
Adafruit_MQTT_Publish level2 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/level2");
Adafruit_MQTT_Publish battery = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/battery");
Adafruit_MQTT_Publish date = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/date");
Adafruit_MQTT_Publish trip = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/trip");
Adafruit_MQTT_Publish video1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/video");
}
but that doesn't work and open another can of worms.
such as the last line gets an
expected primary-expression before '(' token
error
Does anyone have a suggestion as to how to update or replace the AIO_USERNAME and AIO_KEY so the stored data is used?