#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>
// 替换为您的WIFI名称和密码
const char* ssid = "xzz";
const char* password = "12345678";
// 替换为您的blinker App KEY和SECRET
const String BLINKER_AUTH = "93182b8d7180";
const String BLINKER_PSWD = "176472yu";
// 定义继电器控制引脚
#define RELAY_PIN_1 5
#define RELAY_PIN_2 4
// 定义点动信号时间间隔(ms)
#define PULSE_INTERVAL 1000
// 定义时间错误代码
#define TIME_ERROR -1
// 定义两次点动信号之间的保护时间(ms)
#define PROTECT_INTERVAL 5*60*60*1000 // 5小时
// 定义外部API获取天气预报的URL(此处以心知天气为例,需要替换为您选择的API)
const char* WEATHER_API_URL = "https://api.seniverse.com/v3/weather/hourly?location=Yunyan&key=S-RVjQqh0zb7d25nC&language=zh-Hans&unit=c&start=0&hours=2";
// 定义全局变量
unsigned long lastTriggerTime = 0;
bool isRainy = false; // 初值为false表示当前未降雨
// 连接WIFI网络
void connectWiFi() {
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// 点动继电器
void pulseRelay(int relayPin, int times) {
int i = 0;
while (i < times) {
digitalWrite(relayPin, HIGH);
delay(PULSE_INTERVAL);
digitalWrite(relayPin, LOW);
delay(PULSE_INTERVAL);
i++;
}
}
// 判断是否在保护时间内,如果是则返回true,否则返回false
bool isProtected() {
if (lastTriggerTime == 0) {
return false;
}
if (millis() - lastTriggerTime < PROTECT_INTERVAL) {
return true;
}
return false;
}
// 获取外部API的响应数据
String fetchData(String url) {
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
String response = "";
if (httpCode == HTTP_CODE_OK) {
response = http.getString();
}
http.end();
return response;
}
// 从外部API响应数据中解析出当前未来2小时内是否有降雨的结果
bool parseWeatherData(String data) {
bool result = false;
// TODO: 解析外部API的响应数据,并返回是否有降雨的结果
// 此处需要根据您选择的API进行修改
return result;
}
// 定义Blinker的控制回调函数
void controlCallback(const String& message) {
Serial.println("Message received: ");
Serial.println(message);
if (message == "relay1_on") { // 通过Blinker App关闭继电器1
digitalWrite(RELAY_PIN_1, HIGH);
} else if (message == "relay1_off") { // 通过Blinker App开启继电器1
digitalWrite(RELAY_PIN_1, LOW);
} else if (message == "relay2_on") { // 通过Blinker App关闭继电器2
digitalWrite(RELAY_PIN_2, HIGH);
} else if (message == "relay2_off") { // 通过Blinker App开启继电器2
digitalWrite(RELAY_PIN_2, LOW);
}
}
// 配置初始化Blinker
void initBlinker() {
Blinker.begin(BLINKER_AUTH.c_str(), BLINKER_PSWD.c_str());
Blinker.attachControl(controlCallback);
}
void setup() {
// 初始化串口
Serial.begin(115200);
// 初始化继电器控制引脚
pinMode(RELAY_PIN_1, OUTPUT);
pinMode(RELAY_PIN_2, OUTPUT);
// 配置Blinker
initBlinker();
// 连接WIFI网络
connectWiFi();
}
void loop() {
// 检查Blinker的消息
Blinker.run();
// 如果在保护时间内,直接返回
if (isProtected()) {
return;
}
// 获取外部API的响应数据
String response = fetchData(WEATHER_API_URL);
// 解析响应数据,得到是否降雨的结果
isRainy = parseWeatherData(response);
if (isRainy) {
Serial.println("Rain is coming!");
// 点动继电器1
pulseRelay(RELAY_PIN_1, 2);
// 更新触发时间
lastTriggerTime = millis();
}
// 等待5秒钟,避免过渡刷新
delay(5000);
}
求见各位帮忙看看,
您遇到的新错误是因为您的代码中仍然存在对Blinker
对象的引用,但是并未在代码中进行声明。请确保您已经正确包含了Blinker
库,并进行了正确的初始化。
请按照以下步骤进行操作:
确保您已经正确安装了Blinker库。您可以通过Arduino库管理器搜索并安装Blinker库。
在您的代码开头添加以下语句以包含Blinker库的声明:
#include <Blinker.h>
setup()
函数中调用initBlinker()
函数来初始化Blinker:void setup() {
// 初始化串口
Serial.begin(115200);
// 初始化继电器控制引脚
pinMode(RELAY_PIN_1, OUTPUT);
pinMode(RELAY_PIN_2, OUTPUT);
// 连接WIFI网络
connectWiFi();
// 配置Blinker
initBlinker();
}
确保将initBlinker()
函数放置在setup()
函数中的合适位置。
重新编译并上传代码,看看问题是否得到解决。