1. 项目概述从零构建一个云端气象站几年前当我第一次尝试把家里的温湿度数据记录到电脑上时用的还是串口线连着Arduino每隔几小时手动打开串口监视器抄录数据。麻烦不说数据还散落在各个文本文件里想做个趋势分析都无从下手。后来接触到物联网的概念才意识到问题的核心在于“连接”与“自动化”。今天要分享的这个项目就是我当时探索路径上的一个里程碑一个能自动将环境数据上传到云端表格的智能气象站。这个项目的核心价值在于它完整地演示了如何将一个传统的电子制作项目升级为一个真正的物联网节点。你不再需要守在设备旁边数据会自己“跑”到网上你可以在任何有网络的地方用浏览器打开一个熟悉的Google表格实时查看家里的温度、湿度、气压和光照变化甚至还能设置简单的图表。这对于想入门物联网开发、学习传感器数据上云的朋友来说是一个绝佳的练手项目。无论你是电子爱好者、创客还是相关专业的学生都能通过这个项目清晰地理解从物理信号感知、微控制器处理、到云端数据落地的完整链条。2. 硬件选型与连接方案解析2.1 核心控制器为什么是Arduino Yun在项目硬件清单里最核心也最特别的部件就是Arduino Yun开发板。市面上Arduino板子那么多为何偏偏选它这得从物联网设备的两大核心任务说起一是实时采集并处理传感器数据嵌入式端的工作二是与互联网服务进行稳定通信网络端的工作。传统的Arduino Uno搭配WiFi扩展板如ESP8266是一种方案但你需要自己处理网络协议栈、重连逻辑等代码复杂度不低。Arduino Yun的巧妙之处在于其“双核”架构一块是经典的ATmega32U4微控制器负责运行你的Arduino Sketch与传感器直接对话另一块是运行OpenWrt Linux系统的Atheros AR9331处理器自带WiFi模块。两块芯片通过一个名为“Bridge”的库进行通信。这意味着你可以用熟悉的Arduino IDE编写传感器读取逻辑而将复杂的HTTP请求、JSON解析等网络操作交给背后更强大的Linux系统去处理。这种分工让开发变得异常简洁尤其适合需要与各种Web API比如我们后面用到的Google Sheets API打交道的场景。虽然Yun已不是最新型号但其设计理念对于理解物联网设备架构非常有帮助。2.2 传感器阵列环境数据的“五官”一个气象站需要感知多种环境参数我们选择了最常用、也最容易获取的三种传感器来搭建这个“五官”系统。首先是DHT11温湿度传感器。它是一个数字传感器通过单总线协议通信只需要一个GPIO引脚就能同时读取温度和湿度。它的优点是价格极其低廉接线简单。但需要注意其测量精度相对一般温度±2°C湿度±5%RH响应速度也较慢。对于要求不高的室内环境监测它完全够用。如果你追求更高精度可以升级到DHT22或SHT31等型号但代码和库需要相应调整。其次是BMP085/BMP180气压温度传感器。这是一个基于I2C通信的数字传感器。我选择它有两个主要原因一是它可以提供高精度的气压数据这对于观测天气变化如气压骤降可能预示降雨很有意义二是它同时也能提供一份温度数据可以与DHT11的读数进行交叉比对提高可靠性。BMP180是BMP085的升级版引脚和库完全兼容购买时选哪个都可以。它们都需要连接I2C总线即SCL和SDA引脚。最后是光敏电阻Photocell。这是一个模拟传感器其电阻值随光照强度变化。我们通过一个简单的分压电路将其连接到模拟输入引脚将电阻值变化转化为0-1023的模拟读数。它成本极低虽然不能提供勒克斯Lux这样的绝对光强单位但用于判断“白天/黑夜”或光照相对强弱变化比如监测植物是否获得足够光照非常有效。注意DHT11和光敏电阻都是对电源噪声比较敏感的器件。务必确保你的5V电源稳定并在面包板电源轨上并联一个100uF以上的电解电容可以显著减少读数跳变。2.3 电路连接实战与原理剖析接线图看起来简单但每一步背后都有其道理。让我们拆解一下1. 电源与地线Power GND这是所有电路的基石。将Yun板的5V和GND引脚分别连接到面包板的红色正极和蓝色负极电源轨。这样做的好处是所有传感器都可以就近从电源轨取电避免了“飞线”杂乱也减少了因长导线引入的电压降和噪声。2. DHT11连接VCCPin 1 - 5V红轨供电。GNDPin 4 - GND蓝轨接地。DATAPin 2 - Yun Digital Pin 8数据线。这里选择数字引脚8是随意的你完全可以根据布线方便选择其他数字引脚只需在代码中同步修改DHTPIN的定义即可。4.7kΩ上拉电阻接在VCC和DATA之间这是关键DHT11的数据线是开漏输出意味着它只能主动将线路拉低输出0而要输出高电平1时需要外部电路将电压拉上去。这个4.7kΩ电阻就是起到“上拉”的作用确保在传感器不主动拉低线路时数据线能稳定在高电平保证通信的可靠性。3. 光敏电阻连接这是一个经典的分压电路。光敏电阻和一颗10kΩ的定值电阻串联在5V和GND之间。两者的连接点即分压点引出连接到Yun的模拟引脚A0。工作原理光照越强光敏电阻值越小可低至几千欧姆它在串联电路中的分压就越小A0测得的电压值就越低模拟读数接近0。反之黑暗时光敏电阻值很大可达兆欧级分压变大A0读数接近1023。通过这个模拟值的变化我们就能反推光照的相对强度。4. BMP180连接VIN - 5V红轨GND - GND蓝轨SCL - Yun Digital Pin 3在Arduino Yun上数字引脚3兼任I2C时钟线SCL。SDA - Yun Digital Pin 2数字引脚2兼任I2C数据线SDA。I2C总线是共享总线理论上可以挂载多个设备每个设备有唯一地址。BMP180的默认地址是0x77库函数会自动扫描并初始化。连接完毕后强烈建议先不要急着上云而是用下一节的测试代码验证每个传感器是否工作正常。这能帮你快速定位是接线错误、传感器损坏还是库安装问题。3. 软件环境配置与本地测试3.1 开发环境与核心库安装工欲善其事必先利其器。软件准备是第一步。你需要安装最新版本的Arduino IDE。虽然原文提到当时是Beta版但现在直接去Arduino官网下载稳定版即可。安装后还需要安装三个关键的库文件它们封装了与传感器通信的复杂协议让我们用几行代码就能轻松读数。DHT Sensor Library这是由Adafruit维护的DHT系列传感器通用库。它统一了DHT11、DHT22等型号的接口。Adafruit BMP085/BMP180 Library用于操作BMP085/180气压传感器的专用库。Adafruit Unified Sensor Driver这是一个“驱动抽象层”库。上面BMP180的库依赖于它。它提供了一套标准的传感器数据结构和接口让上层应用比如BMP180库的代码更统一。安装库的方法很简单在Arduino IDE中点击“项目” - “加载库” - “管理库...”打开库管理器。在搜索框中分别输入“DHT sensor”、“Adafruit BMP180”和“Adafruit Unified Sensor”找到后点击安装即可。这是最推荐的方式能自动处理依赖关系。3.2 传感器本地测试代码解读在连接云端之前我们必须确保硬件和基础代码在本地是正常的。下面这个测试脚本就是我们的“硬件体检工具”。#include DHT.h #include Wire.h #include Adafruit_Sensor.h #include Adafruit_BMP085_U.h // 1. 定义DHT引脚和类型 #define DHTPIN 8 #define DHTTYPE DHT11 // 2. 创建传感器对象实例 DHT dht(DHTPIN, DHTTYPE); Adafruit_BMP085_Unified bmp Adafruit_BMP085_Unified(10085); void setup() { Serial.begin(9600); // 初始化串口通信 Serial.println(气象站传感器测试开始...); dht.begin(); // 初始化DHT传感器 if (!bmp.begin()) { // 初始化BMP传感器并检查是否成功 Serial.println(未检测到BMP180传感器请检查接线); while (1); // 停止执行 } } void loop() { delay(2000); // 等待2秒DHT11读取需要约2秒间隔 // 3. 读取DHT11的湿度与温度 float humidity dht.readHumidity(); float temperature_dht dht.readTemperature(); // 摄氏度 // 检查DHT读数是否有效 if (isnan(humidity) || isnan(temperature_dht)) { Serial.println(读取DHT11失败); return; } // 4. 读取光敏电阻模拟值 int lightLevel analogRead(A0); // 5. 读取BMP180的气压和温度 sensors_event_t event; bmp.getEvent(event); float pressure event.pressure; // 单位百帕hPa float temperature_bmp, altitude; bmp.getTemperature(temperature_bmp); // BMP180自带的温度读数 // 6. 计算近似海拔可选基于标准海平面气压 float seaLevelPressure 1013.25; // 标准海平面气压hPa altitude bmp.pressureToAltitude(seaLevelPressure, event.pressure); // 7. 打印所有数据到串口监视器 Serial.print(湿度: ); Serial.print(humidity); Serial.println( %); Serial.print(温度(DHT11): ); Serial.print(temperature_dht); Serial.println( °C); Serial.print(温度(BMP180): ); Serial.print(temperature_bmp); Serial.println( °C); Serial.print(气压: ); Serial.print(pressure); Serial.println( hPa); Serial.print(近似海拔: ); Serial.print(altitude); Serial.println( m); Serial.print(光照等级: ); Serial.println(lightLevel); Serial.println(-----------------------); }代码关键点解析对象初始化DHT dht(DHTPIN, DHTTYPE);这行代码创建了一个DHT对象并告诉它数据线连接在8号引脚传感器型号是DHT11。错误处理bmp.begin()和dht.read的返回值判断至关重要。在实际部署中传感器可能接触不良或损坏良好的错误处理能让你快速定位问题而不是对着乱码数据发呆。双温度对比我们同时读取了DHT11和BMP180的温度。你会发现它们有细微差别。这很正常因为两个传感器位置不同自身发热也不同。你可以取平均值或者根据测试信任其中一个。这个对比过程本身就是一种数据校验。延时delay(2000)对于DHT11是必须的因为它两次读取之间需要至少2秒的恢复时间。对于快速循环的监测这是主要瓶颈也是考虑升级到DHT22或SHT3x的原因之一。将代码上传到Yun打开串口监视器波特率设为9600你应该能看到每隔2秒刷新一次的数据。如果所有数据都能稳定、合理地输出比如湿度在30%-70%之间气压在1000hPa左右恭喜你硬件部分和基础代码已经完美就绪。4. 云端服务配置与Temboo桥接4.1 Temboo的角色与替代方案思考原项目使用了Temboo作为连接Arduino Yun和Google Sheets的“桥梁”。Temboo提供了一个巨大的“代码库”将许多复杂的云服务API如Google, Twitter, Dropbox封装成简单的、适用于微控制器的函数。对于开发者来说你不需要去深入研究OAuth 2.0认证流程或HTTP POST请求的细节只需调用Temboo库中的相应函数填入你的密钥和数据即可。然而正如原文脚注所提醒的Temboo已经逐渐停止了对Arduino平台的直接支持。这是一个在物联网项目中经常遇到的情况云服务变更、API失效。但这恰恰是学习物联网需要掌握的核心能力之一理解原理而非依赖特定服务。Temboo的本质是一个API网关和协议转换器。它替Yun完成了与Google API服务器之间繁琐的HTTPS通信和认证。既然原服务可能不可用我们的思路可以转向两个方向寻找类似的中间件服务例如IFTTT、Zapier等自动化平台也提供了连接硬件和云服务的功能但通常需要配合特定的触发器如Webhooks。理解底层原理自行实现这是更根本的方法。我们需要知道向Google Sheets写入数据本质上就是向一个特定的、受保护的URL发送一个结构化的HTTP POST请求。在Arduino Yun上我们可以利用其Linux端的能力使用cURL或Python脚本直接发送这个请求。虽然复杂度增加但可控性也最强。为了保持项目的连贯性和教学性我们接下来将基于“理解原理”的思路讲解如何配置Google Cloud项目来获得API访问权限这是无论使用Temboo还是其他方式都必须经历的一步。4.2 Google Cloud项目创建与API密钥获取要让我们的气象站能够写入你的Google表格你必须先获得Google的授权。这个过程是在Google Cloud Platform上创建一个项目并启用Sheets API。访问Google Cloud Console使用你的Google账号登录 Google Cloud Console 。创建新项目点击顶部导航栏的项目选择器然后点击“新建项目”。给它起个名字比如“ArduinoYun-WeatherStation”。启用Google Sheets API在项目仪表板中点击“启用API和服务”。在搜索框中输入“Google Sheets API”找到后点击进入详情页然后点击“启用”。创建服务账号关键步骤这是为了以“机器用户”的身份安全地访问API而不是使用你的人身份。在左侧导航栏找到“IAM和管理” - “服务账号”。点击“创建服务账号”。服务账号名称填写“yun-weather-writer”。角色暂时可以不选直接点击“完成”。角色我们后续在Google Sheets里分配。生成访问密钥JSON文件在创建好的服务账号列表中找到刚创建的账号点击右侧的“操作”菜单三个点选择“管理密钥”。在“密钥”标签页点击“添加密钥” - “创建新密钥”。密钥类型选择“JSON”然后点击“创建”。浏览器会自动下载一个JSON格式的密钥文件如yun-weather-writer-xxxxxxx.json。请妥善保管这个文件它就像一把万能钥匙一旦泄露别人就能操作你的表格。在Google Sheets中分享表格打开或新建一个Google Sheets表格这就是我们的数据目的地。点击右上角的“共享”按钮。在“添加人员或群组”的输入框里填入刚才创建的服务账号的“客户端邮箱”可以在下载的JSON文件中找到client_email字段形如yun-weather-writeryour-project.iam.gserviceaccount.com。权限设置为“编辑者”。然后点击“发送”。完成以上步骤你就为你的气象站创建了一个专用的、有写入权限的“机器人”身份并拿到了它的凭证。4.3 Arduino Yun的网络与Bridge库初始化要让Yun的Linux端和Arduino端协同工作必须正确初始化Bridge库并确保Yun已接入你的本地WiFi网络。网络配置首次使用Arduino Yun你需要通过有线网络或访问其内置的AP热点通常名为“Arduino Yun-XXXXXX”进行配置。在浏览器中打开http://arduino.local或192.168.240.1进入Yun的Web配置界面。在这里你可以扫描并连接到你的家庭WiFi设置密码。配置成功后Yun将自动通过WiFi联网。Bridge库的作用在代码中Bridge.begin()这条命令是启动一切云端通信的钥匙。它初始化了ATmega32U4和AR9331两个处理器之间的串行通信链路。此后Arduino端的代码就可以通过Process、FileIO、YunClient等对象向Linux端发送指令例如执行一个shell命令、读写Linux端的文件或者发起一个网络请求。在我们的项目中虽然原Temboo库封装了细节但其底层很可能就是通过Bridge让Linux端执行了一个包含cURL命令的脚本将数据发送出去。理解这一点就能在Temboo不可用时自己动手编写这个脚本。5. 数据上云从传感器到Google表格的完整实现5.1 构建数据发送函数基于HTTP请求原理假设我们不使用Temboo我们可以构思一个更直接的方案在Yun的Linux端用一个Python脚本定期读取Arduino端通过Bridge共享的数据然后使用Google Sheets API的Python客户端库将数据写入表格。这里我给出一个概念性的Arduino端代码框架展示如何通过Bridge与Linux端脚本交互。首先Arduino端需要将传感器数据“暴露”给Linux端。一种简单的方式是写入一个共享文件或者通过Process执行命令传递参数。#include Bridge.h #include Process.h // ... 传感器定义和读取代码与之前相同 ... const unsigned long UPLOAD_INTERVAL 600000; // 10分钟单位毫秒 unsigned long previousUploadTime 0; void setup() { Bridge.begin(); // 启动Bridge必须 Serial.begin(9600); // ... 传感器初始化 ... } void loop() { // ... 读取传感器数据到变量 humidity, temperature, pressure, light ... unsigned long currentTime millis(); if (currentTime - previousUploadTime UPLOAD_INTERVAL) { previousUploadTime currentTime; // 构建一个包含数据的字符串例如CSV格式 String dataString String(currentTime) ,; dataString String(humidity) ,; dataString String(temperature) ,; dataString String(pressure) ,; dataString String(light); // 方案A通过Process调用Linux端的Python脚本并传递数据作为参数 Process p; p.begin(python3); p.addParameter(/mnt/sda1/scripts/upload_to_sheets.py); // Python脚本路径 p.addParameter(dataString); // 将数据作为命令行参数传递 p.run(); // 打印进程输出用于调试 while (p.available() 0) { char c p.read(); Serial.print(c); } Serial.println(数据上传进程已启动。); } delay(10000); // 主循环延迟10秒避免过于频繁读取传感器 }5.2 Linux端Python脚本编写详解在Yun的Linux端可以通过SSH登录或者使用Arduino IDE的“串口”功能中的“Yun终端”访问我们需要创建一个Python脚本。这个脚本需要做几件事解析传入的数据使用Google API客户端库进行认证然后将数据追加到指定的Google表格。首先通过SSH或串口终端登录Yun的Linux系统安装必要的软件包opkg update opkg install python3 python3-pip pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib然后创建脚本文件/mnt/sda1/scripts/upload_to_sheets.py假设你的SD卡挂载在/mnt/sda1#!/usr/bin/env python3 import sys import os from google.oauth2 import service_account from googleapiclient.discovery import build from googleapiclient.errors import HttpError # 1. 从命令行参数获取数据 # 数据格式预期为时间戳,湿度,温度,气压,光照 if len(sys.argv) 2: print(错误未接收到数据参数。) sys.exit(1) data_string sys.argv[1] data_values data_string.split(,) # 这里可以添加数据验证和清洗逻辑 # 2. 设置Google Sheets API的认证信息 SCOPES [https://www.googleapis.com/auth/spreadsheets] SERVICE_ACCOUNT_FILE /mnt/sda1/credentials/yun-weather-writer-xxxxxxx.json # 你的JSON密钥文件路径 SPREADSHEET_ID 你的Google表格ID # 在表格的URL中位于 /d/ 和 /edit 之间 RANGE_NAME Sheet1!A:E # 表示要写入Sheet1的A到E列 def main(): creds None try: creds service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopesSCOPES) except Exception as e: print(f认证失败: {e}) return try: service build(sheets, v4, credentialscreds) sheet service.spreadsheets() # 3. 构建请求体在表格末尾追加一行 values [data_values] # 需要是二维列表 body {values: values} result sheet.values().append( spreadsheetIdSPREADSHEET_ID, rangeRANGE_NAME, valueInputOptionUSER_ENTERED, # 或 RAW insertDataOptionINSERT_ROWS, bodybody).execute() print(f成功写入 {result.get(updates).get(updatedCells)} 个单元格。) except HttpError as err: print(fAPI调用出错: {err}) if __name__ __main__: main()脚本关键点解析认证使用服务账号的JSON密钥文件进行无交互式认证非常适合自动化设备。spreadsheetId这是你表格的唯一标识符从浏览器地址栏获取。valueInputOptionUSER_ENTERED表示数据会被解析就像用户在网页界面手动输入一样比如字符串“1,2”可能会被分成两列RAW则表示直接写入原始字符串。根据你的数据格式选择。错误处理网络请求可能失败脚本中的try...except块至关重要它能防止单次失败导致整个进程崩溃并将错误信息反馈回Arduino端便于调试。5.3 自动化与定时任务部署我们不希望每次上传数据都手动触发。在物联网设备上通常使用定时任务Cron Job来实现自动化。我们可以让Linux端定时执行一个脚本这个脚本首先从Arduino端获取最新数据例如通过读取一个由Arduino Sketch定期更新的文件然后再调用上传脚本。修改Arduino Sketch让Sketch不再主动调用上传而是定期将数据写入一个Linux端可访问的文件例如/mnt/sda1/data/latest_reading.csv。创建数据获取与上传的Shell脚本例如/mnt/sda1/scripts/fetch_and_upload.sh。#!/bin/sh DATA_FILE/mnt/sda1/data/latest_reading.csv PYTHON_SCRIPT/mnt/sda1/scripts/upload_to_sheets.py if [ -f $DATA_FILE ]; then # 读取文件最后一行数据 LATEST_DATA$(tail -n 1 $DATA_FILE) # 调用Python脚本上传 python3 $PYTHON_SCRIPT $LATEST_DATA else echo 数据文件不存在。 fi设置Cron定时任务通过SSH登录Yun执行crontab -e编辑定时任务。添加一行表示每10分钟执行一次我们的脚本。*/10 * * * * /mnt/sda1/scripts/fetch_and_upload.sh /mnt/sda1/logs/upload.log 21这行命令的意思是每10分钟执行一次脚本并将脚本的所有输出包括标准输出和错误输出追加到日志文件中便于日后排查问题。通过以上步骤我们构建了一个不依赖于特定第三方中转服务如Temboo的、自主可控的数据上云管道。虽然步骤比直接调用Temboo库要多但你对整个数据流的掌控力也大大增强了。6. 数据可视化、问题排查与项目扩展6.1 利用Google Sheets进行实时可视化数据进入Google表格只是第一步让数据“说话”才是价值所在。Google Sheets内置的图表功能非常强大足以满足基本的可视化需求。数据清理确保你的数据被正确地写入不同的列。第一行通常是表头如“时间戳”、“湿度(%)”、“温度(°C)”、“气压(hPa)”、“光照”。创建图表选中包含数据和表头的区域点击菜单栏的“插入” - “图表”。 Sheets会自动推荐图表类型通常折线图或面积图适合展示时间序列数据。自定义图表在右侧的“图表编辑器”中你可以图表类型切换为折线图、柱状图、组合图等。数据范围调整图表引用的数据范围。随着数据不断追加你可以将范围设置为整列如A:A这样新数据会自动纳入图表。系列为每个数据系列湿度、温度等设置不同的颜色和样式。横坐标将“时间戳”列设置为横轴。自动刷新Google Sheets图表是实时更新的。只要你的脚本在后台持续写入新数据图表就会自动扩展显示最新的趋势。你可以将这张图表单独发布为网页链接分享给其他人查看而无需暴露整个表格。6.2 常见问题排查与调试心得在部署这类物联网项目时你几乎一定会遇到各种问题。下面是我踩过的一些坑和解决方法问题一串口有数据但表格里没有新行。排查思路这是最典型的问题问题出在“上云”这个环节。检查网络首先确认Yun是否真的连上了WiFi。可以通过串口发送Process p; p.runShellCommand(ifconfig wlan0);来查看网络状态。检查认证确认服务账号的JSON密钥文件路径是否正确以及该账号是否已被授予表格的编辑权限。可以在Linux端手动运行一次Python脚本观察输出错误信息。检查脚本权限确保你的Python脚本和Shell脚本有可执行权限 (chmod x script.py)。查看日志Cron任务和脚本的输出都重定向到了日志文件检查/mnt/sda1/logs/upload.log是定位问题的第一选择。问题二传感器读数不稳定或为NaN非数字。排查思路问题出在数据采集端。电源噪声这是导致DHT11和光敏电阻读数跳变的常见原因。确保电源旁路电容已加上并尝试用杜邦线将传感器的GND直接连接到Yun的GND引脚减少共地噪声。接线松动特别是DHT11其引脚很容易在面包板上接触不良。轻轻按压或重新插拔。库冲突或版本问题确保你安装的传感器库是最新且兼容的。有时需要尝试不同版本的库。问题三设备运行一段时间后死机或不更新。排查思路可能是内存泄漏或进程阻塞。检查内存在Linux端使用free命令查看内存使用情况。如果Arduino端的Sketch或Linux端脚本存在内存泄漏长时间运行后会耗尽资源。简化逻辑初期尽量让代码简单可靠。避免在Arduino的loop()中使用复杂的字符串操作或动态内存分配。看门狗Watchdog可以考虑启用Arduino的内置看门狗定时器在程序卡死时自动重启。实操心得给每个关键步骤都加上状态反馈。比如在Arduino代码中每次成功读取传感器、成功调用上传进程后都在串口打印一条明确的日志如[INFO] Data uploaded.。在Linux脚本中将成功或失败信息写入日志。这些日志信息在调试时是无价之宝。另外在项目初期可以大幅缩短上传间隔比如1分钟快速测试整个流程是否通畅稳定后再改为10分钟或更长的间隔。6.3 项目扩展与优化方向这个基础的气象站就像一个乐高底座你可以在此基础上添加无数有趣的模块更多传感器空气质量添加PM2.5/PM10传感器如攀藤PMS5003或二氧化碳传感器如MH-Z19B监测室内空气健康。噪音传感器了解家庭环境的噪音水平变化。土壤湿度传感器自动监控盆栽植物的干湿情况为自动浇水系统提供数据。风速风向传感器搭建真正的户外微型气象站。数据存储与后端升级本地数据库在Yun的SD卡上使用SQLite数据库存储历史数据避免因网络中断丢失数据。私有云将数据发送到你自己的服务器使用InfluxDB时序数据库存储并用Grafana打造更专业、更美观的仪表盘。多平台通知结合IFTTT或Webhook当数据超过阈值如温度过高时自动发送邮件、短信或手机App推送通知。设备端优化低功耗设计如果使用电池供电可以让Yun大部分时间处于睡眠模式定时唤醒采集和上传数据。更换主控如果觉得Yun成本较高或已停产可以改用更流行的ESP32开发板。ESP32集成了WiFi和蓝牙性能更强社区支持更广有现成的库可以直接连接Google Sheets API或各类物联网平台如阿里云、腾讯云IoT。这个项目的真正目的不仅是做出一个能用的气象站更是为你打开一扇物联网开发的大门。理解了数据从传感器到云端的每一个环节你就能举一反三将任何物理世界的信号转化为可存储、可分析、可行动的数字化信息。