# 如何用Python自制微信遠程智能溫濕度計

## 前言
在物聯網和智能家居蓬勃發展的今天,遠程環境監測已成為許多人的需求。本文將手把手教你用Python語言,結合常見硬件和微信平臺,打造一個低成本、高可用的遠程溫濕度監測系統。這個項目不僅適合DIY愛好者,也是學習物聯網開發的絕佳入門案例。
---
## 一、項目概述
### 1.1 核心功能
- 實時采集環境溫濕度數據
- 通過微信遠程查詢當前數據
- 異常數值自動預警推送
- 歷史數據存儲與可視化
### 1.2 技術棧組成
| 組件 | 技術選型 |
|-------|----------|
| 硬件 | DHT22傳感器 + Raspberry Pi |
| 通信 | HTTP協議 + 微信公眾平臺 |
| 后端 | Flask框架 + SQLite數據庫 |
| 可視化 | Matplotlib/Pyecharts |
---
## 二、硬件準備與連接
### 2.1 所需材料清單
- 樹莓派(任一型號,推薦Pi 4B)
- DHT22溫濕度傳感器(約$5)
- 10KΩ電阻
- 面包板及杜邦線若干
- 可選:防水外殼
### 2.2 電路連接示意圖
```python
# 接線示意圖(GPIO模式)
DHT22 VCC -> Pi 3.3V (Pin 1)
DHT22 DATA -> GPIO4 (Pin 7)
DHT22 GND -> GND (Pin 6)
└─ 10KΩ上拉電阻
import Adafruit_DHT
sensor = Adafruit_DHT.DHT22
pin = 4
def read_sensor():
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
return round(temperature, 1), round(humidity, 1)
return None, None
sequenceDiagram
用戶->>微信服務器: 發送查詢指令
微信服務器->>我們的服務器: POST XML消息
我們的服務器->>傳感器: 讀取數據
傳感器-->>我們的服務器: 返回數據
我們的服務器->>微信服務器: 回復XML
微信服務器->>用戶: 顯示溫濕度信息
from flask import Flask, request
import hashlib
app = Flask(__name__)
WECHAT_TOKEN = "your_token"
@app.route('/wechat', methods=['GET','POST'])
def wechat():
if request.method == 'GET':
# 驗證簽名
signature = request.args.get('signature')
timestamp = request.args.get('timestamp')
nonce = request.args.get('nonce')
echostr = request.args.get('echostr')
tmp_list = sorted([WECHAT_TOKEN, timestamp, nonce])
tmp_str = hashlib.sha1("".join(tmp_list).encode()).hexdigest()
if tmp_str == signature:
return echostr
return "驗證失敗"
else:
# 處理用戶消息
xml_data = request.data
# 解析XML并返回響應...
CREATE TABLE sensor_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
temperature REAL NOT NULL,
humidity REAL NOT NULL,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);
import sqlite3
from datetime import datetime
def save_to_db(temp, humi):
conn = sqlite3.connect('sensor.db')
c = conn.cursor()
c.execute("INSERT INTO sensor_data (temperature, humidity) VALUES (?,?)",
(temp, humi))
conn.commit()
conn.close()
def check_abnormal(temp, humi):
alert = ""
if temp > 30:
alert += "高溫警告!"
elif temp < 10:
alert += "低溫警告!"
if humi > 80:
alert += "濕度過高!"
return alert
import schedule
import time
def job():
temp, humi = read_sensor()
alert = check_abnormal(temp, humi)
if alert:
send_wechat_msg(alert)
schedule.every(1).hours.do(job)
while True:
schedule.run_pending()
time.sleep(1)
import matplotlib.pyplot as plt
import pandas as pd
def generate_chart():
df = pd.read_sql("SELECT * FROM sensor_data", conn)
plt.figure(figsize=(10,5))
plt.plot(df['timestamp'], df['temperature'], label='溫度')
plt.plot(df['timestamp'], df['humidity'], label='濕度')
plt.savefig('trend.png')
user_states = {} # 保存用戶會話狀態
@app.route('/wechat', methods=['POST'])
def handle_msg():
from_user = xml_data.find('FromUserName').text
if from_user not in user_states:
user_states[from_user] = {'last_cmd': None}
# 根據狀態機處理不同指令...
創建/etc/systemd/system/sensor.service
:
[Unit]
Description=Temperature Monitor
[Service]
ExecStart=/usr/bin/python3 /home/pi/app/main.py
Restart=always
[Install]
WantedBy=multi-user.target
# 監控內存使用
watch -n 1 free -m
# 查看網絡連接
sudo netstat -tulnp
通過本項目,我們實現了: ? 硬件數據采集 ? 微信遠程交互 ? 數據持久化存儲 ? 異常狀態預警
升級方向建議: - 增加多傳感器支持 - 開發小程序控制界面 - 接入第三方天氣API對比數據
完整項目代碼已開源在GitHub:項目地址
注意事項: 1. DHT22需避免結露環境 2. 微信公眾號API有調用頻率限制 3. 長期運行建議使用UPS電源
希望這個項目能幫助你開啟物聯網開發的大門!如有任何問題,歡迎在評論區交流。 “`
注:實際部署時請根據具體硬件型號調整代碼,本文示例基于Raspberry Pi 4B + DHT22傳感器組合。微信接口部分需要替換真實的Token和API密鑰。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。