|
本帖最后由 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[50];
- // 新建组件对象
- #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[0]);
- TextStateChange2.print(LightState.LightStateChange[1]);
- TextStateChange3.print(LightState.LightStateChange[2]);
- TextStateChange4.print(LightState.LightStateChange[3]);
- 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
复制代码
|
|