ESP32 Rainmaker fails to connect to wifi

Sir_Swordfish
Posts: 2
Joined: Fri Oct 13, 2023 11:17 pm

ESP32 Rainmaker fails to connect to wifi

Postby Sir_Swordfish » 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!!

bidrohini
Posts: 202
Joined: Thu Oct 27, 2022 12:55 pm

Re: ESP32 Rainmaker fails to connect to wifi

Postby bidrohini » Tue Oct 17, 2023 8:41 am

Here is a video about some common Rainmaker problems.
https://www.youtube.com/watch?v=pNJBaWZ_vj0
You can see if it helps.

Sir_Swordfish
Posts: 2
Joined: Fri Oct 13, 2023 11:17 pm

Re: ESP32 Rainmaker fails to connect to wifi

Postby Sir_Swordfish » Sat Oct 21, 2023 12:17 am

bidrohini wrote:
Tue Oct 17, 2023 8:41 am
Here is a video about some common Rainmaker problems.
https://www.youtube.com/watch?v=pNJBaWZ_vj0
You can see if it helps.
Thanks for the reply! I have watched that video and it looked like I had a similar problem to one that he mentioned at 6:57, however he said the only fix for that issue was to erase the flash of the esp. I tried that multiple times with no success. Do you have any other suggestions?

Masoud123456
Posts: 2
Joined: Thu Sep 28, 2023 12:51 am

Re: ESP32 Rainmaker fails to connect to wifi

Postby Masoud123456 » Sat Nov 16, 2024 9:48 pm

hello every body
This problem usually occurs when we change the name of the BLE or password in the program or when we want to connect to a new wifi.
the previous information is stored in the rainmaker module make this problem
to get rid of them
Do the following steps in order
1- Press the boot button for more than 10 seconds
2- After a few seconds, press the en button
Then
3- Scan the relevant barcode
4- WiFi is introduced
5- And the end
By M.jafarzadeh

Who is online

Users browsing this forum: No registered users and 140 guests