JKHome系列——智能家居实践记(四)·用ESP8266+MQTT实现一个智能温湿度计

JiaoKan 发布于 2023-11-01 14 次阅读


前言

上一篇文章和这一篇文章,分别简单给出了一个设备如何接收并处理更新,以及如何发送更新信息,这样,我们就可以在后续自行实现各种有意思的东西了.

程序部分

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

// Enable SSL?
#define SSLEnable

// Hareware configuration
#define dht11Pin 2
dht11 DHT11;

// 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/sensor/dht11/humidity",
                        "prc/shanghai/wanpingnan rd./no.600/sensor/dht11/temperature"};
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 update();

void setup()
{
    // Hareware setup
    pinMode(dht11Pin, INPUT);
    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);
}

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[0], mqttUsername, mqttPassword))
        {
            Serial.println("[MQTT] Connected");
            for (int i = 0; i < sizeof(mqttID) / sizeof(mqttID[0]); i++)
                mqttClient.subscribe(mqttID[i]);
        }
        else
            delay(5000);
    }
    update();
    delay(2000);
    mqttClient.loop();
}

void update()
{
    DHT11.read(dht11Pin);
    char humidity[10], temperature[10];
    sprintf(humidity, "%f", DHT11.humidity), sprintf(temperature, "%f", DHT11.temperature);
    mqttClient.publish(mqttID[0], humidity);
    mqttClient.publish(mqttID[1], temperature);
}
此作者没有提供个人介绍。
最后更新于 2024-03-11