ESP8266编译报错

请帮忙看看这个(no matching function for call to 'BlynkWifi::begin(const char [17])'
)报错如何解,谢谢!


/*下面是注释部分*/
//程序功能:通过获取心知天气数据判断本地是否下雨,如果下雨则控制继电器点动两次,否则不动作。下雨动作后5个小时内不再动作
//1.包含头文件
#include <ESP8266WiFi.h>              //wifi头文件
#include <DNSServer.h>                // dns伺服器头文件
#include <ESP8266WebServer.h>         //网络伺服器头文件
#include <WiFiManager.h>              //WiFi管理头文件
#include <BlynkSimpleEsp8266.h>       //使用blynk头文件
#include <ArduinoJson.h>              //json头文件
#include <Wire.h>                     //Wire头文件
#include <Adafruit_Sensor.h>          //底层传感器头文件
#include <Adafruit_BME280.h>          //BME280传感器头文件
#include <SoftwareSerial.h>           //软串口头文件

//2.定义变量
const char* server = "api.seniverse.com";                            //心知天气服务器地址
String location = "WKEZKQP0SPXT";                                   //城市名字
String key = "S-RVjQqh0zb7d25nC";                                             //申请的心知天气key
unsigned long previousMillis = 0;                                    //上次点动的时间
unsigned long interval = 18000000;                                   //5小时后允许再次点动
const int rainThreshold = 60;                                        //下雨阈值,表示当天降雨概率大于60%则认为是有雨

//初始化BME280传感器
Adafruit_BME280 bme;

//初始化软串口控制继电器
SoftwareSerial switchSerial(12,13);

//3.初始化函数
void setup() {
  //初始化串口,调试使用
  Serial.begin(9600);
  switchSerial.begin(9600);

  //初始化blynk和wifi
  Blynk.begin("your_blynk_token");
  WiFiManager wifiManager;
  wifiManager.autoConnect("AutoConnectAP");
  Serial.println("connected....");

  //初始化传感器
  bme.begin(0x76);  //默认地址是0x76,不用传入地址参数

  //初始化继电器
  switchSerial.write("AT+RST\r\n");                 //清理串口缓冲区
  delay(100);
  switchSerial.write("AT+CWJAP=\"xzz\",\"12345678\"\r\n");  //连接WIFI
  delay(10000);                                    //等待10s
  switchSerial.write("AT+CWMODE=3\r\n");            //选择AP+STA模式
  delay(100);
  switchSerial.write("AT+CIPMUX=1\r\n");            //开启多连接模式
  delay(100);
  switchSerial.write("AT+CIPSERVER=1,80\r\n");      //开启服务器

  //输出初始化信息
  Serial.println("setup complete");
}

//4.主程序循环
void loop() {

  //获取时间
  unsigned long currentMillis = millis();

  //检查时间间隔是否超过5小时,如果是则允许再次进行动作
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;   //更新时间
  }

  //获取天气信息
  String weatherJson = httpGetWeather();
  bool isRain = isRaining(weatherJson);

  //如果下雨且时间间隔超过5小时,点动继电器
  if (isRain && (currentMillis - previousMillis >= interval)) {
    Serial.println("It's raining. start switch.");
    switchSerial.write("AT+CIPSEND=0,5\r\n");  //选择连接0,5个字符长度
    delay(100);
    switchSerial.write("start");              //向0发送start命令
    delay(2000);
    switchSerial.write("AT+CIPSEND=0,5\r\n");
    delay(100);
    switchSerial.write("stop");               //向0发送stop命令
    previousMillis = currentMillis;           //记录时间
  }
 
  //继电器不动作
  delay(1000); 
}

//5.获取天气数据
String httpGetWeather()
{
  String cmd = "GET /v3/weather/now.json?key=" + key + "&location=" + location + 
  " HTTP/1.1\r\nHost: " + server + "\r\nConnection: close\r\n\r\n";
  const int httpPort = 80;
  WiFiClient client;
  if (!client.connect(server, httpPort)) {
    Serial.println("connection failed");
    return "";
  }
  Serial.println("Connected to server");
  client.print(cmd);
  unsigned long timeout = millis() + 5000;
  while (client.available() == 0) {
    if (timeout - millis() < 0) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return "";
    }
  }
  String response = "";
  while (client.available()) {
    String line = client.readStringUntil('\r');
    response += line;
  }
  Serial.println("response:\n" + response);
  return response;
}

//6.解析天气数据,返回是否下雨
bool isRaining(String json)
{
  const size_t bufferSize = 2*JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(8) + JSON_OBJECT_SIZE(11) + 784;
  DynamicJsonBuffer jsonBuffer(bufferSize);
  JsonObject& root = jsonBuffer.parseObject(json);
  if (!root.success()) {
    Serial.println("parseObject failed");
    return false;
  }
  String text = root["results"][0]["now"]["text"].asString();
  Serial.println(text);
  if (text == "晴" || text == "多云" || text == "阴")
  {
    return false;
  }
  else
  {
    int rainPercentage = root["results"][0]["now"]["precip"].as<int>();
    if (rainPercentage >= rainThreshold)
    {
      return true;
    }
    else
    {
      return false;
    }
  }
}

报错内容:


C:\Users\Administrator\Desktop\esp8266\99999\99999.ino: In function 'void setup()':
99999:36:33: error: no matching function for call to 'BlynkWifi::begin(const char [17])'
   36 |   Blynk.begin("your_blynk_token");
      |                                 ^
In file included from C:\Users\Administrator\Desktop\esp8266\99999\99999.ino:8:
C:\Users\Administrator\Documents\Arduino\libraries\Blynk\src/BlynkSimpleEsp8266.h:75:10: note: candidate: 'void BlynkWifi::begin(const char*, const char*, const char*, const char*, uint16_t)'
   75 |     void begin(const char* auth,
      |          ^~~~~
C:\Users\Administrator\Documents\Arduino\libraries\Blynk\src/BlynkSimpleEsp8266.h:75:10: note:   candidate expects 5 arguments, 1 provided
C:\Users\Administrator\Documents\Arduino\libraries\Blynk\src/BlynkSimpleEsp8266.h:86:10: note: candidate: 'void BlynkWifi::begin(const char*, const char*, const char*, IPAddress, uint16_t)'
   86 |     void begin(const char* auth,
      |          ^~~~~
C:\Users\Administrator\Documents\Arduino\libraries\Blynk\src/BlynkSimpleEsp8266.h:86:10: note:   candidate expects 5 arguments, 1 provided
C:\Users\Administrator\Desktop\esp8266\99999\99999.ino: In function 'bool isRaining(String)':
99999:125:42: error: no matching function for call to 'ArduinoJson::DynamicJsonBuffer::DynamicJsonBuffer(const size_t&)'
  125 |   DynamicJsonBuffer jsonBuffer(bufferSize);
      |                                          ^
In file included from c:\users\administrator\documents\arduino\libraries\arduinojson\include\arduinojson.h:7,
                 from C:\Users\Administrator\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson.h:13,
                 from C:\Users\Administrator\Desktop\esp8266\99999\99999.ino:9:
c:\users\administrator\documents\arduino\libraries\arduinojson\include\ArduinoJson/DynamicJsonBuffer.hpp:25:3: note: candidate: 'ArduinoJson::DynamicJsonBuffer::DynamicJsonBuffer()'
   25 |   DynamicJsonBuffer();
      |   ^~~~~~~~~~~~~~~~~
c:\users\administrator\documents\arduino\libraries\arduinojson\include\ArduinoJson/DynamicJsonBuffer.hpp:25:3: note:   candidate expects 0 arguments, 1 provided
c:\users\administrator\documents\arduino\libraries\arduinojson\include\ArduinoJson/DynamicJsonBuffer.hpp:23:7: note: candidate: 'constexpr ArduinoJson::DynamicJsonBuffer::DynamicJsonBuffer(const ArduinoJson::DynamicJsonBuffer&)'
   23 | class DynamicJsonBuffer : public JsonBuffer {
      |       ^~~~~~~~~~~~~~~~~
c:\users\administrator\documents\arduino\libraries\arduinojson\include\ArduinoJson/DynamicJsonBuffer.hpp:23:7: note:   no known conversion for argument 1 from 'const size_t' {aka 'const unsigned int'} to 'const ArduinoJson::DynamicJsonBuffer&'
exit status 1
no matching function for call to 'BlynkWifi::begin(const char [17])'



这个错误通常由于参数类型不匹配导致的。具体来说,BlynkWifi::begin() 方法需要传递一个 const char* 类型的参数,但是你传递的参数类型是一个固定长度的 char 数组。

解决这个问题可能有以下几种方法:

将参数类型更改为 const char*
将参数类型更改为 const char* 类型,可以通过将参数的地址传递给 begin() 方法来实现。例如:

Blynk.begin("your-auth-token");

这里的 "your-auth-token" 实际上是一个 const char* 类型的常量字符串,传递给 begin() 方法时会被自动转换为 const char* 类型。

将参数定义为可以扩展到 const char* 类型的变量
由于 char 数组可以隐式转换为 const char,因此你可以将其定义为可以扩展到 const char 类型的变量,以确保参数类型匹配。例如:

```c
char auth[] = "your-auth-token";
Blynk.begin(auth);

```在这个例子中,我们首先定义了一个 char 数组 auth,然后将其传递给 Blynk.begin() 方法。由于 char 数组可以隐式转换为 const char*,所以这样可以确保参数类型匹配。

更新库版本
如果第一和第二种方法都无法解决问题,你可以尝试更新 Blynk 库的版本,以确保使用的是最新的代码。使用最新版本的库可能会解决一些已知的问题,并提供更好的兼容性。

希望这些方法可以帮助你解决问题。