我想问一下你们如何使用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 应用程序上显示其值。
您的回复和反馈肯定会对我目前正在进行的这个项目有很大帮助。非常感谢!
正如您在 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(...);