运行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
没看出和blinker有啥关系 奈何col 发表于 2022-2-23 18:53
没看出和blinker有啥关系
报错的文件是BlinkerUtility.h:164:36,我把截图加上去了,就很迷,不知道是什么原因。 建议提供完整的程序和报错信息,您这样贴信息,看不出啥问题 奈何col 发表于 2022-2-23 21:42
建议提供完整的程序和报错信息,您这样贴信息,看不出啥问题
已经加了完整的程序在附件里面,但是是已经根据前面说的那样改好了的,就是不会在报错的。改的内容是在MyLightState对象里面的最后一个成员变量std::vector<String> LightStateChange。
麻烦您了,感谢感谢。 支持支持
页:
[1]