📜  DIY物联网灯开关-任何(1)

📅  最后修改于: 2023-12-03 14:40:45.859000             🧑  作者: Mango

DIY物联网灯开关-任何

本文将介绍如何使用Arduino和物联网技术制作一个可以远程控制的智能灯开关。通过手机APP等任何设备,你都可以轻松控制你家中的灯光。本文将涉及硬件、软件以及云端平台三个部分。

1. 硬件
1.1 材料
  • Arduino板
  • 220V AC负载继电器模块
  • ESP8266 Wi-Fi模块
  • 10K电位器
  • 面包板
  • 杜邦线等其它配件
1.2 硬件连接

请参考下图将硬件连接起来:

```mermaid
graph LR
    A[220V AC负载继电器模块] ---->B[Arduino板]
    C[ESP8266 Wi-Fi模块] ---->B[Arduino板]
    D[10K电位器] ---->B[Arduino板]

### 1.3 细节

在使用220V AC负载继电器模块时,请务必小心。如果不懂得安全操作,可以寻求专业人士的帮助。

## 2. 软件

### 2.1 引用库

需要使用到的平台库有:

- ESP8266WiFi.h
- WiFiClientSecure.h
- PubSubClient.h

### 2.2 代码实现

```markdown
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

#define wifi_ssid "WiFi名称"
#define wifi_password "WiFi密码"

// 云端平台信息
#define platform_server "平台服务器地址"
#define platform_port 8883
#define platform_username "平台用户名"
#define platform_password "平台密码"
#define platform_client_id "客户端ID"

#define relay_pin 4
#define analog_pin A0

char platform_topic[50] = "频道名称"; // 频道名称

WiFiClientSecure espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(9600);
  pinMode(relay_pin, OUTPUT);
  digitalWrite(relay_pin, HIGH); // 关闭继电器
  WiFi.begin(wifi_ssid, wifi_password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
  espClient.setInsecure();
  client.setServer(platform_server, platform_port);
  client.setCallback(callback);
  while (!client.connected()) {
    if (client.connect(platform_client_id, platform_username, platform_password)) {
      Serial.println("Connected to cloud platform.");
      client.subscribe(platform_topic);
    } else {
      Serial.println("Connection failed, rc=");
      Serial.print(client.state());
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  int analog_value = analogRead(analog_pin);
  if (analog_value < 500) {
    digitalWrite(relay_pin, LOW);
    client.publish(platform_topic, "1");
    Serial.println("Light is turned on.");
  } else {
    digitalWrite(relay_pin, HIGH);
    client.publish(platform_topic, "0");
    Serial.println("Light is turned off.");
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  char message[length + 1];
  for (int i = 0; i < length; i++) {
    message[i] = (char)payload[i];
  }
  message[length] = '\0';
  Serial.print("Payload: ");
  Serial.println(message);
  if (strcmp(message, "on") == 0) {
    digitalWrite(relay_pin, LOW);
  } else {
    digitalWrite(relay_pin, HIGH);
  }
}

void reconnect() {
  while (!client.connected()) {
    Serial.println("Attempting MQTT connection...");
    if (client.connect(platform_client_id, platform_username, platform_password)) {
      Serial.println("Connected to cloud platform.");
      client.subscribe(platform_topic);
    } else {
      Serial.print("Connection failed, rc= ");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}
3. 云端平台
3.1 平台选择

在实现物联网设备控制前,需要先选择搭建平台。目前国内外已经有很多提供物联网平台服务的供应商,例如阿里云、腾讯云、华为云、AWS、Google Cloud等等。这些供应商提供了完备的云端服务,包括云服务器、物联网设备接口、数据存储、消息通知等等。在选择时,需根据实际需求和经济承受能力进行选择。

3.2 平台接口

本示例中使用的是MQTT协议。MQTT是一个基于发布/订阅机制的协议,具备实时性高、开发维护成本低、易于扩展等优势。

总结

在本文中,我们学习了如何使用Arduino和物联网技术制作一个可以远程控制的智能灯开关。通过云端平台,你可以在任何时间、任何地点轻松控制你家中的灯光。在实现前,需要先选好平台、确认控制方式,并根据实际需求进行硬件连接和代码编写。