1-🌟引言:为什么选择“无硬件”学习物联网?

专注于物联网的“软”核心,理解数据的流动、处理和可视化。

2-技术栈

  1. thinkspeak :作为数据接收、存储和可视化平台。
  2. python:用于数据生成和api调用。
  3. 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-挑战与收获

  1. 数据点过多导致图表混乱
    在 MATLAB Visualization 中使用 ‘DateRange’ 过滤时间。
  2. 时区混乱 UTC vs 北京时间
    明确指定时区:localTimeNow = datetime('now', 'TimeZone', 'Asia/Shanghai');

7-未来扩展

添加数据异常检测(如温度突变)。
用 MATLAB Analysis 实现预测模型。

更多推荐