基于Arduino Yún与Twitter API的物联网社交提醒器开发实战 1. 项目概述当硬件遇见社交网络几年前当我第一次把一块Arduino开发板连上网络并让它从互联网上抓取数据时那种感觉就像给一个沉默的机器赋予了“听觉”和“视觉”。今天我们要聊的这个项目就是这种理念的一个经典实践让一块小小的Arduino Yún开发板去监听Twitter现称X上是否有人提到了你并用一个最直观的物理方式——点亮一颗LED灯——来给你提示。这听起来像是一个极客的小玩具但它背后蕴含的正是现代物联网IoT开发的核心范式资源受限的嵌入式设备通过标准的网络协议和API接口与云端强大的服务和数据源进行交互。Arduino Yún是一块特殊的开发板它内置了Wi-Fi和基于Linux的处理器相当于给传统的单片机MCU安上了一个智能的“网络协处理器”让它能轻松处理HTTP请求、解析数据等网络任务。而Temboo平台则扮演了“翻译官”和“简化器”的角色它将Twitter API复杂的OAuth认证、请求格式封装成一个个简单的“Choreo”可以理解为预制好的API调用模块让开发者无需深究底层协议就能快速实现功能。这个项目的价值远不止于点亮一盏灯。它为你打开了一扇门掌握了硬件设备调用云端API的基本方法你就可以轻松地将任何传感器数据上传到云端进行分析或者让硬件根据云端的指令如天气数据、股票价格、新闻热点做出反应。无论是做一个当空气质量变差时自动亮红灯的提示器还是一个当你的GitHub仓库有新星标时自动庆祝的“点赞机”其底层逻辑都是相通的。接下来我将带你从零开始完整复现这个项目。我会详细解释每一个步骤背后的“为什么”分享我在调试过程中踩过的坑和总结的技巧让你不仅能做出这个项目更能透彻理解其原理从而应用到更多有趣的创意中去。2. 硬件选型与核心思路解析2.1 为什么是Arduino Yún在开始动手之前我们得先搞清楚为什么这个项目点名要Arduino Yún而不是更常见的Uno或ESP8266。核心原因在于架构。传统的Arduino如Uno只有一颗AVR单片机运行简单的实时程序处理TCP/IP协议栈和复杂的HTTP/JSON解析非常吃力通常需要外接专门的网络模块如W5100以太网盾并编写大量底层代码。而Arduino Yún采用了一种双处理器架构AVR ATmega32u4这就是我们熟悉的Arduino单片机负责运行你的setup()和loop()函数控制GPIO引脚连接按钮、LED执行实时性要求高的任务。Atheros AR9331这是一颗运行OpenWrt Linux系统的处理器内置Wi-Fi和以太网接口。它负责处理所有网络通信、协议栈、甚至能运行Python等脚本。两块处理器之间通过一个名为Bridge的库进行通信。你的Arduino草图Sketch可以通过简单的Bridge库函数让Linux侧去执行复杂的网络请求然后将结果返回给MCU侧。这就好比MCU是前线指挥所而Linux处理器是拥有强大情报处理能力的后方基地。这种设计完美解耦了实时控制与网络服务让两者各司其职。实操心得如果你手头没有Yún理论上任何能运行Linux并支持Arduino环境的板子如Raspberry Pi Arduino组合都可以通过模拟Bridge库的方式实现。但对于初学者和希望快速验证想法来说Yún的集成度和官方库支持是最省心的选择。2.2 Temboo平台的角色与现状原文指南中提到了一个关键限制“The Temboo service has moved away from Arduino support.” 这是一个非常重要的信息点也直接影响了我们的实现方案。Temboo的初衷是好的它提供了一个图形化界面让你选择服务如Twitter、Google Sheets、Weather等配置参数然后它为你生成直接可用的Arduino代码自动处理了OAuth等繁琐的认证。它本质是一个“云代码生成器”和“代理服务器”。你的Arduino板子实际是向Temboo的服务器发送请求由Temboo服务器去调用真正的Twitter API再将简化后的结果返回给板子。然而随着服务演进和商业模式变化Temboo逐渐停止了对Arduino的免费支持。这意味着原文中依赖Temboo生成代码和提供运行时服务的路径已经失效。但这绝不意味着项目无法实现相反这迫使我们采用更通用、更底层、也更能体现技术本质的方法直接让Arduino Yún的Linux侧去调用Twitter API。我们的新思路放弃Temboo代码生成我们不使用Temboo生成的Temboo.h和TembooAccount.h。利用Yún的Linux能力在Yún的Linux侧我们可以使用curl命令或编写一个简单的Python/Node.js脚本来直接调用Twitter API v2。通过Bridge进行通信Arduino MCU侧通过Process库Bridge库的一部分来启动并获取Linux侧脚本的执行结果。MCU进行逻辑判断MCU侧比较本次与上次获取的推文ID控制LED的点亮。这种方案的优点更直接去除了中间层减少了故障点。更灵活你可以完全控制API请求和响应解析的过程。知识可迁移学会这种方法你就能让Yún与任何提供HTTP API的服务交互。2.3 系统工作流程设计基于以上分析我们重新设计项目的工作流程触发用户按下连接在Yún数字引脚如D2上的按钮。请求发起MCU检测到按钮按下通过Bridge启动Linux侧的一个脚本例如一个Python脚本。API调用该脚本使用存储在Yún上的Twitter API密钥和令牌向Twitter API发送一个HTTP GET请求查询最新的提及Mentions推文。数据处理脚本接收API返回的JSON数据解析出最新一条提及的推文ID甚至推文内容然后将这个ID通过Bridge传回给MCU。逻辑判断MCU将收到的新ID与本地存储的上一次ID进行比较。执行动作如果ID不同说明有新提及则MCU点亮连接在D13引脚上的LED持续一段时间如5秒然后熄灭并更新存储的ID。如果ID相同则不做任何事。等待下次触发系统回到待命状态等待下一次按钮按下。这个流程清晰地将网络任务Linux侧和控制任务MCU侧分离是发挥Yún双核架构优势的最佳实践。3. 环境准备与Twitter API配置3.1 硬件清单与连接硬件部分与原文基本一致这是最基础的部分核心控制器Arduino Yún × 1输入设备常开型按键开关 × 1 推荐使用模块内含消抖电路更稳定输出指示LED发光二极管 × 1 颜色任选限流保护220Ω 或 330Ω 电阻 × 1 用于LED防止电流过大烧毁实验平台面包板 × 1连接线公对公杜邦线 若干供电与编程Micro-USB数据线 × 1电路连接图文字描述按钮连接按钮一脚连接Yún的GND引脚另一脚连接Yún的数字引脚2D2。同时强烈建议在D2引脚与5V或3.3V之间连接一个10kΩ的上拉电阻。这样当按钮未按下时D2通过电阻被拉至高电平稳定状态按下时D2直接接GND变为低电平。如果不加引脚处于“悬空”状态会读到随机值导致误触发。LED连接LED的短脚阴极串联一个220Ω电阻后连接到Yún的GND。LED的长脚阳极连接到Yún的数字引脚13D13。D13引脚板载了一个小LED方便我们做双重验证。注意事项连接LED时务必串联电阻直接连接5V引脚会瞬间导致LED过流损坏。电阻值计算R (Vcc - Vf) / If。对于红色LEDVf≈1.8V If≈20mA使用5V电源时R (5-1.8)/0.02 160Ω选择220Ω是安全且亮度足够的。3.2 Twitter开发者账号与API申请这是本项目最具挑战性的一步因为TwitterX的开发者政策近年来收紧了。请严格按照以下步骤操作注册/登录Twitter账号需要一个普通的Twitter账号。访问开发者门户前往developer.twitter.com 使用你的Twitter账号登录。申请开发者账号点击“Apply for a developer account”。你需要选择使用类型个人用途选“Hobbyist”并详细、真实地描述你的项目用途例如“学习物联网开发制作一个当有人我时用Arduino板点亮LED灯的个人提醒装置。该设备仅用于个人通知不会存储、发布或分析任何数据。”。描述越具体、越无害通过概率越高。可能需要等待几个小时至几天进行审核。创建项目Project和应用App审核通过后在仪表板点击“Create Project”。给项目起名如“ArduinoYunNotifier”选择用途选“Making a bot”或其他你觉得合适的。获取密钥和令牌应用创建成功后进入“Keys and Tokens”标签页。你会看到四组关键信息API Key和API Key Secret即Consumer Key和Consumer SecretAccess Token和Access Token Secret请立即将这些信息妥善保存到一个安全的地方如本地的加密文本文件因为Access Token和Secret只显示一次配置应用权限在“App Settings”中确保你的应用权限至少是“Read” 读取。因为我们只需要读取提及时间线。开启OAuth 2.0Twitter API v2推荐使用OAuth 2.0它比v1.1的OAuth 1.0a更简单。在“User authentication settings”部分点击“Set up”选择“OAuth 2.0”类型选“Native App”回调URL和网站URL可以暂时填http://localhost:3000或留空。保存后你会获得一个Client ID。但请注意获取用户时间线包括提及的某些接口可能仍需要OAuth 1.0a。为求最大兼容性我们这个项目将使用OAuth 1.0a也就是上面获得的四组密钥。避坑指南很多人在申请开发者账号时被拒最常见原因是描述太笼统如“用于测试”、“学习API”。务必像上面例子一样描述一个具体、微小、无商业用途、不涉及数据滥用的应用场景。强调是“个人”、“一次性”、“硬件实验”。3.3 Arduino Yún初始网络配置要让Yún的Linux侧能访问互联网必须先连接Wi-Fi。通过USB连接电脑用Micro-USB线将Yún连接到电脑。在Arduino IDE中选择板卡类型为“Arduino Yún”端口选择对应的串口。打开串口监视器波特率设置为115200。进入配置模式在串口监视器中输入指令configure并发送。这会启动一个基于文本的Wi-Fi配置向导。按提示操作根据向导提示输入你的Wi-Fi网络SSID名称和密码。Yún会尝试连接。成功后它会显示一个IP地址例如192.168.1.100。记下这个IP地址以后可以通过它SSH登录到Yún的Linux系统。测试连接配置完成后可以输入ifconfig命令查看网络状态或输入ping www.google.com测试外网连通性。至此你的硬件已经准备就绪云端API钥匙也已拿到网络也已打通。接下来就是最核心的软件部分。4. 核心代码实现与解析我们将完全摒弃Temboo采用更直接的“Linux脚本 Arduino Bridge控制”方案。整个代码结构分为两部分运行在Linux侧的Python脚本和运行在MCU侧的Arduino草图。4.1 Linux侧Python脚本twitter_mentions.py这个脚本负责与Twitter API通信。我们需要将它上传到Yún的Linux文件系统中。#!/usr/bin/env python3 # twitter_mentions.py - 运行在Arduino Yún Linux侧获取最新提及推文ID import sys import json import requests from requests_oauthlib import OAuth1 # 配置区务必替换成你自己的密钥 API_KEY YOUR_API_KEY API_SECRET YOUR_API_SECRET ACCESS_TOKEN YOUR_ACCESS_TOKEN ACCESS_TOKEN_SECRET YOUR_ACCESS_TOKEN_SECRET # def get_latest_mention_id(): 使用Twitter API v1.1 获取当前用户最新的提及推文ID。 返回: 最新提及的推文ID (字符串)若无提及或出错则返回 None。 # Twitter API v1.1 提及时间线端点 url https://api.twitter.com/1.1/statuses/mentions_timeline.json # 请求参数我们只需要最近1条推文且只返回id字段以节省带宽 params { count: 1, trim_user: true, # 不返回用户详细信息 include_entities: false, # 不返回实体信息 tweet_mode: extended # 使用扩展模式以防推文被截断 } # 设置OAuth 1.0a认证 auth OAuth1(API_KEY, API_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET) try: response requests.get(url, paramsparams, authauth, timeout10) response.raise_for_status() # 如果状态码不是200抛出HTTPError异常 tweets response.json() if tweets and len(tweets) 0: # 返回最新一条提及的ID latest_tweet_id str(tweets[0][id]) # 调试信息输出到stderr方便在Arduino IDE串口查看Process输出 print(fDebug: Found mention with ID: {latest_tweet_id}, filesys.stderr) return latest_tweet_id else: print(Debug: No mentions found., filesys.stderr) return None except requests.exceptions.RequestException as e: print(fDebug: Network/API Error: {e}, filesys.stderr) return None except (KeyError, IndexError, json.JSONDecodeError) as e: print(fDebug: Data Parsing Error: {e}, filesys.stderr) return None if __name__ __main__: tweet_id get_latest_mention_id() # 将结果打印到stdout这样Arduino Process才能读取到 if tweet_id: print(tweet_id) else: # 如果出错或没有提及打印一个特殊标识比如0 print(0)脚本关键点解析认证方式我们使用了OAuth 1.0a这是Twitter API v1.1的标准认证方式。requests_oauthlib库帮我们处理了签名等复杂步骤。错误处理网络请求充满不确定性因此必须用try...except包裹并对各种异常网络超时、API错误、JSON解析错误、数据结构不符进行处理返回一个安全值如None或0。输出设计脚本将调试信息打印到sys.stderr这些信息会出现在Arduino IDE的串口监视器中便于调试。而最终的结果推文ID或0打印到sys.stdout这是ArduinoProcess库读取的通道。参数优化params中设置了trim_user和include_entities为false可以显著减少API返回的数据量加快响应速度这对于资源有限的物联网设备非常重要。如何上传脚本到Yún在你的电脑上创建并保存上述twitter_mentions.py文件用你的真实密钥替换YOUR_*部分。使用SCP或SFTP客户端如FileZilla将文件上传到Yún的/root目录下。主机名是Yún的IP地址用户名root密码arduino。通过SSH登录Yúnssh root192.168.1.100密码arduino为脚本添加执行权限chmod x /root/twitter_mentions.py安装必要的Python库。Yún的OpenWrt系统可能没有预装requests和requests_oauthlib。通过opkg包管理器安装opkg update opkg install python3 python3-pip pip3 install requests requests_oauthlib注意Yún的存储空间有限安装过程可能需要一些时间并确保有足够的空间。4.2 Arduino草图MCU侧主程序这是运行在ATmega32u4单片机上的主程序负责按钮检测、调用Linux脚本、处理结果并控制LED。/* * Arduino Yún Twitter Mention Notifier * 通过按钮触发调用Linux Python脚本查询最新提及并用LED提示新消息。 */ #include Bridge.h #include Process.h // 引脚定义 const int buttonPin 2; // 按钮连接的数字引脚 const int ledPin 13; // LED连接的数字引脚板载LED也在此引脚 // 状态变量 unsigned long lastDebounceTime 0; // 上次按钮状态变化的时间 const unsigned long debounceDelay 50; // 消抖延时毫秒 int lastButtonState HIGH; // 上次读取的按钮状态假设上拉为HIGH int buttonState; // 当前读取的按钮状态 unsigned long lastTweetID 0; // 存储上一次获取的推文ID void setup() { // 初始化串口通信用于调试 Serial.begin(115200); // 等待串口连接仅在调试时需要。正式使用时可以注释掉避免卡住。 // while (!Serial); // 初始化引脚 pinMode(buttonPin, INPUT_PULLUP); // 使用内部上拉电阻简化外部电路 pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // 确保LED初始为熄灭状态 // 初始化Bridge库启动Linux与MCU的通信 Bridge.begin(); Serial.println(Bridge started. System ready.); Serial.println(Press the button to check for new mentions...); } void loop() { // 1. 读取并消抖处理按钮状态 int reading digitalRead(buttonPin); // 检查按钮状态是否发生变化从噪声中识别出真正的按下 if (reading ! lastButtonState) { lastDebounceTime millis(); // 重置消抖计时器 } // 如果经过消抖延时后状态仍然稳定则认为是有效变化 if ((millis() - lastDebounceTime) debounceDelay) { if (reading ! buttonState) { buttonState reading; // 2. 检测按钮是否被按下从HIGH变为LOW if (buttonState LOW) { Serial.println(\n--- Button Pressed. Checking Twitter... ---); // 3. 调用Linux脚本获取最新提及ID unsigned long newTweetID getLatestMentionID(); // 4. 逻辑判断与LED控制 if (newTweetID 0) { // 确保获取到了有效的ID if (lastTweetID 0) { // 第一次运行存储ID但不触发LED Serial.println(First run. Storing initial Tweet ID: String(newTweetID)); lastTweetID newTweetID; } else if (newTweetID ! lastTweetID) { // 发现新提及 Serial.println( NEW MENTION DETECTED! ); Serial.println(Old ID: String(lastTweetID)); Serial.println(New ID: String(newTweetID)); // 点亮LED作为提示 digitalWrite(ledPin, HIGH); delay(5000); // 亮灯5秒 digitalWrite(ledPin, LOW); // 更新存储的ID lastTweetID newTweetID; } else { // ID相同没有新提及 Serial.println(No new mentions since last check.); } } else { // 获取ID失败可能是网络错误或API问题 Serial.println(Failed to retrieve Tweet ID. Check script and network.); } Serial.println(--- Check Complete. Ready for next press. ---); } } } // 保存本次读取的按钮状态用于下次循环比较 lastButtonState reading; } /** * 通过Bridge调用Linux侧的Python脚本获取最新的提及推文ID。 * 返回: 最新的推文ID (unsigned long)。如果失败返回0。 */ unsigned long getLatestMentionID() { Process p; // 创建一个进程对象用于运行Linux命令 unsigned long id 0; // 使用Process运行Python脚本。确保路径正确。 // 如果脚本在其他位置请修改路径例如 /mnt/sda1/twitter_mentions.py p.runShellCommand(python3 /root/twitter_mentions.py); // 等待进程执行完毕或超时 unsigned long startTime millis(); const unsigned long timeout 15000; // 15秒超时 while (p.running() (millis() - startTime) timeout) { // 可以在这里做一些其他事或者简单等待 delay(10); } // 读取进程的输出stdout String output p.readString(); output.trim(); // 去除首尾空白字符如换行符 // 读取进程的错误输出stderr用于调试 String errorOutput p.readStringErr(); if (errorOutput.length() 0) { Serial.print(Script stderr: ); Serial.println(errorOutput); } // 关闭进程 p.close(); // 解析输出 if (output.length() 0) { Serial.print(Script stdout: ); Serial.println(output); // 将字符串转换为无符号长整型 char* endptr; id strtoul(output.c_str(), endptr, 10); // 检查转换是否成功 if (endptr output.c_str() || *endptr ! \0) { Serial.println(Error: Could not parse ID from output.); id 0; } } else { Serial.println(Error: Script returned no output.); } // 如果超时报告错误 if ((millis() - startTime) timeout) { Serial.println(Error: Script execution timed out.); id 0; } return id; }代码深度解析与避坑技巧按钮消抖Debouncing为什么需要机械按钮在按下和释放的瞬间触点会产生物理抖动导致MCU在几毫秒内读到多次快速的高低电平变化从而误判为多次按下。如何实现代码中使用了经典的“状态变化延时确认”消抖算法。只有当按钮状态变化并保持稳定超过debounceDelay50毫秒后才认为是一次有效的动作。INPUT_PULLUP模式启用了内部上拉电阻简化了外部电路此时按钮未按下时为高电平按下时接地变为低电平。Bridge与Process库Bridge.begin()必须在setup()中调用用于初始化两个处理器之间的通信链路。这需要几秒钟时间期间不要进行其他操作。Process类是Bridge库的一部分允许MCU侧启动并控制Linux侧的进程。p.runShellCommand()是异步的它会立即返回。我们必须通过p.running()和超时机制来等待进程结束。路径问题runShellCommand中的命令路径必须正确。如果脚本上传到了/root命令就是python3 /root/twitter_mentions.py。如果放在U盘Yún的USB口路径可能是/mnt/sda1/...。健壮性设计超时处理网络请求可能因各种原因挂起。getLatestMentionID函数设置了15秒超时防止程序因一次API调用失败而永远卡住。错误输出捕获通过p.readStringErr()读取脚本的stderr这对于调试Python脚本中的错误如导入库失败、API密钥错误至关重要。输出解析使用strtoul进行字符串到整数的转换并检查转换是否完全成功endptr指向字符串结尾避免了无效字符导致的错误。LED提示逻辑只有满足三个条件才点亮LED1) 成功获取到ID2) 不是第一次运行lastTweetID ! 03) 新旧ID不同。第一次运行lastTweetID 0时只存储ID而不触发LED避免了上电时就因为“发现新ID”而误触发。5. 系统集成、测试与调试5.1 完整工作流程与上传上传Arduino草图将完整的Arduino代码4.2节编译并上传到Yún。确保在上传时Yún是通过Micro-USB线直接连接到电脑的而不是通过Wi-Fi。上传过程中Yún板上的“L”和“RX/TX”灯会闪烁。验证脚本可执行通过SSH登录Yún手动测试Python脚本cd /root python3 twitter_mentions.py如果一切配置正确你应该会看到类似Debug: Found mention with ID: 1234567890123456789的错误输出到stderr以及一行纯数字ID的输出到stdout。如果看到导入错误或认证错误请根据提示安装库或检查API密钥。集成测试打开Arduino IDE的串口监视器波特率115200。按下按钮。你应该在串口监视器中看到详细的日志输出包括“Button Pressed”、“Script stdout: [ID]”、以及是否发现新提及的判断。同时观察板载D13 LED或你外接的LED是否按预期点亮。5.2 常见问题与排查实录即使按照步骤操作你也可能会遇到一些问题。下面是我在多次实践中总结的常见问题及解决方法问题现象可能原因排查步骤与解决方案串口输出Bridge started后无反应或提示脚本执行超时。1. Python脚本路径错误。2. Python脚本没有执行权限。3. Python依赖库未安装。4. Yún未连接到互联网。1. SSH登录Yún用ls -la /root/twitter_mentions.py确认文件存在。2. 用chmod x /root/twitter_mentions.py添加权限。3. 运行python3 -c import requests; import requests_oauthlib测试导入。如果失败用pip3 install安装。4. 运行ping 8.8.8.8测试网络。用configure重新配置Wi-Fi。脚本能运行但返回0或输出错误信息。1. Twitter API密钥错误或权限不足。2. API端点或参数已过时。3. 开发者账号未通过审核或应用被限制。1.仔细核对twitter_mentions.py中的四组密钥确保无空格、无错误。2. 在Linux上用curl命令手动测试APIcurl -X GET -H Authorization: Bearer 你的Bearer Token https://api.twitter.com/2/users/me/mentions?max_results1(v2 API)。如果v1.1不行尝试改用v2 API需Bearer Token。3. 登录Twitter开发者门户检查应用状态和权限设置。按钮按下无反应或连续触发多次。1. 电路连接错误特别是上拉/下拉电阻未接。2. 消抖代码参数不合适。3. 引脚模式设置错误。1. 用万用表测量按钮按下/释放时D2引脚对GND的电压。未按下时应为~3.3V/5V按下时应接近0V。2. 调整debounceDelay的值如从50ms改为100ms。3. 确认代码中为pinMode(buttonPin, INPUT_PULLUP)如果使用外部上拉则用INPUT。LED不亮或常亮。1. LED正负极接反。2. 限流电阻过大或过小烧毁。3. 代码中LED控制逻辑有误。1. 确认LED长脚阳极接D13短脚阴极通过电阻接GND。2. 更换LED和电阻测试。3. 在loop()中临时添加digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000);测试LED本身和电路是否正常。Process执行非常慢10秒。1. Yún的Linux处理器性能有限首次运行Python或网络延迟高。2. DNS解析慢。1. 这是正常现象尤其是第一次运行脚本需要加载Python解释器和库。后续调用会快一些。2. 在Yún的Linux中编辑/etc/resolv.conf添加更快的DNS服务器如nameserver 8.8.8.8。高级调试技巧在Arduino草图的getLatestMentionID函数中增加更详细的日志。例如在调用p.runShellCommand后立即打印“Command started”在读取输出前后打印“Reading output...”。这能帮你精确判断程序卡在哪一步。5.3 功能扩展与优化思路这个项目是一个完美的起点你可以在此基础上进行无限扩展多平台通知修改Python脚本除了检查Twitter还可以检查Gmail、GitHub通知、RSS订阅甚至调用IFTTT或钉钉/企业微信的Webhook来发送更丰富的通知。丰富输出方式将单个LED换成RGB LED用不同颜色表示不同类型的通知如蓝色代表Twitter绿色代表邮件。或者连接一个OLED屏幕滚动显示提及的内容。自动化触发去掉按钮改为定时触发例如每5分钟检查一次。但要注意Twitter API有调用频率限制Rate Limits过于频繁的请求会导致被临时封禁。状态持久化目前推文ID存储在内存中Yún重启后会丢失。你可以将lastTweetID保存到Yún的Linux文件系统中或者写入ATmega32u4的EEPROM实现断电记忆。使用API v2与Bearer TokenTwitter API v2的某些端点使用更简单的Bearer Token认证仅适用于公开数据的读取。你可以修改Python脚本使用v2的/2/users/:id/mentions端点并只使用Bearer Token简化认证流程。这个项目打通了硬件与云服务的任督二脉。当你成功看到LED因一条网络上的社交消息而亮起时你所掌握的远不止是几行代码和接线方法而是一种让物理世界与数字世界对话的能力。这种能力正是构建一切智能物联网应用的基石。