#include "WiFi.h"
#include <HTTPClient.h>
#include <PubSubClient.h>
#include "DHTesp.h" // 匯入模組
String ip;
// WiFi信息
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT代理信息
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
char clientId[50];
// 訂閱的主题
const char* topic = "test/dht22";
// WiFi 客户端
WiFiClient espClient;
// MQTT 客户端
PubSubClient client(espClient);
DHTesp dhtSensor; // 建立 dhtSensor 物件
const int ledPin = 4;
const int DHT_PIN = 15;
// WiFi 連線
void WiFi_connect(){
Serial.println("Initializing WiFi...");
WiFi.mode(WIFI_STA);
WiFi.disconnect(); // 無線初始化
Serial.println("Connecting to WiFi ");
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("");
Serial.println("WiFi connected");
ip = WiFi.localIP().toString(); // 取得分配到的 IP 位址
Serial.println("IP address: " + ip);
// 顯示 MAC 位址
Serial.println("MAC address: " + WiFi.macAddress());
}
// 當接收到訊息時執行的回調函数
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
// 顯示收到的訊息
Serial.print((char)payload[i]);
}
Serial.println();
}
// MQTT連線回调函数
void mqttReconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (client.connect(clientId)) {
Serial.print(clientId);
Serial.println(" connected");
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
randomSeed(analogRead(0));
int LED_BUILTIN = 2;
pinMode(LED_BUILTIN, OUTPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(ledPin, LOW);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
WiFi_connect();
// 設置客户端連線到的 MQTT 代理的服務器和端口
client.setServer(mqtt_server, mqtt_port);
// 設定當接收到 MQTT 訊息時執行的調函数
client.setCallback(callback);
// 判定 mqtt 連線是否成功
if (!client.connected()) {
mqttReconnect(); // 執行 mqtt 重連調用函數
}
//client.subscribe(topic); // 訂閱主題
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
// mqtt 連線
if (!client.connected()) {
mqttReconnect(); // 執行 mqtt 重連調用函數
}
client.loop(); // 循環執行
// 發布一條 MQTT 訊息
client.publish(topic, (String(data.temperature, 2)+ "°C").c_str());
client.publish(topic, (String(data.humidity, 1)+ "%").c_str());
delay(5000);
}