运行blink库String报错-Arduino中文社区 - Powered by Discuz! Archiver

uint8_t 发表于 2022-2-23 17:21

运行blink库String报错

本帖最后由 uint8_t 于 2022-2-24 14:28 编辑

我在VSCode 里面使用 platformio 编译的工程
我使用了
#include <string>
#include <vector>
using namespace std;程序报的错误是
/BlinkerUtility.h:164:36: error: no matching function for call to 'String::String(std::__cxx11::basic_string<char>&)'

然后改成
#include <vector>

std::vector<String> LightStateChange;   就通过编译了,这是using namespace std;和#include <WString.h>冲突了吗?是新旧标准库的原因?
完整代码如下,一共四个文件:
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT//支持小爱同学
#define BLINKER_OTA_VERSION_CODE "3.0.0" //版本号
#include <Arduino.h>
#include <Blinker.h>
#include "main.h"

/*
一楼客厅的灯泡:c61cce3bbd7b


*/
char auth[] = "c61cce3bbd7b";//app中获取到的Secret Key(密钥)
char ssid[] = "song_second";
char pswd[] = "20110722";


MyLightState LightState; //灯的状态
char SprintfChar;

// 新建组件对象
#define BUTTON_Light (char*)"btn-light"
BlinkerButton ButtonLight(BUTTON_Light);         // 按键组件:开/关灯
BlinkerText TextLightState((char*)"tex-state");          // 文字组件:显示灯的状态
BlinkerText TextBlinkerTime((char*)"tex-BlinkerTime");   // 文字组件:显示系统运行时间
BlinkerText TextStateChange1((char*)"tex-change1");      // 文字组件:显示灯状态改变原因1
BlinkerText TextStateChange2((char*)"tex-change2");      // 文字组件:显示灯状态改变原因2
BlinkerText TextStateChange3((char*)"tex-change3");      // 文字组件:显示灯状态改变原因3
BlinkerText TextStateChange4((char*)"tex-change4");      // 文字组件:显示灯状态改变原因4

// 首页开关的回调函数, 当收到指令时会调用该回调函数
void switch_callback(const String & state)
{
BLINKER_LOG("get switch state: ", state);

if (state == BLINKER_CMD_ON)
{
    LightState.OpenLight((char*)"通过APP首页按键打开"); // 开灯
}
else
{
    LightState.CloseLight((char*)"通过APP首页按键关闭"); // 关灯
}
}

// 开关灯按键回调函数,当收到指令时会调用该回调函数
void BUTTONLight_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);

if (state == BLINKER_CMD_ON)
{
    LightState.OpenLight((char*)"通过APP开关按键打开"); // 开灯
}
else
{
    LightState.CloseLight((char*)"通过APP开关按键关闭"); // 关灯
}
Blinker.vibrate();//发送手机振动指令
}

//小爱电源类操作的回调函数:
//当小爱同学向设备发起控制, 设备端需要有对应控制处理函数
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON)
{
    digitalWrite(relay, HIGH);
    BlinkerMIOT.powerState("on"); //给小爱同学反馈控制状态:已打开
    BlinkerMIOT.print();

    LightState.OpenLight((char*)"通过小爱同学打开"); // 开灯
}
else if (state == BLINKER_CMD_OFF)
{
    digitalWrite(relay, LOW);
    BlinkerMIOT.powerState("off"); //给小爱同学反馈控制状态:已关闭
    BlinkerMIOT.print();

    LightState.CloseLight((char*)"通过小爱同学关闭"); // 关灯
}
}

// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();//发送手机振动指令
}

// 用户自定义状态返回的心跳包回调函数
void heartbeat()
{
BUILTIN_SWITCH.print(LightState.LedState ? "on" : "off");
ButtonLight.print(LightState.LedState ? "on" : "off");
TextLightState.color(LightState.LedState ? "Blue" : "black");
TextLightState.print(LightState.LedState ? "灯状态: 开启" : "灯状态: 关闭");
sprintf(SprintfChar, "%lld天%lld时%lld分",
          LightState.RunTime/3600/24,LightState.RunTime/3600%24,
          LightState.RunTime%3600/60);
TextBlinkerTime.print(SprintfChar,"系统运行时间");

TextStateChange1.print(LightState.LightStateChange);
TextStateChange2.print(LightState.LightStateChange);
TextStateChange3.print(LightState.LightStateChange);
TextStateChange4.print(LightState.LightStateChange);

BLINKER_LOG("heartbeat!");
}


void setup()
{
// 初始化串口,并开启调试信息,调试用可以删除
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化IO
pinMode(relay, OUTPUT);
digitalWrite(relay, LOW);
pinMode(KEY, INPUT);
//digitalWrite(KEY, HIGH);
LightState.WallSwitchState = digitalRead(KEY);// 获取墙壁开关此时的状态

// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead); //注册回调函数,当有设备收到APP发来的数据时会调用对应的回调函数
Blinker.attachHeartbeat(heartbeat);//注册心跳包回调函数
BUILTIN_SWITCH.attach(switch_callback); //设置首页开关的回调函数, 当收到指令时会调用该回调函数
ButtonLight.attach(BUTTONLight_callback);//注册开关灯按键的回调函数, 当收到指令时会调用该回调函数

//给APP发送当前的状态
heartbeat();

//小爱同学务必在回调函数中反馈该控制状态
BlinkerMIOT.attachPowerState(miotPowerState);//注册小爱同学回调函数
}

void loop()
{
Blinker.run();

//墙壁开关的控制
LightState.WallSwitchControl();

if(millis() - LightState.LastGetDataTime >= 200) //距上次获取数据已经过去0.2s
{
    LightState.RunTime = Blinker.runTime(); // 获取设备运行时间, 单位为秒(s)
}
}

#ifndef main_H
#define main_H
#include "MyLightState.h"
#include <vector>

// 设置各引脚别名
#define relay 10 // 定义继电器输入引脚为GPIO/10
#define KEY   5// 定义按键引脚


void heartbeat(); //用户自定义状态返回的心跳包回调函数

#endif
#include "MyLightState.h"


MyLightState::MyLightState()
{
    this->WallSwitchState = digitalRead(KEY);// 获取墙壁开关此时的状态
    this->LedState = false;   // 灯默认为关闭
    this->RunTime = 0;   // 系统运行时间 单位s
    this->LastGetDataTime = 0; // 上次获取数据时间 单位ms
    //储存灯状态发生改变的原因,指定大小为4
    this->LightStateChange.resize(4, "**********");
}

//开灯函数
void MyLightState::OpenLight(String array)
{
    digitalWrite(relay, HIGH);// 开灯
    this->LedState = true;      // 将灯的状态切换为 开
    // 储存灯状态发生改变的原因
    //尾删
    this->LightStateChange.pop_back();
    //在头部插入当前状态发生改变的原因
    this->LightStateChange.insert(LightStateChange.begin(), array);
    heartbeat();                // 更新app显示
}

//关灯函数
void MyLightState::CloseLight(String array)
{
    digitalWrite(relay, LOW);// 关灯
    this->LedState = false;    // 将灯的状态切换为 关
    // 储存灯状态发生改变的原因
    //尾删
    this->LightStateChange.pop_back();
    //在头部插入当前状态发生改变的原因
    this->LightStateChange.insert(LightStateChange.begin(), array);
    heartbeat();                // 更新app显示
}

// 墙壁开关的控制函数
void MyLightState::WallSwitchControl()
{
    if (digitalRead(KEY) != this->WallSwitchState) //如果墙壁开关当前状态发生改变
    {
      delay(100); //延时消抖
      if (digitalRead(KEY) != this->WallSwitchState)
      {
            this->WallSwitchState = digitalRead(KEY); //记录墙壁开关当前的状态
            digitalWrite(relay, !digitalRead(relay)); //将灯的状态取反
            this->LedState = !(this->LedState);//改变存储灯状态的变量

            // 储存灯状态发生改变的原因
            //尾删
            this->LightStateChange.pop_back();
            String array = this->LedState ? "通过墙壁开关打开" : "通过墙壁开关关闭";
            //在头部插入当前状态发生改变的原因
            this->LightStateChange.insert(LightStateChange.begin(), array);

            heartbeat(); //更新app显示
            //delay(100);
      }
    }
}



#ifndef MyLightState_H
#define MyLightState_H
#include <Arduino.h>
//#include <WString.h>
#include "main.h"

//灯状态对象
class MyLightState
{
public:
    // 默认构造
    MyLightState();

    // 开灯函数
    void OpenLight(String array);
    // 关灯函数
    void CloseLight(String array);
    // 墙壁开关的控制函数
    void WallSwitchControl();
   

    // 存储墙壁开关状态的变量
    bool WallSwitchState;
    // 存储灯状态的变量
    bool LedState;    //构造函数中赋初值
    // 系统运行时间 单位s
    time_t RunTime;
    // 上次获取数据时间 单位ms
    time_t LastGetDataTime;
    //储存灯状态发生改变的原因,只存4次
    std::vector<String> LightStateChange;   
};


#endif

奈何col 发表于 2022-2-23 18:53

没看出和blinker有啥关系

uint8_t 发表于 2022-2-23 20:49

奈何col 发表于 2022-2-23 18:53
没看出和blinker有啥关系

报错的文件是BlinkerUtility.h:164:36,我把截图加上去了,就很迷,不知道是什么原因。

奈何col 发表于 2022-2-23 21:42

建议提供完整的程序和报错信息,您这样贴信息,看不出啥问题

uint8_t 发表于 2022-2-24 11:21

奈何col 发表于 2022-2-23 21:42
建议提供完整的程序和报错信息,您这样贴信息,看不出啥问题

已经加了完整的程序在附件里面,但是是已经根据前面说的那样改好了的,就是不会在报错的。改的内容是在MyLightState对象里面的最后一个成员变量std::vector<String> LightStateChange。

麻烦您了,感谢感谢。

Kano 发表于 2022-2-24 12:17

支持支持
页: [1]
查看完整版本: 运行blink库String报错