无硬件学习物联网。用 Python + ThingSpeak 打造实时温湿度监控系统
·
1-🌟引言:为什么选择“无硬件”学习物联网?
专注于物联网的“软”核心,理解数据的流动、处理和可视化。
2-技术栈
- thinkspeak :作为数据接收、存储和可视化平台。
- python:用于数据生成和api调用。
- MATLAB:在云端执行数据分析和绘图(ThingSpeak 内置)。
3-Python 脚本:模拟与上传数据
数据模拟逻辑:昼夜温度模型+温度随机扰动+湿度联动限幅。
import requests
import time
from datetime import datetime
import math
import random
WRITE_API_KEY = 'xxx'(换成自己的)
URL = 'https://api.thingspeak.com/update'
def generate_sensor_data():
hour=datetime.now().hour
# 通过正弦函数,让温度在一天中自然波动
base_temp=20+10*math.sin((hour-6)*2*3.1416/24)
temperature=base_temp+random.uniform(-2,2)
# 湿度随温度升高而降低(符合物理规律)
humidity = 60 -(temperature - 20)*1.5+random.uniform(-5,5)
# 使用 max/min 限幅,确保湿度在合理范围(20%-90%),避免出现 120% 这种荒谬值
humidity = max(20,min(90,humidity))
return temperature,humidity
try:
while True:
temp,humi=generate_sensor_data()
print(f"发送数据:温度={temp:.2f}°C,适度={humi:.2f}%")
response = requests.post(URL, params={
'api_key': WRITE_API_KEY,
'field1':temp,
'field2':humi
})
if response.status_code == 200:
print('数据发送成功')
else:
print(f'数据发送失败: {response.text}')
# 每15秒发送一次数据
time.sleep(15)
# 完善的异常处理
except KeyboardInterrupt:
# 当用户按下 Ctrl+C 时,会执行这里的代码
print("\n\n程序已停止。感谢使用!") # \n 是换行符,让提示更清晰
# 在这里可以添加其他清理代码,比如:
# close_database_connection()
# save_last_state()
# 捕获网络中断、API密钥错误等意外,程序不会直接崩溃
except Exception as e:
# 捕获其他可能的错误(如网络问题)
print(f"程序出现意外错误: {e}")
# 程序结束
print("再见!")
4-thinkspeak频道配置
字段分配:
- field1:模拟温度
- field2:模拟湿度

5-数据可视化
首先创建一个图表(图1为入口)。
我设置的图表是读取24小时内的数据并统计(效果如图2)。

matlab code如下:
% --- 配置 ---
readChannelID = xxx; % 你的频道ID
temperatureFieldID = 1; % 温度字段
humidityFieldID = 2; % 湿度字段
readAPIKey = 'xxx'; % 你的读取密钥(如果频道是私有的)
% --- 1. 读取最近24小时的数据 ---
% 使用 'DateRange' 参数来限制时间范围,避免数据过多
localTimeNow = datetime('now','TimeZone','Asia/Shanghai');
endTime = localTimeNow; % 到现在为止
startTime = localTimeNow - day(1); % 从24小时前开始
[data, timeStamps] = thingSpeakRead(readChannelID, ...
'Fields', [temperatureFieldID, humidityFieldID], ...
'DateRange', [startTime endTime], ...
'OutputFormat', 'matrix', ...
'ReadKey', readAPIKey); % 如果频道公开,可省略此行
% --- 新增:打印调试信息 ---
disp(['请求的时间范围: ', datestr(startTime), ' 到 ', datestr(endTime)]);
% --- 2. 检查数据 ---
if isempty(data)
error('未能读取到数据。请检查频道ID、字段和API密钥。');
end
% --- 3. 创建双Y轴图表 ---
figure; % 创建一个新的图形窗口
yyaxis left % 左侧Y轴
plot(timeStamps, data(:,1), '-o', 'DisplayName', '温度 (°C)');
ylabel('温度 (°C)');
ylim([20 35]); % 根据你的数据调整Y轴范围
yyaxis right % 右侧Y轴
plot(timeStamps, data(:,2), '-s', 'DisplayName', '湿度 (%)');
ylabel('湿度 (%)');
ylim([30 70]); % 根据你的数据调整Y轴范围
% --- 4. 完善图表 ---
title('温湿度监测 - 最近24小时');
xlabel('时间');
grid on;
legend('show'); % 显示图例
% --- 5. (可选) 保存图表 ---
% 如果你想自动保存图表到文件,可以取消注释下面这行
% saveas(gcf, 'temperature_humidity_last24h.png');
6-挑战与收获
- 数据点过多导致图表混乱
在 MATLAB Visualization 中使用 ‘DateRange’ 过滤时间。 - 时区混乱 UTC vs 北京时间
明确指定时区:localTimeNow = datetime('now', 'TimeZone', 'Asia/Shanghai');
7-未来扩展
添加数据异常检测(如温度突变)。
用 MATLAB Analysis 实现预测模型。
更多推荐

所有评论(0)