ESP RainMaker® is a complete system for building AIoT products with a minimal amount of code, empowering your team to develop and deploy secure, customized AIoT solutions. It covers all Espressif chips and modules, device firmware, voice-assistant integrations, phone apps and cloud backend. This helps you save a large investment in cloud, gain independence and focus on innovating your core-value offering.
In this Dimmer tutorial, we will introduce you to ESP RainMaker with ESP32 using Arduino IDE. Create Arduino code for dimming, upload to the microcontroller, and connect to the mobile APP. https://rainmaker.espressif.com/

Встроенная поддержка интеграции с Amazon Alexa и Google Assistant через навыки и действия умного дома. Вы также можете создавать собственные пользовательские навыки.
Пример скетча для диммера включён в комплект. Давайте быстро рассмотрим код, который обеспечивает эту функциональность.
- //Этот пример демонстрирует работу ESP RainMaker с диммером
- #include "RMaker.h"
- #include "WiFi.h"
- #include "WiFiProv.h"
- #include <RBDdimmer.h> //Подключение диммера к микроконтроллеру и библиотека Arduino. https://rocketcontroller.com/dimmer-connection-to-microcontroller-and-arduino-library-examples/
- #define DEFAULT_POWER_MODE true
- #define DEFAULT_DIMMER_LEVEL 50
- const char *service_name = "PROV_1234";
- const char *pop = "abcd1234";
- //GPIO для кнопки
- #if CONFIG_IDF_TARGET_ESP32C3
- static int gpio_0 = 9;
- static int gpio_dimmer = 7;
- static int gpio_zerocross 5 // настройка пинов
- #else
- //GPIO для виртуального устройства
- static int gpio_0 = 0;
- static int gpio_dimmer = 23;
- static int gpio_zerocross 5 // настройка пинов
- #endif
- dimmerLamp dimmer(gpio_dimmer, gpio_zerocross);
- bool dimmer_state = true;
- // Фреймворк предоставляет стандартные типы устройств: выключатель, лампочка, вентилятор, датчик температуры.
- // Но вы также можете определить пользовательские устройства, используя базовый класс 'Device', как показано здесь
- static Device my_device("Dimmer", "custom.device.dimmer", &gpio_dimmer);
- 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;
- 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);
- dimmer_state = val.val.b;
- (dimmer_state == false) ? dimmer.setPower(OFF) : dimmer.setPower(ON);
- param->updateAndReport(val);
- } else if (strcmp(param_name, "Level") == 0) {
- Serial.printf("\nReceived value = %d for %s - %s\n", val.val.i, device_name, param_name);
- param->updateAndReport(val);
- dimmer.setPower(val.val.i); // ДИММИРОВАНИЕ
- }
- }
- void setup()
- {
- Serial.begin(115200);
- pinMode(gpio_0, INPUT);
- dimmer.begin(NORMAL_MODE, ON);
- Node my_node;
- my_node = RMaker.initNode("ESP RainMaker Node");
- //Создание пользовательского устройства диммера
- my_device.addNameParam();
- my_device.addPowerParam(DEFAULT_POWER_MODE);
- my_device.assignPrimaryParam(my_device.getParamByName(ESP_RMAKER_DEF_POWER_NAME));
- //Создание и добавление пользовательского параметра уровня
- Param level_param("Level", "custom.param.level", value(DEFAULT_DIMMER_LEVEL), PROP_FLAG_READ | PROP_FLAG_WRITE);
- level_param.addBounds(value(0), value(100), value(1));
- level_param.addUIType(ESP_RMAKER_UI_SLIDER);
- my_device.addParam(level_param);
- my_device.addCb(write_callback);
- //Добавление пользовательского устройства диммера к узлу
- my_node.addDevice(my_device);
- //Это необязательно
- RMaker.enableOTA(OTA_USING_PARAMS);
- //Если вы хотите включить планирование, установите часовой пояс для вашего региона с помощью setTimeZone().
- //Список доступных значений представлен здесь https://rainmaker.espressif.com/docs/time-service.html
- // RMaker.setTimeZone("Asia/Shanghai");
- // Или включите службу часового пояса и позвольте мобильным приложениям установить соответствующий часовой пояс
- RMaker.enableTZService();
- RMaker.enableSchedule();
- 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) { //Кнопка нажата
- // Обработка дребезга контактов
- delay(100);
- int startTime = millis();
- while(digitalRead(gpio_0) == LOW) delay(50);
- int endTime = millis();
- if ((endTime - startTime) > 10000) {
- // Если кнопка удерживается более 10 секунд, сбросить все настройки
- Serial.printf("Reset to factory.\n");
- RMakerFactoryReset(2);
- } else if ((endTime - startTime) > 3000) {
- Serial.printf("Reset Wi-Fi.\n");
- // Если кнопка удерживается более 3 секунд, но менее 10, сбросить Wi-Fi
- RMakerWiFiReset(2);
- } else {
- // Переключение состояния устройства
- dimmer_state = !dimmer_state;
- Serial.printf("Toggle State to %s.\n", dimmer_state ? "true" : "false");
- my_device.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, dimmer_state);
- (dimmer_state == false) ? dimmer.setPower(OFF) : dimmer.setPower(ON);
- }
- }
- delay(100);
- }
Переключатель можно контролировать через мобильное приложение, а также с помощью навыков голосовых помощников Alexa и Google.
При выполнении этого кода:
- Устройство сначала проверит, настроена ли сеть Wi-Fi. Если сеть не настроена, будет запущен процесс провизионирования. Затем устройство можно настроить с помощью мобильных приложений, упомянутых выше.
- Если конфигурация Wi-Fi найдена, устройство подключится к настроенной сети.
- После подключения устройство соединится с облаком RainMaker и будет ожидать команды для изменения своих параметров (в данном случае — состояние переключателя).
- Устройство также будет искать команды в локальной сети Wi-Fi.
- Когда кто-то изменяет состояние переключателя через мобильные приложения или голосовые интеграции, вызывается функция write_callback().
Начало работы
Прежде чем начать, обратите внимание на несколько моментов
- For using RainMaker, you first have to get started with the ESP32 support in Arduino.
- RainMaker support is not yet part of a stable esp32-arduino release. So we will use the master branch of the ESP32 Arduino repository. We will update here and elsewhere once this support is available in a stable release.
После настройки Arduino с поддержкой ESP32 выполните следующие шаги
- Откройте Arduino IDE, перейдите в меню Tools и установите следующие параметры
- Board: «ESP32 Dev Module»
- Flash Size: «4MB» (в зависимости от вашего контроллера ESP32)
- Partition Scheme: «RainMaker»
- Core Debug Level: «Info»
- Port: Выберите соответствующий порт ESP32 в зависимости от вашей платформы из списка. Подключая/отключая плату ESP32, вы можете определить номер порта.
2. Загрузите скетч на плату ESP32, нажав кнопку Upload в IDE, или перейдите в Sketch -> Upload
3. Перейдите в Tools -> Serial Monitor. Выберите скорость 115200 бод. Если в окне монитора ничего не отображается, перезагрузите плату (кнопкой RST).
4. Download the ESP RainMaker phone app, sign-up or sign-in and you are ready to go.
5. Следуйте инструкциям в Serial Monitor для добавления переключателя из приложения RainMaker. (Если инструкции не отображаются, проверьте параметр «Core Debug Level: Info» в меню Tools)
Любое управление из мобильного приложения теперь должно отражаться на устройстве, а любое изменение на устройстве (нажатием кнопки BOOT) должно отражаться в мобильном приложении.
Вы можете нажать и удерживать кнопку BOOT более 3 секунд, а затем отпустить для сброса Wi-Fi, или более 10 секунд для сброса к заводским настройкам.





