JKHome系列——智能家居实践记(三)·用ESP8266+MQTT实现一个智能小灯

JiaoKan 发布于 2023-10-31 10 次阅读


ESP8266是啥?

你可以先搜索一下Arduino,在这里我们不妨极其粗糙地下个定义——ESP8266=国产+炒鸡便宜+带WiFi+常见的Arduino板子.我们在这里只需要知道这些就好.

不过,强烈建议简单自学一下Arduino之后,掌握基本的技能之后再回来阅读下面的部分,之后的文章默认读者已经掌握一定的Arduino编程知识.

让你的Arduino可以给ESP8266编程

默认状态下的Arduino IDE,或者是集成在VSCode等IDE中的Arduino只支持Arduino官方推出的UNO,Nano等开发版,我们需要让IDE支持给ESP8266系列的单片机编程,读者们可以参考ESP官方GitHub的Arduino页面.

核心主要是这两句:

  • 输入 https://arduino.esp8266.com/stable/package_esp8266com_index.json 到 the File>Preferences>Additional Boards Manager URLs.
  • 打开 Boards Manager from Tools > Board menu 然后安装 esp8266 platform (然后别忘了选上新安装的开发版,多说一句,看清楚自己购买的ESP8266开发版型号,后续以ESP-01为例).

程序部分

直接上代码,有注释,建议从头到尾通读一遍:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Enable SSL?
#define SSLEnable

// Hareware configuration
#define onoffPin 2

// WiFi and MQTT Server configuraton
const char *ssid = "ssid";
const char *password = "password";
const char *mqttDomain = "mqtt.example.com";
const unsigned short mqttPort = 8883;
const char *mqttID = "prc/shanghai/wanpingnan rd./no.600/lighting/onoff";
const char *mqttUsername = "admin";
const char *mqttPassword = "public";
const char *fingerprint = "45 45 07 21 11 45 14 19 19 08 10";// Sha-1 of the Certificate (Not CA Cert)

#ifdef SSLEnable
WiFiClientSecure wifiClient;
#else
WiFiClient wifiClient;
#endif
PubSubClient mqttClient(wifiClient);

void callback(char *topic, byte *_payload, unsigned int length);

void setup()
{
    // Hareware setup
    pinMode(onoffPin, OUTPUT);
    Serial.begin(115200);
    Serial.println("");

    // WiFi setup
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
#ifdef SSLEnable
    while (!wifiClient.setFingerprint(fingerprint))
    {
        Serial.println("[WiFi] SSL Fatal Error...");
        delay(5000);
    }
#endif
    Serial.print("[WiFi] Connecting WiFi...");
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }
    Serial.println();
    Serial.println("[WiFi] WiFi connected");
    Serial.println("[WiFi] IP address: " + WiFi.localIP().toString());
    WiFi.setAutoConnect(true);
    WiFi.setAutoReconnect(true);

    // MQTT setup
    mqttClient.setServer(mqttDomain, mqttPort);
    mqttClient.setCallback(callback);
}

void loop()
{
    // MQTT loop
    while (!mqttClient.connected())
    {
        Serial.println("[MQTT] Not connected to MQTT server! Establishing connection... | State: " + String(mqttClient.state()));
        if (mqttClient.connect(mqttID, mqttUsername, mqttPassword))
        {
            Serial.println("[MQTT] Connected");
            mqttClient.subscribe(mqttID);
        }
        else
            delay(5000);
    }
    mqttClient.loop();
}

void callback(char *topic, byte *_payload, unsigned int length)
{
    // Print the message and translate the payload
    String payload = "";
    for (int i = 0; i < length; i++)
        payload += (char)_payload[i];
    Serial.println("[MQTT] Message arrived - Topic:" + String(topic) + "   Payload:" + payload);

    // Cope with the message
    if (payload == "on")
        digitalWrite(onoffPin, HIGH);
    else
        digitalWrite(onoffPin, LOW);
}

用你的客户端试试,是不是小灯跟着你的远程指令闪烁起来了?

此作者没有提供个人介绍。
最后更新于 2024-03-11