/*
ESP32 WiFi setup with RS232 command line (SWPIN=LOW)
*/
#include <WiFi.h>
#include <EEPROM.h>
// ---- EEPROM addresses -----------
#define EE_SSID_ADDR 0
#define EE_PWD_ADDR 20
#define EE_MQTTCID_ADDR 40
#define EE_MQTTUSER_ADDR 80
#define EE_MQTTPWD_ADDR 120
#define SWPIN 12 // Configuration Setting PIN
#define LED 2
#define RESET 13
const char* mqtt_server = "broker.netpie.io";
const int mqtt_port = 1883;
// ------WiFi configuration-----
char ssid[20] = "";
char password[20] = "";
// ------NETPIE 2020 configuration -----
char mqttClient[40] = "";
char mqttUsername[40] = "";
char mqttPassword[40] = "";
bool online = 1; // offline/online flag variable
String rcvdstring;
byte newcmd;
void EEPROM_getparms(void)
{
EEPROM.get(EE_SSID_ADDR, ssid);
EEPROM.get(EE_PWD_ADDR, password);
EEPROM.get(EE_MQTTCID_ADDR, mqttClient);
EEPROM.get(EE_MQTTUSER_ADDR, mqttUsername);
EEPROM.get(EE_MQTTPWD_ADDR, mqttPassword);
}
void EEPROM_saveparms(void)
{
EEPROM.put(EE_SSID_ADDR, ssid);
EEPROM.put(EE_PWD_ADDR, password);
EEPROM.put(EE_MQTTCID_ADDR, mqttClient);
EEPROM.put(EE_MQTTUSER_ADDR, mqttUsername);
EEPROM.put(EE_MQTTPWD_ADDR, mqttPassword);
delay(10);
EEPROM.commit();
Serial.println("Parameters saved to EEPROM.");
Serial.println("Press reset button or enter \"reset\"");
}
void cmdInt(void) {
int sepIndex, noparm, parmvalint;
String cmdstring, parmstring;
rcvdstring.trim(); // remove leading&trailing whitespace, if any
// find index of separator ('=')
sepIndex = rcvdstring.indexOf('=');
if (sepIndex == -1) { // no parameter in command
cmdstring = rcvdstring;
noparm = 1;
}
else {
// extract command and parameter
cmdstring = rcvdstring.substring(0, sepIndex);
cmdstring.trim();
parmstring = rcvdstring.substring(sepIndex + 1);
parmstring.trim();
noparm = 0;
}
// check if received command string is a valid command
if (cmdstring.equalsIgnoreCase("ssid")) {
if (noparm == 1) {
Serial.print("Current Wifi SSID = ");
Serial.println(ssid);
}
else {
for (int i = 0; i < 20; i++) ssid[i] = 0;
parmstring.toCharArray(ssid, parmstring.length() + 1);
Serial.print("New SSID = ");
Serial.println(ssid);
}
}
else if (cmdstring.equalsIgnoreCase("pwd")) {
if (noparm == 1) {
Serial.print("Current Wifi password = ");
Serial.println(password);
}
else {
for (int i = 0; i < 20; i++) password[i] = 0;
parmstring.toCharArray(password, parmstring.length() + 1);
Serial.print("New Wifi password = ");
Serial.println(password);
}
}
else if (cmdstring.equalsIgnoreCase("save")) {
EEPROM_saveparms();
}
else if (cmdstring.equalsIgnoreCase("reset")) {
Serial.println("Reset ESP32");
ESP.restart();
}
}
void setup() {
// put your setup code here, to run once:
pinMode(SWPIN, INPUT);
pinMode(LED, OUTPUT);
EEPROM.begin(256); // use 256 bytes of flash memory for EEPROM
EEPROM_getparms(); // get parameters from EEPROM
Serial.begin(115200);
Serial.println("\n\n*** Start ***");
Serial.println("Connecting to WiFi");
Serial.print("Wifi SSID = ");
Serial.println(ssid);
Serial.print("Wifi password = ");
Serial.println(password);
WiFi.mode(WIFI_STA);
//WiFi.begin("Wokwi-GUEST", "");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
digitalWrite(LED, !digitalRead(LED));
if (!digitalRead(RESET)) { // abort by pressing BOOT sw
Serial.println("Reset ESP32. ");
delay(100);
ESP.restart();
}
if (!digitalRead(SWPIN)) { // abort by pressing BOOT sw
online = 0;
digitalWrite(LED, LOW);
break;
}
}
if (online) {
digitalWrite(LED, HIGH);
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
//client.setServer(mqtt_server, mqtt_port);
//client.setCallback(callback);
}
else {
Serial.println(" ");
Serial.println("WiFi connection aborted. Running in offline mode.");
Serial.println("Enter command line:");
Serial.println(" save {To save the parameters}");
Serial.println(" reset {To reset MCU}");
Serial.println(" ssid {Show current WiFi SSID}");
Serial.println(" pwd {Show current WiFi Password}");
Serial.println(" ssid={Your SSID} {Change WiFi SSID}");
Serial.println(" pwd={Your WiFi Password} {Change WiFi Password}");
}
}
void loop() {
// put your main code here, to run repeatedly:
if (!digitalRead(RESET)) { // abort by pressing BOOT sw
Serial.println("Reset ESP32. ");
delay(100);
ESP.restart();
}
if (online) {
// To have started doing something
}
else {
while (Serial.available() > 0) { // detect new input
rcvdstring = Serial.readString();
Serial.println(rcvdstring);
newcmd = 1;
}
if (newcmd) { // execute this part only when new command received
cmdInt(); // invoke the interpreter
newcmd = 0;
}
}
delay(100);
}
/*
String serialInPut;
void loop() {
while (!Serial.available()); // Wait for input
serialInPut = Serial.readStringUntil('\n');
Serial.println(serialInPut);
}
*/