物联网(ESP8266)控制开关灯光的实际方案和相关源码

文章介绍了一个使用ESP8266开发板和MQTT协议控制智能灯泡开关的物联网方案。通过ArduinoIDE编写代码,连接WiFi和MQTT服务器,实现了通过网络接收和发送灯光控制指令。系统还包含NTP时间同步和安全认证功能,确保系统的稳定性和安全性。
摘要由CSDN通过智能技术生成

一个物联网控制开关灯光的实际方案是使用一款支持物联网协议的智能灯泡,并将其与互联网相连,通过互联网来控制灯光开关。以下是一个基于ESP8266开发板和MQTT协议的物联网控制开关灯光的相关源码。

首先,你需要安装Arduino IDE,并在库管理器中安装以下库:PubSubClient、WiFiManager、NTPClient、ArduinoJson。

然后,复制以下代码到Arduino IDE中并上传到ESP8266开发板:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <WiFiManager.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <ArduinoJson.h>

// WiFi信息
char mqtt_server[40];
char mqtt_port[6];
char mqtt_topic[80];
char mqtt_user[40];
char mqtt_password[40];

// WiFi客户端
WiFiClient wifiClient;

// MQTT客户端
PubSubClient mqttClient(wifiClient);

// NTP客户端
WiFiUDP udp;
NTPClient ntpClient(udp);

// 控制灯光的变量
bool lightOn = false;

// LED灯光引脚
int ledPin = D1;

// 回调函数,当MQTT客户端接收到消息时调用
void callback(char* topic, byte* payload, unsigned int length) {
  // 将接收到的JSON格式消息解析
  DynamicJsonDocument doc(1024);
  deserializeJson(doc, payload, length);

  if (doc.containsKey("light")) {
    // 解析JSON中的“light”字段
    bool isLightOn = doc["light"];

    if (isLightOn) {
      // 打开灯光
      digitalWrite(ledPin, HIGH);
      lightOn = true;
    } else {
      // 关闭灯光
      digitalWrite(ledPin, LOW);
      lightOn = false;
    }
  }
}

// 连接WiFi
void connectWiFi() {
  WiFiManager wifiManager;
  wifiManager.autoConnect("ESP8266");

  Serial.println("Connected to WiFi.");
}

// 连接MQTT服务器
void connectMQTT() {
  while (!mqttClient.connected()) {
    Serial.println("Connecting to MQTT server...");

    if (mqttClient.connect("ESP8266", mqtt_user, mqtt_password)) {
      Serial.println("Connected to MQTT server.");

      // 订阅主题
      mqttClient.subscribe(mqtt_topic);
    } else {
      Serial.print("MQTT connection failed: ");
      Serial.println(mqttClient.state());
      delay(5000);
    }
  }
}

// 更新NTP时间
void updateNTP() {
  ntpClient.update();
}

// 发送传感器数据到MQTT服务器
void sendSensorData() {
  DynamicJsonDocument doc(1024);
  doc["light"] = lightOn;

  char payload[1024];
  serializeJson(doc, payload);

  mqttClient.publish(mqtt_topic, payload);
}

// 主程序
void setup() {
  // 初始化串口
  Serial.begin(115200);

  // 初始化LED灯光
  pinMode(ledPin, OUTPUT);

  // 加载存储的配置信息
  WiFiManager wifiManager;
  wifiManager.autoConnect("ESP8266");
  strcpy(mqtt_server, wifiManager.getCustomParameter("mqtt_server").c_str());
  strcpy(mqtt_port, wifiManager.getCustomParameter("mqtt_port").c_str());
  strcpy(mqtt_topic, wifiManager.getCustomParameter("mqtt_topic").c_str());
  strcpy(mqtt_user, wifiManager.getCustomParameter("mqtt_user").c_str());
  strcpy(mqtt_password, wifiManager.getCustomParameter("mqtt_password").c_str());

  // 初始化WiFi客户端
  WiFi.begin();
  connectWiFi();

  // 初始化MQTT客户端
  mqttClient.setServer(mqtt_server, atoi(mqtt_port));
  mqttClient.setCallback(callback);

  // 初始化NTP客户端
  ntpClient.begin();
  ntpClient.setTimeOffset(28800);

  // 打印网络信息
  Serial.println("");
  Serial.println("WiFi information:");
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("");

  Serial.println("MQTT information:");
  Serial.print("Server: ");
  Serial.print(mqtt_server);
Serial.print(":");
Serial.println(mqtt_port);
Serial.print("Topic: ");
Serial.println(mqtt_topic);
Serial.print(“User: “);
Serial.println(mqtt_user);
Serial.println(””);

// 等待WiFi连接,并且更新NTP时间
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
updateNTP();
}

void loop() {
// 连接MQTT服务器
if (!mqttClient.connected()) {
connectMQTT();
}

// 处理MQTT消息
mqttClient.loop();

// 更新NTP时间
if (ntpClient.update()) {
sendSensorData();
}
}


 

在上传代码之前,你需要替换WiFi信息、MQTT服务器信息和LED引脚等参数。上传完毕后,你可以使用MQTT客户端发送控制指令,例如:

- 主题:mqtt_topic
- 消息:{"light":true}
- 描述:打开灯光

或者:

- 主题:mqtt_topic
- 消息:{"light":false}
- 描述:关闭灯光

代码中会监听MQTT主题,收到相应的消息后改变LED灯光的状态。同时,程序还会定时更新NTP时间,每更新一次就会将当前灯光状态发送到MQTT服务器。

值得注意的是,以上代码仅为示例代码,你需要根据实际情况进行修改。例如,需要根据实际的灯光控制器或智能灯泡来修改代码中的LED引脚。同时,程序中使用了WiFiManager库来自动连接WiFi和配置MQTT服务器信息,你可以根据需要使用其他方式来实现自动连接WiFi和配置MQTT服务器信息。

另外,为了保障用户数据的安全性,建议在MQTT服务器上设置安全认证,例如用户名和密码。如果你的MQTT服务器没有设置安全认证,那么相关信息可能会被非法获取或篡改。在代码中,需要替换相应的mqtt_user和mqtt_password参数,以便连接到安全认证的MQTT服务器。

最后,总结一下物联网控制开关灯光的实际方案和相关源码:

方案:

  1. 使用智能灯泡并将其连接到互联网,通过互联网来控制灯光开关。
  2. 基于ESP8266开发板和MQTT协议,使用WiFi连接到互联网,通过MQTT协议与智能灯泡通信,从而实现开关灯光的控制。

相关源码:

  1. 配置WiFi信息、MQTT服务器信息和LED引脚等参数。
  2. 连接WiFi并启动MQTT客户端。
  3. 接收MQTT消息,并解析JSON格式的灯光开关指令。
  4. 根据指令控制LED灯光的状态,并将当前状态通过MQTT协议发送到服务器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥物联网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值