Skip to content

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. 准备工作

  1. 注册与登录:访问官方平台 http://appinventor.mit.edu/ 并注册一个新账户。
  2. 安装伴侣应用 (AI2 Companion):在安卓手机上安装“MIT AI2 Companion”应用,用于实时测试您开发的App。
  3. 配对设备:在开始前,请确保您的蓝牙模块(如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 端设计

  1. 设计界面 (Designer)

    • 拖入一个 Button 组件,命名为 btnOn,设置文本为“开灯”。
    • 拖入另一个 Button 组件,命名为 btnOff,设置文本为“关灯”。
    • 拖入一个 ListPicker 组件,命名为 lstDevices,设置文本为“选择设备”。
    • 拖入一个 BluetoothClient 组件(在“连接”分类中)。
  2. 编写逻辑 (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 端设计

  1. 设计界面 (Designer)

    • 拖入一个 Button 组件,命名为 btnOn,设置文本为“开灯”。
    • 拖入另一个 Button 组件,命名为 btnOff,设置文本为“关灯”。
    • 拖入一个 Web 组件(在“传感器”分类中)。
  2. 编写逻辑 (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)合并成一份完整的实战指南吗?