Appearance
Arduino硬件交互实战:App Inventor 2 使用指南
App Inventor 2 (AI2) 是一个由麻省理工学院(MIT)开发的图形化编程平台,它让没有专业编程背景的用户也能轻松为安卓设备开发应用程序。结合Arduino,您可以快速构建出功能丰富的物联网(IoT)项目原型。本指南将带您了解AI2与Arduino交互的核心方法。
1. 通信方式概述
AI2与Arduino之间主要有两种通信方式,各有优劣,适用于不同场景:
蓝牙通信 (Bluetooth)
- 优点:无需网络,点对点连接简单直接,适合近距离控制。
- 缺点:连接距离有限,传统蓝牙在AI2中存在兼容性问题。
- 推荐模块:HC-05, HC-06 (经典蓝牙), HM-10 (BLE,需扩展)
Wi-Fi通信 (WiFi)
- 优点:连接距离远,可通过互联网远程控制,稳定可靠。
- 缺点:需要稳定的Wi-Fi网络环境,配置相对复杂。
- 推荐模块:ESP8266, ESP32 (自带Wi-Fi功能)
2. 准备工作
- 注册与登录:访问官方平台 http://appinventor.mit.edu/ 并注册一个新账户。
- 安装伴侣应用 (AI2 Companion):在安卓手机上安装“MIT AI2 Companion”应用,用于实时测试您开发的App。
- 配对设备:在开始前,请确保您的蓝牙模块(如HC-05)已与电脑完成配对。
3. 通信方式一:蓝牙 (以经典蓝牙为例)
此方法适用于HC-05/HC-06等经典蓝牙模块。
Arduino端代码 (Arduino UNO + HC-05)
cpp
// 定义LED引脚
const int ledPin = 13;
void setup() {
// 初始化串口通信,与蓝牙模块通信
Serial.begin(9600);
// 设置LED引脚为输出模式
pinMode(ledPin, OUTPUT);
}
void loop() {
// 检查串口是否有数据输入
if (Serial.available() > 0) {
// 读取串口输入的字符
char command = Serial.read();
// 根据接收到的命令控制LED
if (command == '1') {
digitalWrite(ledPin, HIGH); // 开灯
Serial.println("LED is ON");
} else if (command == '0') {
digitalWrite(ledPin, LOW); // 关灯
Serial.println("LED is OFF");
}
}
}App Inventor 2 端设计
设计界面 (Designer)
- 拖入一个 Button 组件,命名为
btnOn,设置文本为“开灯”。 - 拖入另一个 Button 组件,命名为
btnOff,设置文本为“关灯”。 - 拖入一个 ListPicker 组件,命名为
lstDevices,设置文本为“选择设备”。 - 拖入一个 BluetoothClient 组件(在“连接”分类中)。
- 拖入一个 Button 组件,命名为
编写逻辑 (Blocks)
- 连接设备:当
lstDevices选择后,调用BluetoothClient1.Connect(lstDevices.Selection)进行连接。 - 发送指令:当
btnOn.Click时,调用BluetoothClient1.SendText("1");当btnOff.Click时,调用BluetoothClient1.SendText("0")。
- 连接设备:当
4. 通信方式二:Wi-Fi (以ESP32为例)
此方法适用于自带Wi-Fi功能的ESP32开发板。
Arduino端代码 (ESP32 Web Server)
cpp
#include <WiFi.h>
const char* ssid = "你的Wi-Fi名称";
const char* password = "你的Wi-Fi密码";
WiFiServer server(80);
void setup() {
Serial.begin(115200);
pinMode(2, OUTPUT); // ESP32板载LED引脚
// 连接Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println(WiFi.localIP()); // 打印IP地址,App中需要使用
server.begin(); // 启动Web服务器
}
void loop() {
WiFiClient client = server.available();
if (client) {
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n') {
if (currentLine.length() == 0) {
// 发送HTTP响应头
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
// 根据URL判断指令
if (currentLine.indexOf("/on") != -1) {
digitalWrite(2, HIGH);
client.println("Led turned on.");
} else if (currentLine.indexOf("/off") != -1) {
digitalWrite(2, LOW);
client.println("Led turned off.");
}
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
}
}
client.stop(); // 关闭连接
}
}App Inventor 2 端设计
设计界面 (Designer)
- 拖入一个 Button 组件,命名为
btnOn,设置文本为“开灯”。 - 拖入另一个 Button 组件,命名为
btnOff,设置文本为“关灯”。 - 拖入一个 Web 组件(在“传感器”分类中)。
- 拖入一个 Button 组件,命名为
编写逻辑 (Blocks)
- 当
btnOn.Click时,设置Web1.Url为"http://[ESP32的IP地址]/on",然后调用Web1.Get。 - 当
btnOff.Click时,设置Web1.Url为"http://[ESP32的IP地址]/off",然后调用Web1.Get。
- 当
5. 常见问题与解决方案
蓝牙无法连接或扫描不到设备 (Android 10+)问题:权限问题或系统限制。 解决:确保App拥有“位置”和“蓝牙”权限。对于系统限制,请使用 BLE扩展 替代内置的
BluetoothClient组件。蓝牙连接时App卡死问题:
BluetoothClient组件的同步连接机制导致UI线程阻塞。 解决:使用 异步连接扩展,或改用 BLE扩展,它们提供了非阻塞的连接方式。BLE (低功耗蓝牙) 连接困难问题:内置组件不支持BLE。 解决:必须使用第三方 BLE扩展。请在社区搜索并导入最新的
.aix文件到您的项目中。
6. 学习资源
- 官方教程:访问 MIT App Inventor官方教程页面 获取最权威的入门和进阶指南。
- 社区论坛:遇到问题时,前往 MIT App Inventor Community Forum 搜索或提问,这里有大量经验分享。
- 视频教程:在B站等视频平台搜索“App Inventor 2 教程”,可以找到许多直观的视频教学。
需要我把前面整理的所有Arduino硬件交互文档(OLED、执行器、App Inventor)合并成一份完整的实战指南吗?