ESP8266+继电器实现远程控制开关灯



文章目录

  • ESP8266+继电器实现远程控制开关灯
  • 一、前期准备
  • 二、准备MQTT服务器
  • 三、准备开发板代码
  • 1.安装驱动
  • 2、安装依赖
  • 3、代码开发
  • 3.1、连接WiFi使用WiFiManager自动配网
  • 3.2、连接mqtt服务器
  • 3.3、处理mqtt服务器返回的数据
  • 完整代码
  • 四、准备调试
  • 总结



一、前期准备

  • ESP-01S+继电器
  • 烧录器
  • MQTT服务器

二、准备MQTT服务器

这里使用的是腾讯云免费的

  1. 打开腾讯云的网站在云产品选择 物联网开发平台 选项进入后点击 公共实列
  2. esp8266控制led大功率调光 esp8266控制台灯_json


  3. esp8266控制led大功率调光 esp8266控制台灯_json_02

  4. 进入后点击侧边栏的项目列表新建项目
  5. esp8266控制led大功率调光 esp8266控制台灯_开发板_03

  6. 保存后再新建产品选择 自定义品类 ,通信方式选择 Wi-Fi
  7. esp8266控制led大功率调光 esp8266控制台灯_esp8266控制led大功率调光_04

  8. 点击新建的产品后新建自定义功能
    这里就是后续开关操作MQTT服务器给你返回的变量
  9. esp8266控制led大功率调光 esp8266控制台灯_服务器_05


  10. esp8266控制led大功率调光 esp8266控制台灯_服务器_06

  11. 点击设备开发选这Topic列表,咱们只需要属性下发与属性上报响应,需要把${deviceName}替换成第6步你的设备名
  12. esp8266控制led大功率调光 esp8266控制台灯_开发板_07

  13. 点击侧边栏的设备管理新建设备
  14. esp8266控制led大功率调光 esp8266控制台灯_服务器_08

  15. 新建完后点击查看就可以看到设备连接参数为开发板连接MQTT服务器用
  • MQTT服务器地址
  • ClientId
  • Username
  • Password

三、准备开发板代码

1.安装驱动

将ESP8266插入到烧录器上然后插入电脑上,然后运行CH341SER.exe

esp8266控制led大功率调光 esp8266控制台灯_物联网_09

点击安装好了后,打开计算机管理查看端口是否识别到COM3

esp8266控制led大功率调光 esp8266控制台灯_物联网_10

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成功啦。

esp8266控制led大功率调光 esp8266控制台灯_物联网_11


esp8266控制led大功率调光 esp8266控制台灯_json_12

// 连接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!");
}

四、准备调试

上述操作完成后打开腾讯云选择“产品中心”->“设备调试”->“二维码”,按照提示进行操作,并打开串口监听器看是否和期望值一样

esp8266控制led大功率调光 esp8266控制台灯_json_13


esp8266控制led大功率调光 esp8266控制台灯_服务器_14