diff --git a/WifiControlSensor/EEPROM.ino b/WifiControlSensor/EEPROM.ino
index 24b21ad..3739b60 100644
--- a/WifiControlSensor/EEPROM.ino
+++ b/WifiControlSensor/EEPROM.ino
@@ -1,14 +1,14 @@
/* EEPROM LAYOUT
- "BOOTMODE;SSID;PASSWORD;HOSTNAME;"
+ "BOOTMODE;SSID;PASSWORD;HOSTNAME;MQTT_SERVER;MQTT_USERNAME;MQTT_PASSWD"
BOOTMODE could be 0 for Setup, 1 for normal use, 2 for OTA
Setup mode is trigger by setting GPIO3 to ground or at first boot
*/
-int saveConfig(int bootMode, String ssid, String password, String host ) {
+int saveConfig(int bootMode, String ssid, String password, String host, String mqttServer, String mqttUser, String mqttpasswd) {
String eeprom;
- eeprom = String(bootMode) + ";" + ssid + ";" + password + ";" + host + ";";
+ eeprom = String(bootMode) + ";" + ssid + ";" + password + ";" + host + ";" + mqttServer + ";" + mqttUser + ";" + mqttpasswd +";";
if (eeprom.length() > EEPROM_SIZE )
return -EMSGSIZE;
@@ -25,14 +25,27 @@ int saveConfig(int bootMode, String ssid, String password, String host ) {
return 0;
}
-int saveBootMode(int bootMode){
- EEPROM.write(0,String(bootMode).charAt(0));
+int saveBootMode(int bootMode) {
+ EEPROM.write(0, String(bootMode).charAt(0));
EEPROM.commit();
delay(100);
return 0;
}
-void readEEPROM(int &bootMode, char **ssid, char **password, char **host) {
+void readConfElement(char** element, int &i) {
+ *element = &eeprom[i];
+ do {
+ eeprom[i] = EEPROM.read(i);
+ i++;
+ } while (i < EEPROM_SIZE && eeprom[i - 1] != ';');
+ eeprom[i - 1] = '\0';
+
+ if(i == EEPROM_SIZE)
+ **element = '\0';
+
+}
+
+void readEEPROM(int &bootMode, char **ssid, char **password, char **host, char **mqttServer, char **mqttUser, char **mqttPasswd) {
int i = 2;
@@ -48,28 +61,10 @@ void readEEPROM(int &bootMode, char **ssid, char **password, char **host) {
return;
}
- //Read SSID
- *ssid = &eeprom[2];
- do {
- eeprom[i] = EEPROM.read(i);
- i++;
- } while (i < EEPROM_SIZE && eeprom[i - 1] != ';');
- eeprom[i - 1] = '\0';
-
- //Read password
- *password = &eeprom[i];
- do {
- eeprom[i] = EEPROM.read(i);
- i++;
- } while (i < EEPROM_SIZE && eeprom[i - 1] != ';');
- eeprom[i - 1] = '\0';
-
- //Read HostName
- *host = &eeprom[i];
- do {
- eeprom[i] = EEPROM.read(i);
- i++;
- } while (i < EEPROM_SIZE && eeprom[i - 1] != ';');
- eeprom[i - 1] = '\0';
-
+ readConfElement(ssid, i);
+ readConfElement(password, i);
+ readConfElement(host, i);
+ readConfElement(mqttServer, i);
+ readConfElement(mqttUser, i);
+ readConfElement(mqttPasswd, i);
}
diff --git a/WifiControlSensor/MQTT.ino b/WifiControlSensor/MQTT.ino
index 40bd6af..ba93ac7 100644
--- a/WifiControlSensor/MQTT.ino
+++ b/WifiControlSensor/MQTT.ino
@@ -1,18 +1,46 @@
+// Create an ESP8266 WiFiClient class to connect to the MQTT server.
+WiFiClient client;
+Adafruit_MQTT_Client *mqtt;
+Adafruit_MQTT_Publish *mqtt_temp;
+
+const char TEMPERATURE_FEED[] = "/feeds/temperature";
+
+boolean mqttIsConfigured;
+
+int publishMQTT(int temp) {
+ if (MQTT_connect() == 0) {
+ Serial.println("publishing !");
+ mqtt_temp->publish(temp);
+ }
+}
+
+int setupMQTT(char *server, char *user, char *passwd) {
+
+ if(server == ""){
+ Serial.println("Mqtt Server not configured");
+ }
+ // Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
+ mqtt = new Adafruit_MQTT_Client(&client, server, 1883, user, passwd);
+ mqtt_temp = new Adafruit_MQTT_Publish(mqtt, TEMPERATURE_FEED);
+
+ return 0;
+}
+
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
int MQTT_connect() {
int8_t ret;
// Stop if already connected.
- if (mqtt.connected()) {
+ if (mqtt->connected()) {
return 0;
}
uint8_t retries = 3;
- while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
- Serial.println(mqtt.connectErrorString(ret));
+ while ((ret = mqtt->connect()) != 0) { // connect will return 0 for connected
+ Serial.println(mqtt->connectErrorString(ret));
Serial.println("Retrying MQTT connection ...");
- mqtt.disconnect();
+ mqtt->disconnect();
delay(100); // wait
retries--;
if (retries == 0) {
diff --git a/WifiControlSensor/WebServer.ino b/WifiControlSensor/WebServer.ino
index 607b1e3..73fd0d5 100644
--- a/WifiControlSensor/WebServer.ino
+++ b/WifiControlSensor/WebServer.ino
@@ -13,6 +13,9 @@ void handleSetup() {
"
"
"
"
"
"
+ "
"
+ "
"
+ "
"
"
"
"");
}
@@ -32,13 +35,16 @@ void handleSave() {
String password;
String ssid;
String hostName;
+ String mqttServer;
+ String mqttUser;
+ String mqttPasswd;
- if (!server.hasArg("ssid") || !server.hasArg("password") || !server.hasArg("host")) {
+ if (!server.hasArg("ssid") || !server.hasArg("password") || !server.hasArg("host") || !server.hasArg("mqttServer") || !server.hasArg("mqttUser") || !server.hasArg("mqttPasswd") ) {
server.send(500, "text/plain", "Bad arguments\r\n");
return;
}
- if (saveConfig(BOOTMODE_NORMAL, server.arg("ssid"), server.arg("password"), server.arg("host")) < 0) {
+ if (saveConfig(BOOTMODE_NORMAL, server.arg("ssid"), server.arg("password"), server.arg("host"), server.arg("mqttServer"), server.arg("mqttUser"), server.arg("mqttPasswd")) < 0) {
server.send(500, "text/plain", "Cannot Save Credentials (Too long ?Contains \";\"?)\r\n");
return;
}
diff --git a/WifiControlSensor/WifiControlSensor.ino b/WifiControlSensor/WifiControlSensor.ino
index 6a440e3..e5de3d6 100644
--- a/WifiControlSensor/WifiControlSensor.ino
+++ b/WifiControlSensor/WifiControlSensor.ino
@@ -26,18 +26,13 @@
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
-#define AIO_SERVER "192.168.0.250"
-#define AIO_SERVERPORT 1883 // use 8883 for SSL
-#define AIO_USERNAME ""
-#define AIO_PASSWORD ""
-
//#define ENABLE_EXTRA_GPIO
-#define EEPROM_SIZE 512
+#define EEPROM_SIZE 1024
char eeprom[EEPROM_SIZE];
#define WEB_DELAY_MS 100
-#define SAMPLING_PERIODE_MS 60000
+#define SAMPLING_PERIODE_MS 6000
/* I2C pin used*/
#define SDA 2
@@ -50,21 +45,6 @@ char eeprom[EEPROM_SIZE];
double temp;
int mode;
-// Store the MQTT server, username, and password in flash memory.
-// This is required for using the Adafruit MQTT library.
-const char MQTT_SERVER[] PROGMEM = AIO_SERVER;
-const char MQTT_USERNAME[] PROGMEM = AIO_USERNAME;
-const char MQTT_PASSWORD[] PROGMEM = AIO_PASSWORD;
-
-// Create an ESP8266 WiFiClient class to connect to the MQTT server.
-WiFiClient client;
-
-// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
-Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);
-
-const char TEMPERATURE_FEED[] PROGMEM = "/feeds/temperature";
-Adafruit_MQTT_Publish mqtt_temp = Adafruit_MQTT_Publish(&mqtt, TEMPERATURE_FEED);
-
/* Set these to your desired credentials. */
const char *ssid = "ESPConfigurator";
@@ -81,15 +61,16 @@ void handleNotFound();
void setupWebServer(int bootmode);
/* EEPROM decl */
-int saveConfig(int bootMode, String ssid, String password, String host );
+int saveConfig(int bootMode, String ssid, String password, String host, String mqttServer, String mqttUser, String mqttpasswd);
int saveBootMode(int bootMode);
-void readEEPROM(int &bootMode, char **ssid, char **password, char **host);
-
+void readEEPROM(int &bootMode, char **ssid, char **password, char **host, char **mqttServer, char **mqttUser, char **mqttPasswd);
/* BMP180 decl */
int getTemperature(double &t);
/* MQTT decl */
int MQTT_connect();
+int setupMQTT(char *server, char *user, char *passwd);
+int publishMQTT(int temp);
void setupWifi(int bootmode, int forceSetup, char *confSsid, char *confPassword, char *confHost) {
IPAddress myIP;
@@ -134,7 +115,7 @@ void setupOTA() {
//Disable OTA mode to avoid forever loop
//Force BOOTMODE_SETUP in case eeprom layout have changed
- saveConfig(BOOTMODE_SETUP, "", "", "" );
+ saveConfig(BOOTMODE_SETUP, "", "", "", "", "", "" );
ArduinoOTA.onStart([]() {
Serial.println("Start");
@@ -167,6 +148,9 @@ void setup() {
char *confSsid;
char *confPassword;
char *confHost;
+ char *mqttServer;
+ char *mqttUser;
+ char *mqttPasswd;
delay(1000);
Serial.begin(115200);
@@ -181,13 +165,16 @@ void setup() {
#endif
EEPROM.begin(EEPROM_SIZE);
- readEEPROM(mode, &confSsid, &confPassword, &confHost);
+ readEEPROM(mode, &confSsid, &confPassword, &confHost, &mqttServer, &mqttUser, &mqttPasswd);
if (mode == BOOTMODE_NORMAL || mode == BOOTMODE_OTA) {
Serial.println("Configuration Found !:");
Serial.println(mode);
Serial.println(confSsid);
Serial.println(confPassword);
Serial.println(confHost);
+ Serial.println(mqttServer);
+ Serial.println(mqttUser);
+ Serial.println(mqttPasswd);
Serial.println();
} else {
Serial.println("No configuration saved");
@@ -198,6 +185,7 @@ void setup() {
Serial.println();
setupWifi(mode, txStatus == 0, confSsid, confPassword, confHost);
+ setupMQTT(mqttServer, mqttUser, mqttPasswd);
if (mode == BOOTMODE_OTA) {
setupOTA();
@@ -218,12 +206,9 @@ void loop() {
nbCycle++;
if (nbCycle > SAMPLING_PERIODE_MS / WEB_DELAY_MS) {
if (getTemperature(temp) == 0) {
- Serial.print("Sampling :");
+ Serial.print("Current T°C ");
Serial.println(temp);
- if (MQTT_connect() == 0){
- Serial.println("publishing !");
- mqtt_temp.publish(temp);
- }
+ publishMQTT(temp);
} else {
Serial.println("Cannot get T°C");
}