2025年4月26日 星期六

Wokwi ESP32 DHT22 + Telegram + Node-Red (Chat id取得)

Wokwi ESP32 DHT22 + Telegram + Node-Red










WOKWI程式

#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>

#define DHTPIN 15       // 使用 GPIO15
#define DHTTYPE DHT22   // 如果你使用 DHT11,改成 DHT11

const char* ssid = "Wokwi-GUEST";
const char* password = "";
//const char* mqtt_server = "broker.hivemq.com";

const char* mqtt_server = "broker.mqttgo.io";
///const char* mqtt_server = "broker.hivemq.com";
//onst char* mqtt_server =  "test.mosquitto.org" ;

WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
//=================================
void setup_wifi() {
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
}
//=================================
void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP32Client")) {
      // 成功連線後可以訂閱主題(如需)
    } else {
      delay(5000);
    }
  }
}
//=================================
void setup() {
  Serial.begin(115200);
  dht.begin();
  setup_wifi();
  client.setServer(mqtt_server, 1883);

}
//=================================
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  float temp = dht.readTemperature();
  float hum = dht.readHumidity();
  Serial.print("溫度==>"+ String(temp));
  Serial.println( "濕度==>" + String(hum));
 
  if (!isnan(temp) && !isnan(hum)) {
    String payload = "{\"temperature\":" + String(temp) + ",\"humidity\":" + String(hum) + "}";
    client.publish("alex9ufo/home/sensor", payload.c_str());
  }

  delay(10000);
}
//=================================

Node-Red程式

[{"id":"a5057b39d764b18a","type":"ui_text","z":"9c38be55a5575910","group":"d9711674aaa78a70","order":1,"width":3,"height":1,"name":"溫度","label":"溫度 (°C)","format":"{{msg.payload}}","layout":"row-spread","className":"","x":430,"y":80,"wires":[]},{"id":"3bf577662b4a178b","type":"ui_text","z":"9c38be55a5575910","group":"d9711674aaa78a70","order":3,"width":3,"height":1,"name":"濕度","label":"濕度 (%)","format":"{{msg.payload}}","layout":"row-spread","className":"","x":430,"y":120,"wires":[]},{"id":"7d7417b8fe1a7dba","type":"mqtt in","z":"9c38be55a5575910","name":"MQTT in","topic":"alex9ufo/home/sensor","qos":"0","datatype":"auto-detect","broker":"810a2ad3535ef8a7","nl":false,"rap":true,"rh":0,"inputs":0,"x":80,"y":100,"wires":[["3c000c85da022f92","b58f329c7c85b517","977a1ca608d8c160"]]},{"id":"3c000c85da022f92","type":"function","z":"9c38be55a5575910","name":"function  ","func":"let temp = msg.payload.temperature;\nmsg.payload=temp;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":260,"y":80,"wires":[["a5057b39d764b18a","e5bee21612305efd"]]},{"id":"b58f329c7c85b517","type":"function","z":"9c38be55a5575910","name":"function  ","func":"let hum = msg.payload.humidity;\nmsg.payload=hum;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":260,"y":120,"wires":[["3bf577662b4a178b"]]},{"id":"your_telegram_sender_node_id","type":"telegram sender","z":"9c38be55a5575910","name":"","bot":"342323eb16fbab88","haserroroutput":true,"outputs":2,"x":470,"y":260,"wires":[["84f971f86ed6449d"],[]]},{"id":"5d7776a779c345d8","type":"debug","z":"9c38be55a5575910","name":"debug 347","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":330,"y":200,"wires":[]},{"id":"e5bee21612305efd","type":"debug","z":"9c38be55a5575910","name":"debug 348","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":450,"y":40,"wires":[]},{"id":"cc3d8c97542d7bf0","type":"template","z":"9c38be55a5575910","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"\n{\"chatId\": 7965218469,\n\"type\":\"message\",\n\"content\":\"Wokwi DHT22目前{{payload}}\"}\n","output":"json","x":310,"y":260,"wires":[["your_telegram_sender_node_id"]]},{"id":"977a1ca608d8c160","type":"function","z":"9c38be55a5575910","name":"function  ","func":"var temperature = msg.payload.temperature;\nvar humidity = msg.payload.humidity;\nvar telegramMessage = `感測器數據:\\n溫度: ${temperature} °C\\n濕度: ${humidity} %`;\nmsg.payload = telegramMessage;\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":140,"y":260,"wires":[["cc3d8c97542d7bf0","5d7776a779c345d8"]]},{"id":"84f971f86ed6449d","type":"debug","z":"9c38be55a5575910","name":"debug 349","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":670,"y":260,"wires":[]},{"id":"d9711674aaa78a70","type":"ui_group","name":"感測器資訊","tab":"7ff0c1034122e8bc","order":1,"disp":true,"width":8,"collapse":false},{"id":"810a2ad3535ef8a7","type":"mqtt-broker","name":"broker.mqttgo.io","broker":"broker.mqttgo.io","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"5","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"342323eb16fbab88","type":"telegram bot","botname":"@alex_ncutedu_bot","usernames":"","chatids":"","baseapiurl":"","testenvironment":false,"updatemode":"polling","addressfamily":"4","pollinterval":"300","usesocks":false,"sockshost":"","socksprotocol":"socks5","socksport":"6667","socksusername":"anonymous","sockspassword":"","bothost":"","botpath":"","localbothost":"0.0.0.0","localbotport":"8443","publicbotport":"8443","privatekey":"","certificate":"","useselfsignedcertificate":false,"sslterminated":false,"verboselogging":false},{"id":"7ff0c1034122e8bc","type":"ui_tab","name":"環境監控","icon":"dashboard","order":1}]

新增Bot

取得 Chat id



  • 首先,在瀏覽器中輸入「https://api.telegram.org/botToken/getUpdates」,(紅色字體改為由 @BotFather 給予的 token ,取得 token 則會得到一串的 JSON ,如果得到的是如以下的 JSON ,表示頻道中沒有廣播訊息(好像會以天為單位,前一天就算有廣播訊息,也不會列出)。
{"ok":true,"result":[]}
  • 可先在頻道中輸入「Hello World」,然後再回到前一個步驟,將會得到以下的 JSON:
{"ok":true,"result":[{"update_id":720650387,
"channel_post":{"message_id":22,"chat":{"id":-123456789,"title":"頻道名稱","username":"機器人名稱","type":"channel"},"date":1582014900,"text":"Hello World"}}]}

排序後如下:

{
	"ok":true,
	"result":[
	{
		"update_id":720650387,
		"channel_post":
		{
			"message_id":22,
			"chat":
			{
				"id":-123456789,
				"title":"頻道名稱",
				"username":"機器人名稱",
				"type":"channel"
			},
			"date":1582014900,
			"text":"Hello World"
		}
	}]
}
  • 找到其中的 “chat:” id”:-123456789,就是我們需要的 Chat ID,接著就可以藉著這組 Chat ID ,使用程式來對頻道發送廣播訊息了。
  • 取得 Chat ID 之後,也可以試著在瀏覽器中輸入

  • 「https://api.telegram.org/botToken/sendMessage?chat_id=-123456789&text=Hello World」,紅色字體須改為自己的 token ,以及剛剛取得的 Chat ID ,應該就可以順利在頻道中廣播訊息了。

沒有留言:

張貼留言

8-QAM Signal 4 Phases 2 Amplitudes + 8PSK

 8-QAM Signal 4 Phases 2 Amplitudes + 8PSK import tkinter as tk from tkinter import messagebox import math import cmath # --- 8-QAM 參數設定 ---...