如何在Arduino IDE中使用ESP Rainmaker添加水位传感器设备?

问题描述 投票:0回答:1

我想问一下你们如何使用ESP Rainmaker专门添加水位装置?

因为似乎每当我尝试创建一个时,总会出现这些PARAM错误

这就是我声明水位传感器装置的方式:

 static Device water_level_sensor("Water Level Sensor");

然后这就是我添加水位参数的方法:

static Param water_level_param("Water Level", "percentage", RMAKER_VAL_TYPE_INTEGER, 0);

这就是我将传感器结果发送到 ESP Rainmaker 的方式:

water_level_param.updateAndReport((param_val_t)water_level_percentage); 

这一行是经常出现错误的地方:

 static Param water_level_param("Water Level", "percentage", RMAKER_VAL_TYPE_INTEGER, 0); 

错误指出:

error: no matching function for call to 'Param::Param(const char [12], const char [11], esp_rmaker_val_type_t, int)'
 static Param water_level_param("Water Level", "percentage", RMAKER_VAL_TYPE_INTEGER, 0); 

我的目标是在 ESP Rainmaker 应用程序中显示水位传感器结果以及温度和湿度,但由于这些参数错误,目前似乎无法实现。

这是我的完整源代码(其中捕获温度和湿度(来自 DHT11)和水位结果(来自水位传感器)并将其传递到 ESP Rainmaker 应用程序):

#include "RMaker.h"
#include <RMakerParam.h>
#include <RMakerDevice.h>
#include <RMakerNode.h>
#include <WiFi.h>
#include <WiFiProv.h>
#include <DHT.h>
#include <SimpleTimer.h>
#include <wifi_provisioning/manager.h>

// Set Default Values
#define DEFAULT_Temperature 0
#define DEFAULT_Humidity 0

// BLE Credentials
const char *service_name = "myservice";
const char *pop = "mypass";

// GPIO
static uint8_t gpio_reset = 0;
static uint8_t DHTPIN = 23;

bool wifi_connected = false;

DHT dht(DHTPIN, DHT11);

SimpleTimer Timer;

// Declaring Devices
static TemperatureSensor temperature("Temperature");
static TemperatureSensor humidity("Humidity");
static Device water_level_sensor("Water Level Sensor");

void sysProvEvent(arduino_event_t *sys_event) {
    switch (sys_event->event_id) {
        case ARDUINO_EVENT_PROV_START:
#if CONFIG_IDF_TARGET_ESP32
            Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n", service_name, pop);
            printQR(service_name, pop, "ble");
#else
            Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n", service_name, pop);
            printQR(service_name, pop, "softap");
#endif
            break;
        case ARDUINO_EVENT_WIFI_STA_CONNECTED:
            Serial.printf("\nConnected to Wi-Fi!\n");
            wifi_connected = true;
            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);
            break;
        }
        case ARDUINO_EVENT_PROV_INIT:
            wifi_prov_mgr_disable_auto_stop(10000);
            break;
        case ARDUINO_EVENT_PROV_CRED_SUCCESS:
            Serial.println("Stopping Provisioning!!!");
            wifi_prov_mgr_stop_provisioning();
            break;
    }
}

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();
    Serial.println(device_name);
    const char *param_name = param->getParamName();
}

void setup() {
    Serial.begin(115200);

    // Configure the input GPIOs
    pinMode(gpio_reset, INPUT);

    // Beginning Sensor
    dht.begin();

    // Declaring Node
    Node my_node = RMaker.initNode("ESP32 Project 2");

    // Adding Devices in Node
    my_node.addDevice(temperature);
    my_node.addDevice(humidity);
    my_node.addDevice(water_level_sensor);

    // Enable OTA
    RMaker.enableOTA(OTA_USING_PARAMS);

    // Enable timezone service
    RMaker.enableTZService();

    // Enable scheduling
    RMaker.enableSchedule();

    Serial.printf("\nStarting ESP-RainMaker\n");
    RMaker.start();

    // Timer for Sending Sensor's Data
    Timer.setInterval(3000);

    WiFi.onEvent(sysProvEvent);

#if CONFIG_IDF_TARGET_ESP32
    WiFiProv.beginProvision(WIFI_PROV_SCHEME_BLE, WIFI_PROV_SCHEME_HANDLER_FREE_BTDM, WIFI_PROV_SECURITY_1, pop, service_name);
#else
    WiFiProv.beginProvision(WIFI_PROV_SCHEME_SOFTAP, WIFI_PROV_SCHEME_HANDLER_NONE, WIFI_PROV_SECURITY_1, pop, service_name);
#endif

    // Add water level parameter
    static Param water_level_param("Water Level", "percentage", RMAKER_VAL_TYPE_INTEGER, 0);
    water_level_sensor.addParam(water_level_param);
}

void loop() {
    if (Timer.isReady() && wifi_connected) {
        // Check if the timer is ready
        Serial.println("Sending Sensor's Data");
        Send_Sensor();
        Timer.reset(); // Reset the timer
    }

    // Logic to Reset RainMaker
    if (digitalRead(gpio_reset) == LOW) {
        // Push button pressed
        Serial.printf("Reset Button Pressed!\n");
        // Key debounce handling
        delay(100);
        int startTime = millis();
        while (digitalRead(gpio_reset) == 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");
            wifi_connected = false;
            RMakerFactoryReset(2);
        } else if ((endTime - startTime) > 3000) {
            Serial.printf("Reset Wi-Fi.\n");
            wifi_connected = false;
            // If key pressed for more than 3secs, but less than 10, reset Wi-Fi
            RMakerWiFiReset(2);
        }
    }
    delay(100);
}

void Send_Sensor() {
    // Read temperature, humidity, and water level
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    int water_level_reading = readWaterLevel();

    // Check if the readings are valid
    if (isnan(h) || isnan(t) || water_level_reading == -1) {
        Serial.println("Failed to read from sensors");
        return;
    }

    // Print sensor readings
    Serial.print("Temperature - ");
    Serial.println(t);
    Serial.print("Humidity - ");
    Serial.println(h);
    Serial.print("Water Level - ");
    Serial.println(water_level_reading);

    // Update and report temperature parameter
    temperature.updateAndReportParam("Temperature", t);

    // Update and report humidity parameter
    humidity.updateAndReportParam("Humidity", h);

    // Update and report water level parameter
    float water_level_percentage = map(water_level_reading, 0, 4095, 0, 100);
    water_level_percentage = constrain(water_level_percentage, 0, 100);
    water_level_param.updateAndReport((param_val_t)water_level_percentage);
}

int readWaterLevel() {
    const int POWER_PIN = 17; // GPIO pin connected to power pin of water level sensor
    const int SIGNAL_PIN = 36; // GPIO pin connected to signal pin of water level sensor

    int value = -1;

    // Power on the sensor
    pinMode(POWER_PIN, OUTPUT);
    digitalWrite(POWER_PIN, HIGH);
    delay(10);

    // Read the analog value from the sensor
    pinMode(SIGNAL_PIN, INPUT);
    value = analogRead(SIGNAL_PIN);

    // Power off the sensor
    digitalWrite(POWER_PIN, LOW);

    return value;
}

我使用 Arduino IDE 运行此源代码。

这些是 Rainmaker 支持的所有设备类型。它清楚地表明水位传感器不存在: 来源:https://rainmaker.espressif.com/docs/standard-types.html

看来Param构造函数参数仍然存在问题。该错误表明给定参数没有匹配的函数。

这表明参数不正确,因此我真的不确定参数的正确签名是什么,特别是对于水位传感器,它甚至不在支持的设备上,因此,我正在尝试转换水位传感器作为“自定义设备”,以便在 ESP Rainmaker 应用程序上显示其值。

您的回复和反馈肯定会对我目前正在进行的这个项目有很大帮助。非常感谢!

c++ arduino esp32 arduino-ide arduino-esp32
1个回答
0
投票

正如您在 Param 构造函数调用中看到的:

Param(const char *param_name, const char *param_type, param_val_t val, uint8_t properties)
{
    param_handle = esp_rmaker_param_create(param_name, param_type, val, properties);
}

哪个电话:

esp_rmaker_param_t *esp_rmaker_param_create(const char *param_name, const char *type,
        esp_rmaker_param_val_t val, uint8_t properties)
{...

其中 esp_rmaker_param_val_t 是一个结构体:

/** ESP RainMaker Parameter Value */
typedef struct {
    /** Type of Value */
    esp_rmaker_val_type_t type;
    /** Actual value. Depends on the type */
    esp_rmaker_val_t val;
} esp_rmaker_param_val_t;

因此,您不仅需要 RMAKER_VAL_TYPE_INTEGER 类型,还需要第三个参数的值来创建正确的结构:

static Param water_level_param(...);

如果您想自己查看代码:https://github.com/espressif/arduino-esp32/tree/2479efb10d2709246a41562b8a626c7ed14ee164/libraries/RainMaker

© www.soinside.com 2019 - 2024. All rights reserved.