ESP32 Rainmaker fails to connect to wifi
Posted: Sat Oct 14, 2023 6:26 pm
Hi,
I am trying to set up an ESP32 Rainmaker project and I am having some difficulty and I was wondering if anyone was having the same issue and was able to resolve it.
When I download my code from Arduino IDE to my ESP32C3 board and start the provisioning process in the ios ESP Rainmaker app, I get to the point of entering my Network SSID and Password Manually, submitting, then the ESP fails to connect to the wifi. It is acting like the board did not receive the password for the network from the app over BLE. I will post my code below:
// This example demonstrates the ESP RainMaker with a standard Switch device.
#include "RMaker.h"
#include "WiFi.h"
#include "WiFiProv.h"
#include "AppInsights.h"
#define DEFAULT_POWER_MODE true
const char *service_name = "PROV_SMART";
const char *pop = "abcd1234";
// GPIO for push button
//#if CONFIG_IDF_TARGET_ESP32C3
//static int gpio_0 = 9;
//#else
// GPIO for virtual device
static int gpio_0 = 0;
//#endif
static int gpio_led = 2;
static int gpio_button = 18;
/* Variable for reading pin status*/
bool switch_state = true;
// The framework provides some standard device types like switch, lightbulb,
// fan, temperaturesensor.
static Switch *my_switch = NULL;
void sysProvEvent(arduino_event_t *sys_event)
{
switch (sys_event->event_id) {
case ARDUINO_EVENT_PROV_START:
#if CONFIG_IDF_TARGET_ESP32S2
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n",
service_name, pop);
printQR(service_name, pop, "softap");
#else
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n",
service_name, pop);
printQR(service_name, pop, "ble");
#endif
break;
case ARDUINO_EVENT_PROV_INIT:
wifi_prov_mgr_disable_auto_stop(10000);
break;
case ARDUINO_EVENT_PROV_CRED_SUCCESS:
wifi_prov_mgr_stop_provisioning();
break;
case ARDUINO_EVENT_WIFI_STA_CONNECTED:
Serial.printf("\nConnected to Wi-Fi!\n");
//wifi_connected = 1;
delay(500);
break;
case ARDUINO_EVENT_PROV_CRED_RECV: {
Serial.println("\nReceived Wi-Fi credentials");
Serial.print("\tSSID : ");
Serial.println((const char *) sys_event->event_info.prov_cred_recv.ssid);
Serial.print("\tPassword : ");
Serial.println((char const *) sys_event->event_info.prov_cred_recv.password);
int passLen = strlen((char const *) sys_event->event_info.prov_cred_recv.password);
if (passLen <= 2) {
Serial.println("Password too short, factory resetting");
RMakerFactoryReset(2);
}
break;
}
default:;
}
}
void write_callback(Device *device, Param *param, const param_val_t val,
void *priv_data, write_ctx_t *ctx)
{
const char *device_name = device->getDeviceName();
const char *param_name = param->getParamName();
if (strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n",
val.val.b ? "true" : "false", device_name, param_name);
switch_state = val.val.b;
(switch_state == false) ? digitalWrite(gpio_led, LOW)
: digitalWrite(gpio_led, HIGH);
param->updateAndReport(val);
}
}
void toggleDeviceState() {
switch_state = !switch_state;
Serial.printf("Toggle State to %s.\n", switch_state ? "true" : "false");
if (my_switch) {
my_switch->updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, switch_state);
}
(switch_state == false) ? digitalWrite(gpio_led, LOW)
: digitalWrite(gpio_led, HIGH);
}
void setup()
{
Serial.begin(115200);
pinMode(gpio_0, INPUT);
pinMode(gpio_led, OUTPUT);
pinMode(gpio_button, INPUT);
digitalWrite(gpio_led, DEFAULT_POWER_MODE);
Node my_node;
my_node = RMaker.initNode("ESP RainMaker Node");
// Initialize switch device
my_switch = new Switch("Switch", &gpio_led);
if (!my_switch) {
return;
}
// Standard switch device
my_switch->addCb(write_callback);
// Add switch device to the node
my_node.addDevice(*my_switch);
// This is optional
RMaker.enableOTA(OTA_USING_TOPICS);
// If you want to enable scheduling, set time zone for your region using
// setTimeZone(). The list of available values are provided here
// https://rainmaker.espressif.com/docs/time-service.html
// RMaker.setTimeZone("Asia/Shanghai");
// Alternatively, enable the Timezone service and let the phone apps set the
// appropriate timezone
RMaker.enableTZService();
RMaker.enableSchedule();
RMaker.enableScenes();
// Enable ESP Insights. Insteads of using the default http transport, this function will
// reuse the existing MQTT connection of Rainmaker, thereby saving memory space.
initAppInsights();
RMaker.enableSystemService(SYSTEM_SERV_FLAGS_ALL, 2, 2, 2);
RMaker.start();
WiFi.onEvent(sysProvEvent);
#if CONFIG_IDF_TARGET_ESP32S2
WiFiProv.beginProvision(WIFI_PROV_SCHEME_SOFTAP, WIFI_PROV_SCHEME_HANDLER_NONE,
WIFI_PROV_SECURITY_1, pop, service_name);
#else
WiFiProv.beginProvision(WIFI_PROV_SCHEME_BLE, WIFI_PROV_SCHEME_HANDLER_FREE_BTDM,
WIFI_PROV_SECURITY_1, pop, service_name);
#endif
}
void loop()
{
if (digitalRead(gpio_0) == LOW) { // Push button pressed
// Key debounce handling
delay(100);
int startTime = millis();
while (digitalRead(gpio_0) == LOW) {
delay(50);
}
int endTime = millis();
if ((endTime - startTime) > 10000) {
// If key pressed for more than 10secs, reset all
Serial.printf("Reset to factory.\n");
RMakerFactoryReset(2);
} else if ((endTime - startTime) > 3000) {
Serial.printf("Reset Wi-Fi.\n");
// If key pressed for more than 3secs, but less than 10, reset Wi-Fi
RMakerWiFiReset(2);
} else {
// Toggle device state
toggleDeviceState();
// switch_state = !switch_state;
// Serial.printf("Toggle State to %s.\n", switch_state ? "true" : "false");
// if (my_switch) {
// my_switch->updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME,
// switch_state);
// }
// (switch_state == false) ? digitalWrite(gpio_led, LOW)
// : digitalWrite(gpio_led, HIGH);
}
}
if (digitalRead(gpio_button) == LOW) {
// Key debounce handling
delay(100);
Serial.println("GPIO 15 BUTTON PRESSED");
toggleDeviceState();
}
delay(100);
}
And the output from Arduino IDE. the qr code does show up correctly in the IDE, but it does not look like it pastes here correctly. also it is not shown here because i added code to not try to connect to the wifi if it does not receive a password, but the error code is something like "Exit Code 15"
Scan this QR code from the ESP RainMaker phone app.
█▀▀▀▀▀█ ▄▄▀▀█▀ ▀▀▄ ▀▀▀▀ █▀▀▀▀▀█
█ ███ █ ▄ █▄▄▀▀▄▄ █▀▀▄▄ █ ███ █
█ ▀▀▀ █ ▀▀ ▄▄█▀ ▀▄▄▀██▀ █ ▀▀▀ █
▀▀▀▀▀▀▀ ▀ █▄▀ ▀▄▀ █▄▀ ▀▄█ ▀▀▀▀▀▀▀
█▀▄▄▄▀▀▀ █ ▀▄▀▄█▀▀▀▄ ▀▀ ▄█▀▄▄
▄▄▀▀██▀▄▀▄▀ ▄▀ ██▀▀▄ ▀▀▄ █▀ ▄█
▀▄██ ▀▀██ ▀▀ ▄█ ▀██ ▀ ██ ▀▄ █
GPIO 15 BUTTON PRESSED
Toggle State to false.
Received Wi-Fi credentials
SSID : *MyNetworkName*
Password :
Password too short, factory resetting
ets Jul 29 2019 12:21:46
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1344
load:0x40078000,len:13964
load:0x40080400,len:3600
entry 0x400805f0
Thanks in advance to anyone that can help me!!
I am trying to set up an ESP32 Rainmaker project and I am having some difficulty and I was wondering if anyone was having the same issue and was able to resolve it.
When I download my code from Arduino IDE to my ESP32C3 board and start the provisioning process in the ios ESP Rainmaker app, I get to the point of entering my Network SSID and Password Manually, submitting, then the ESP fails to connect to the wifi. It is acting like the board did not receive the password for the network from the app over BLE. I will post my code below:
// This example demonstrates the ESP RainMaker with a standard Switch device.
#include "RMaker.h"
#include "WiFi.h"
#include "WiFiProv.h"
#include "AppInsights.h"
#define DEFAULT_POWER_MODE true
const char *service_name = "PROV_SMART";
const char *pop = "abcd1234";
// GPIO for push button
//#if CONFIG_IDF_TARGET_ESP32C3
//static int gpio_0 = 9;
//#else
// GPIO for virtual device
static int gpio_0 = 0;
//#endif
static int gpio_led = 2;
static int gpio_button = 18;
/* Variable for reading pin status*/
bool switch_state = true;
// The framework provides some standard device types like switch, lightbulb,
// fan, temperaturesensor.
static Switch *my_switch = NULL;
void sysProvEvent(arduino_event_t *sys_event)
{
switch (sys_event->event_id) {
case ARDUINO_EVENT_PROV_START:
#if CONFIG_IDF_TARGET_ESP32S2
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n",
service_name, pop);
printQR(service_name, pop, "softap");
#else
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n",
service_name, pop);
printQR(service_name, pop, "ble");
#endif
break;
case ARDUINO_EVENT_PROV_INIT:
wifi_prov_mgr_disable_auto_stop(10000);
break;
case ARDUINO_EVENT_PROV_CRED_SUCCESS:
wifi_prov_mgr_stop_provisioning();
break;
case ARDUINO_EVENT_WIFI_STA_CONNECTED:
Serial.printf("\nConnected to Wi-Fi!\n");
//wifi_connected = 1;
delay(500);
break;
case ARDUINO_EVENT_PROV_CRED_RECV: {
Serial.println("\nReceived Wi-Fi credentials");
Serial.print("\tSSID : ");
Serial.println((const char *) sys_event->event_info.prov_cred_recv.ssid);
Serial.print("\tPassword : ");
Serial.println((char const *) sys_event->event_info.prov_cred_recv.password);
int passLen = strlen((char const *) sys_event->event_info.prov_cred_recv.password);
if (passLen <= 2) {
Serial.println("Password too short, factory resetting");
RMakerFactoryReset(2);
}
break;
}
default:;
}
}
void write_callback(Device *device, Param *param, const param_val_t val,
void *priv_data, write_ctx_t *ctx)
{
const char *device_name = device->getDeviceName();
const char *param_name = param->getParamName();
if (strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n",
val.val.b ? "true" : "false", device_name, param_name);
switch_state = val.val.b;
(switch_state == false) ? digitalWrite(gpio_led, LOW)
: digitalWrite(gpio_led, HIGH);
param->updateAndReport(val);
}
}
void toggleDeviceState() {
switch_state = !switch_state;
Serial.printf("Toggle State to %s.\n", switch_state ? "true" : "false");
if (my_switch) {
my_switch->updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, switch_state);
}
(switch_state == false) ? digitalWrite(gpio_led, LOW)
: digitalWrite(gpio_led, HIGH);
}
void setup()
{
Serial.begin(115200);
pinMode(gpio_0, INPUT);
pinMode(gpio_led, OUTPUT);
pinMode(gpio_button, INPUT);
digitalWrite(gpio_led, DEFAULT_POWER_MODE);
Node my_node;
my_node = RMaker.initNode("ESP RainMaker Node");
// Initialize switch device
my_switch = new Switch("Switch", &gpio_led);
if (!my_switch) {
return;
}
// Standard switch device
my_switch->addCb(write_callback);
// Add switch device to the node
my_node.addDevice(*my_switch);
// This is optional
RMaker.enableOTA(OTA_USING_TOPICS);
// If you want to enable scheduling, set time zone for your region using
// setTimeZone(). The list of available values are provided here
// https://rainmaker.espressif.com/docs/time-service.html
// RMaker.setTimeZone("Asia/Shanghai");
// Alternatively, enable the Timezone service and let the phone apps set the
// appropriate timezone
RMaker.enableTZService();
RMaker.enableSchedule();
RMaker.enableScenes();
// Enable ESP Insights. Insteads of using the default http transport, this function will
// reuse the existing MQTT connection of Rainmaker, thereby saving memory space.
initAppInsights();
RMaker.enableSystemService(SYSTEM_SERV_FLAGS_ALL, 2, 2, 2);
RMaker.start();
WiFi.onEvent(sysProvEvent);
#if CONFIG_IDF_TARGET_ESP32S2
WiFiProv.beginProvision(WIFI_PROV_SCHEME_SOFTAP, WIFI_PROV_SCHEME_HANDLER_NONE,
WIFI_PROV_SECURITY_1, pop, service_name);
#else
WiFiProv.beginProvision(WIFI_PROV_SCHEME_BLE, WIFI_PROV_SCHEME_HANDLER_FREE_BTDM,
WIFI_PROV_SECURITY_1, pop, service_name);
#endif
}
void loop()
{
if (digitalRead(gpio_0) == LOW) { // Push button pressed
// Key debounce handling
delay(100);
int startTime = millis();
while (digitalRead(gpio_0) == LOW) {
delay(50);
}
int endTime = millis();
if ((endTime - startTime) > 10000) {
// If key pressed for more than 10secs, reset all
Serial.printf("Reset to factory.\n");
RMakerFactoryReset(2);
} else if ((endTime - startTime) > 3000) {
Serial.printf("Reset Wi-Fi.\n");
// If key pressed for more than 3secs, but less than 10, reset Wi-Fi
RMakerWiFiReset(2);
} else {
// Toggle device state
toggleDeviceState();
// switch_state = !switch_state;
// Serial.printf("Toggle State to %s.\n", switch_state ? "true" : "false");
// if (my_switch) {
// my_switch->updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME,
// switch_state);
// }
// (switch_state == false) ? digitalWrite(gpio_led, LOW)
// : digitalWrite(gpio_led, HIGH);
}
}
if (digitalRead(gpio_button) == LOW) {
// Key debounce handling
delay(100);
Serial.println("GPIO 15 BUTTON PRESSED");
toggleDeviceState();
}
delay(100);
}
And the output from Arduino IDE. the qr code does show up correctly in the IDE, but it does not look like it pastes here correctly. also it is not shown here because i added code to not try to connect to the wifi if it does not receive a password, but the error code is something like "Exit Code 15"
Scan this QR code from the ESP RainMaker phone app.
█▀▀▀▀▀█ ▄▄▀▀█▀ ▀▀▄ ▀▀▀▀ █▀▀▀▀▀█
█ ███ █ ▄ █▄▄▀▀▄▄ █▀▀▄▄ █ ███ █
█ ▀▀▀ █ ▀▀ ▄▄█▀ ▀▄▄▀██▀ █ ▀▀▀ █
▀▀▀▀▀▀▀ ▀ █▄▀ ▀▄▀ █▄▀ ▀▄█ ▀▀▀▀▀▀▀
█▀▄▄▄▀▀▀ █ ▀▄▀▄█▀▀▀▄ ▀▀ ▄█▀▄▄
▄▄▀▀██▀▄▀▄▀ ▄▀ ██▀▀▄ ▀▀▄ █▀ ▄█
▀▄██ ▀▀██ ▀▀ ▄█ ▀██ ▀ ██ ▀▄ █
GPIO 15 BUTTON PRESSED
Toggle State to false.
Received Wi-Fi credentials
SSID : *MyNetworkName*
Password :
Password too short, factory resetting
ets Jul 29 2019 12:21:46
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1344
load:0x40078000,len:13964
load:0x40080400,len:3600
entry 0x400805f0
Thanks in advance to anyone that can help me!!