如何用MIT App Inventor从ThingSpeak读取NodeMCU上传的电压数据?
用MIT App Inventor从ThingSpeak读取电压数据的实现方法
嘿,我之前刚好做过类似的IoT项目,其实用MIT App Inventor通过互联网从ThingSpeak拉取数据比蓝牙通信简单不少,给你一步步拆解具体怎么做:
核心原理
ThingSpeak提供了REST API来读取通道数据,我们只需要在MIT App Inventor里用Web组件发送HTTP请求,然后解析返回的JSON数据就能拿到电压值了。
具体步骤
1. 准备ThingSpeak的必要信息
首先你得从ThingSpeak通道页面拿到这三个关键信息:
- 你的Channel ID(通道ID,在通道主页顶部能看到)
- Read API Key(只读API密钥,在通道的"API Keys"标签页里)
- 存储电压数据的字段号(比如你把电压存在Field1,那就是1)
2. 在MIT App Inventor里添加组件
打开你的项目,在组件面板里添加:
- 一个
Web组件(用来发送网络请求) - 几个
Label(用来展示电压值和提示信息) - 可选:一个
Button(手动触发数据刷新)或者Clock组件(定时自动刷新)
3. 构造API请求URL
ThingSpeak的读取数据API格式是这样的:
https://api.thingspeak.com/channels/{CHANNEL_ID}/fields/{FIELD_NUMBER}.json?api_key={READ_API_KEY}&results=1
把里面的占位符换成你自己的信息,比如我的通道ID是123456,存在Field1,Read API Key是ABC123,那URL就是:
https://api.thingspeak.com/channels/123456/fields/1.json?api_key=ABC123&results=1
results=1表示只获取最新的一条数据,如果你需要历史数据可以改这个数值。
4. 编写逻辑块(Blocks)
触发数据请求
如果用按钮触发:
- 拖出
Button.Click事件块 - 拼接好你的API URL(可以用文本拼接块,或者直接写死在代码里,不过建议用输入框存密钥和ID更灵活)
- 调用
Web1.Get(拼接好的URL)方法发送请求
如果用定时刷新:
- 添加
Clock组件,设置TimerInterval为你需要的间隔(比如5000毫秒=5秒) - 在
Clock.Timer事件里调用Web1.Get(URL)
解析返回的JSON数据
当Web组件拿到数据后,会触发Web1.GotText事件,我们在这里解析数据:
- 用
JSONDecode函数把返回的responseContent转换成字典对象 - 从字典里取出
feeds列表,取第一个元素(因为我们要最新的一条) - 从这个元素里取出
field1(对应你的字段号)的值 - 把这个值设置到Label的Text属性里,比如
"当前电压:" + 电压值 + "V"
举个逻辑示例:
当 Button1 被点击时 设置 url 为 "https://api.thingspeak.com/channels/" + ChannelIdInput.Text + "/fields/1.json?api_key=" + ReadKeyInput.Text + "&results=1" 调用 Web1.Get(url) 当 Web1.GotText(responseCode, responseContent) 如果 responseCode = 200 (表示请求成功) 设置 数据字典 为 JSONDecode(responseContent) 设置 最新数据 为 获取 数据字典 的 "feeds" 的第 1 项 设置 电压值 为 获取 最新数据 的 "field1" 设置 VoltageLabel.Text 为 "当前电压:" + 电压值 + "V" 否则 设置 VoltageLabel.Text 为 "数据获取失败,请检查网络或API信息"
5. 测试和注意事项
- 测试时确保手机连上网,MIT App Inventor默认会添加INTERNET权限,不用额外配置
- ThingSpeak免费版有请求频率限制:每分钟最多15次请求,所以不要把定时间隔设得太短
- 不要把你的Read API密钥泄露给别人,个人项目直接用没问题,商业项目建议加后端代理
内容的提问来源于stack exchange,提问作者B.Djo
相关产品推荐
相关产品推荐

