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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 730|回复: 5

[过期] 运行blink库String报错

[复制链接]
发表于 2022-2-23 17:21 | 显示全部楼层 |阅读模式
本帖最后由 uint8_t 于 2022-2-24 14:28 编辑

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

然后改成
  1. #include <vector>

  2. std::vector<String> LightStateChange;   
复制代码
就通过编译了,这是using namespace std;和#include <WString.h>冲突了吗?是新旧标准库的原因?
完整代码如下,一共四个文件: 屏幕截图 2022-02-24 111306.png
  1. #define BLINKER_WIFI
  2. #define BLINKER_MIOT_LIGHT//支持小爱同学
  3. #define BLINKER_OTA_VERSION_CODE "3.0.0" //版本号
  4. #include <Arduino.h>
  5. #include <Blinker.h>
  6. #include "main.h"

  7. /*
  8. 一楼客厅的灯泡:c61cce3bbd7b


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


  13. MyLightState LightState; //灯的状态
  14. char SprintfChar[50];

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

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

  28.   if (state == BLINKER_CMD_ON)
  29.   {
  30.     LightState.OpenLight((char*)"通过APP首页按键打开"); // 开灯
  31.   }
  32.   else
  33.   {
  34.     LightState.CloseLight((char*)"通过APP首页按键关闭"); // 关灯
  35.   }
  36. }

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

  41.   if (state == BLINKER_CMD_ON)
  42.   {
  43.     LightState.OpenLight((char*)"通过APP开关按键打开"); // 开灯
  44.   }
  45.   else
  46.   {
  47.     LightState.CloseLight((char*)"通过APP开关按键关闭"); // 关灯
  48.   }
  49.   Blinker.vibrate();//发送手机振动指令
  50. }

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

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

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

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

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

  88.   TextStateChange1.print(LightState.LightStateChange[0]);
  89.   TextStateChange2.print(LightState.LightStateChange[1]);
  90.   TextStateChange3.print(LightState.LightStateChange[2]);
  91.   TextStateChange4.print(LightState.LightStateChange[3]);

  92.   BLINKER_LOG("heartbeat!");
  93. }


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

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

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

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

  116. void loop()
  117. {
  118.   Blinker.run();

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

  121.   if(millis() - LightState.LastGetDataTime >= 200) //距上次获取数据已经过去0.2s
  122.   {
  123.     LightState.RunTime = Blinker.runTime(); // 获取设备运行时间, 单位为秒(s)
  124.   }
  125. }
复制代码
  1. #ifndef main_H
  2. #define main_H
  3. #include "MyLightState.h"
  4. #include <vector>

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


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

  9. #endif
复制代码
  1. #include "MyLightState.h"


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

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

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

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

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

  52.             heartbeat(); //更新app显示
  53.             //delay(100);
  54.         }
  55.     }
  56. }

复制代码

  1. #ifndef MyLightState_H
  2. #define MyLightState_H
  3. #include <Arduino.h>
  4. //#include <WString.h>
  5. #include "main.h"

  6. //灯状态对象
  7. class MyLightState
  8. {
  9. public:
  10.     // 默认构造
  11.     MyLightState();

  12.     // 开灯函数
  13.     void OpenLight(String array);
  14.     // 关灯函数
  15.     void CloseLight(String array);
  16.     // 墙壁开关的控制函数
  17.     void WallSwitchControl();
  18.    

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


  30. #endif
复制代码


src.zip

3.92 KB, 下载次数: 0

发表于 2022-2-23 18:53 | 显示全部楼层
没看出和blinker有啥关系
 楼主| 发表于 2022-2-23 20:49 | 显示全部楼层
奈何col 发表于 2022-2-23 18:53
没看出和blinker有啥关系

报错的文件是  BlinkerUtility.h:164:36,我把截图加上去了,就很迷,不知道是什么原因。
发表于 2022-2-23 21:42 | 显示全部楼层
建议提供完整的程序和报错信息,您这样贴信息,看不出啥问题
 楼主| 发表于 2022-2-24 11:21 | 显示全部楼层
奈何col 发表于 2022-2-23 21:42
建议提供完整的程序和报错信息,您这样贴信息,看不出啥问题

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

麻烦您了,感谢感谢。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 10:41 , Processed in 0.103564 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表