ESP8266+继电器实现远程控制开关灯
文章目录
- ESP8266+继电器实现远程控制开关灯
- 一、前期准备
- 二、准备MQTT服务器
- 三、准备开发板代码
- 1.安装驱动
- 2、安装依赖
- 3、代码开发
- 3.1、连接WiFi使用WiFiManager自动配网
- 3.2、连接mqtt服务器
- 3.3、处理mqtt服务器返回的数据
- 完整代码
- 四、准备调试
- 总结
一、前期准备
- ESP-01S+继电器
- 烧录器
- MQTT服务器
二、准备MQTT服务器
这里使用的是腾讯云免费的
- 打开腾讯云的网站在云产品选择 物联网开发平台 选项进入后点击 公共实列
- 进入后点击侧边栏的项目列表新建项目
- 保存后再新建产品选择 自定义品类 ,通信方式选择 Wi-Fi
- 点击新建的产品后新建自定义功能
这里就是后续开关操作MQTT服务器给你返回的变量 - 点击设备开发选这Topic列表,咱们只需要属性下发与属性上报响应,需要把${deviceName}替换成第6步你的设备名
- 点击侧边栏的设备管理新建设备
- 新建完后点击查看就可以看到设备连接参数为开发板连接MQTT服务器用
- MQTT服务器地址
- ClientId
- Username
- Password
三、准备开发板代码
1.安装驱动
将ESP8266插入到烧录器上然后插入电脑上,然后运行CH341SER.exe
点击安装好了后,打开计算机管理查看端口是否识别到COM3
2、安装依赖
- 打开arduino.exe点击文件->首选项,将网址输入下图框中然后重启
“http://arduino.esp8266.com/stable/package_esp8266com_index.json” - 重启后打开“工具”端口选择“COM3”,选择开发板->开发板管理器
- 打开后搜索“ESP”选择下载“by ESP8266 Community”版本选最新的就行
- 下载完后开发板处选择下载好的开发平台“ESP8266 Boards(3.1.2)”->ESP8266
- 后面就可以开发代码了,开发中如果想引用库,选择"工具"->“管理库”,搜索对应的库就行
- 下面“INSTALLED”标识的是本项目用到的一些库
3、代码开发
3.1、连接WiFi使用WiFiManager自动配网
这里使用WiFiManager自动配网,待程序烧录到esp8266后通电,打开手机WiFi会发现这个esp8266释放的WiFi,连接认证选择自家使用的WiFi名称输入密码后等待一段时间回到手机WiFi界面就是成功了,也可以看串口监听器需要注意的是波特率要选代码一样的波特率,当出现“WiFi Connected!”标识就是连接WiFi成功啦。
// 连接wifi
void connectWifi() {
WiFiManager wifiManager;
wifiManager.resetSettings();
wifiManager.autoConnect("esp8266auth");
Serial.println("WiFi Connected!");
}
3.2、连接mqtt服务器
void connectMQTTServer() {
// 连接MQTT服务器
if (mqttClient.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PASS)) {
Serial.println("MQTT Connected.");
// 订阅指定主题
subscribeTopic();
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
3.3、处理mqtt服务器返回的数据
// 收到信息
void receiveCallback(char* topic, byte* led, unsigned int length) {
// 将payload转换为字符串
String jsonString;
for (int i = 0; i < length; i++) {
jsonString += (char)led[i];
}
// 解析JSON数据
StaticJsonDocument<200> jsonDocument;
DeserializationError error = deserializeJson(jsonDocument, jsonString);
// 检查解析是否成功
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
}
// 获取led的值
int leda = jsonDocument["params"]["led"];
// 打印led的值
Serial.print(F("led: "));
Serial.println(leda);
if (leda == 1) { // 如果收到的信息以“1”为开始
digitalWrite(GPIO, HIGH); // 则点亮LED。
Serial.println("LED ON");
} else if (leda == 0) {
digitalWrite(GPIO, LOW); // 否则熄灭LED。
Serial.println("LED OFF");
}
}
完整代码
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
#include <WiFiManager.h>
#include <ArduinoJson.h>
// mqtt服务器地址,这个是免费公用的服务器
#define MQTT_HOST "MQTT服务器地址"
#define MQTT_PORT 1883
#define MQTT_CLIENT_ID "你自己的ClientId"
#define MQTT_USER "你自己的用户名"
#define MQTT_PASS "你自己的密码"
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
// app弹窗内容一致
String topic = "$thing/down/property/NZPHJ2FT9J/你自己的设备名";
int GPIO = 0;
Ticker ticker;
void setup() {
// 设置串口
Serial.begin(115200);
// 设置内置LED引脚为输出模式
pinMode(GPIO, OUTPUT);
// 连接WiFi
connectWifi();
// 设置MQTT服务器和端口号
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
mqttClient.setCallback(receiveCallback);
// 连接MQTT服务器
connectMQTTServer();
ticker.attach(2, pubMsg);
}
void loop() {
// 开发板成功连接服务器
if (mqttClient.connected()) {
// 保持客户端心跳
mqttClient.loop();
} else {
// 尝试连接服务器
connectMQTTServer();
}
}
void pubMsg(){
if (mqttClient.connected()) {
String msg = "";
if (digitalRead(GPIO)) {
msg = "3";
} else {
msg = "2";
}
char publishTopic[(topic + "_device").length() + 1];
strcpy(publishTopic, (topic + "_device").c_str());
char publishMsg[msg.length() + 1];
strcpy(publishMsg, msg.c_str());
mqttClient.publish(publishTopic, publishMsg);
Serial.println(msg);
}
}
void connectMQTTServer() {
// 连接MQTT服务器
if (mqttClient.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PASS)) {
Serial.println("MQTT Connected.");
// 订阅指定主题
subscribeTopic();
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
// 收到信息
void receiveCallback(char* topic, byte* led, unsigned int length) {
// 将payload转换为字符串
String jsonString;
for (int i = 0; i < length; i++) {
jsonString += (char)led[i];
}
// 解析JSON数据
StaticJsonDocument<200> jsonDocument;
DeserializationError error = deserializeJson(jsonDocument, jsonString);
// 检查解析是否成功
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
}
// 获取led的值
int leda = jsonDocument["params"]["led"];
// 打印led的值
Serial.print(F("led: "));
Serial.println(leda);
if (leda == 1) { // 如果收到的信息以“1”为开始
digitalWrite(GPIO, HIGH); // 则点亮LED。
Serial.println("LED ON");
} else if (leda == 0) {
digitalWrite(GPIO, LOW); // 否则熄灭LED。
Serial.println("LED OFF");
}
}
// 订阅指定主题
void subscribeTopic() {
char subTopic[topic.length() + 1];
strcpy(subTopic, topic.c_str());
// 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
if (mqttClient.subscribe(subTopic)) {
Serial.println("Subscrib Topic:");
Serial.println(subTopic);
} else {
Serial.print("Subscribe Fail...");
}
}
// 连接wifi
void connectWifi() {
WiFiManager wifiManager;
wifiManager.resetSettings();
wifiManager.autoConnect("esp8266auth");
Serial.println("WiFi Connected!");
}
四、准备调试
上述操作完成后打开腾讯云选择“产品中心”->“设备调试”->“二维码”,按照提示进行操作,并打开串口监听器看是否和期望值一样