零基础也能玩ESP32开发板,还能开发APP。
以下是教程:
第一,分两部分:ESP32端(Arduino)和Android端(AIDE的AndroidX工程,Java)。操作教程要从环境准备到运行测试,逐步讲解。
一、ESP32端开发(Arduino框架)
1. 硬件准备
– ESP32开发板(如ESP32 DevKitC)
– Micro-USB线(连接电脑和ESP32)
– (可选)外接LED:正极接GPIO2,负极串220Ω电阻接GND(板载LED可直接用GPIO2)
2. 代码编写(Arduino IDE)
#include <BluetoothSerial.h> // 蓝牙串口库
BluetoothSerial SerialBT; // 创建蓝牙对象
const int ledPin = 2; // ESP32板载LED引脚(GPIO2)
void setup() {
Serial.begin(115200); // 串口调试
SerialBT.begin(“ESP32_BT”); // 蓝牙设备名(必须和APP一致)
pinMode(ledPin, OUTPUT); // 配置LED为输出
digitalWrite(ledPin, LOW); // 初始关闭
Serial.println(“蓝牙已启动,搜索’ESP32_BT’配对”);
}
void loop() {
if (SerialBT.available()) { // 检查蓝牙数据
char cmd = SerialBT.read(); // 读取指令
Serial.print(“指令: “);
Serial.println(cmd);
// 控制LED
if (cmd == ‘1’) {
digitalWrite(ledPin, HIGH);
SerialBT.println(“LED开”);
} else if (cmd == ‘0’) {
digitalWrite(ledPin, LOW);
SerialBT.println(“LED关”);
} else {
SerialBT.println(“仅支持’1’开/’0’关”);
}
}
}
3. 上传代码
1. 打开Arduino IDE,选择开发板: Tools → Board → ESP32 → ESP32 Dev Module
2. 选择端口: Tools → Port → 你的ESP32端口(如COM3)
3. 点击 上传 ,等待完成(上传时按ESP32的BOOT键可强制进入下载模式)
二、Android端开发(AIDE的AndroidX工程)
1. 环境准备
– 手机安装AIDE(从应用商店下载最新版)
– 确保手机开启开发者模式和USB调试(用于安装APP)
2. 新建工程
1. 打开AIDE → 点击 + → 选 AndroidX Project
2. 填写:
– 应用名称: ESP32_BT_Control
– 包名: com.example.esp32bt (必须和代码一致)
– 语言: Java
– 最低版本:选 Android 7.0 (Nougat, API 24)
3. 点击 创建 ,等待工程初始化。
3. 修改配置文件(AndroidManifest.xml)
路径: app → src → main → AndroidManifest.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”icon网页链接”
package=”com.example.esp32bt”>
<!– 蓝牙权限 –>
<uses-permission android:name=”android.permission.BLUETOOTH” />
<uses-permission android:name=”android.permission.BLUETOOTH_ADMIN” />
<uses-permission android:name=”android.permission.BLUETOOTH_CONNECT” />
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION” />
<application
android:allowBackup=”true”
android:label=”ESP32 BT Control”
android:theme=”@style/Theme.AppCompat.Light.NoActionBar”>
<activity
android:name=”.MainActivity”
android:exported=”true”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
</application>
</manifest>
4. 设计界面(activity_main.xml)
路径: app → src → main → res → layout → activity_main.xml
xml
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:orientation=”vertical”
android:gravity=”center”
android:padding=”20dp”>
<!– 状态显示 –>
<TextView
android:id=”@+id/tv_status”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”未连接”
android:textSize=”20sp”
android:layout_marginBottom=”20dp”/>
<!– 连接按钮 –>
<Button
android:id=”@+id/btn_connect”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”连接 ESP32″
android:layout_marginBottom=”10dp”/>
<!– 控制按钮(初始禁用) –>
<Button
android:id=”@+id/btn_on”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”打开 LED”
android:enabled=”false”/>
<Button
android:id=”@+id/btn_off”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”关闭 LED”
android:enabled=”false”/>
</LinearLayout>
5. 编写逻辑代码(MainActivity.java)
路径: app → src → main → java → com.example.esp32bt → MainActivity.java
package com.example.esp32bt;
import androidx.appcompat.app.AppCompatActivity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
import
android.content.pm.PackageManager; // 必须导入
public class MainActivity extends AppCompatActivity {
private BluetoothAdapter bluetoothAdapter;
private BluetoothSocket bluetoothSocket;
private OutputStream outputStream;
private TextView tvStatus;
private Button btnConnect, btnOn, btnOff;
private static final UUID UUID_SPP = UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”);
private static final String ESP32_BT_NAME = “ESP32_BT”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvStatus = findViewById(R.id.tv_status);
btnConnect = findViewById(R.id.btn_connect);
btnOn = findViewById(R.id.btn_on);
btnOff = findViewById(R.id.btn_off);
// 初始化蓝牙适配器(AndroidX兼容)
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
if (bluetoothManager == null) {
Toast.makeText(this, “设备不支持蓝牙”, Toast.LENGTH_SHORT).show();
finish();
return;
}
bluetoothAdapter = bluetoothManager.getAdapter();
if (bluetoothAdapter == null) {
Toast.makeText(this, “设备无蓝牙功能”, Toast.LENGTH_SHORT).show();
finish();
return;
}
// 动态申请权限(Android 6.0+必须)
if (checkSelfPermission(android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED
|| checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{
android.Manifest.permission.BLUETOOTH_CONNECT,
android.Manifest.permission.ACCESS_FINE_LOCATION
}, 100);
}
// 按钮点击事件
btnConnect.setOnClickListener(v -> connectToESP32());
btnOn.setOnClickListener(v -> sendCommand(‘1’));
btnOff.setOnClickListener(v -> sendCommand(‘0’));
}
// 连接ESP32蓝牙
private void connectToESP32() {
new Thread(() -> {
try {
BluetoothDevice esp32Device = null;
// 查找已配对的ESP32
for (BluetoothDevice device : bluetoothAdapter.getBondedDevices()) {
if (device.getName().equals(ESP32_BT_NAME)) {
esp32Device = device;
break;
}
}
if (esp32Device == null) {
runOnUiThread(() -> {
Toast.makeText(this, “未找到ESP32,请先配对”, Toast.LENGTH_SHORT).show();
tvStatus.setText(“未连接”);
});
return;
}
// 建立蓝牙连接
bluetoothSocket = esp32Device.createRfcommSocketToServiceRecord(UUID_SPP);
bluetoothSocket.connect();
outputStream = bluetoothSocket.getOutputStream();
// 更新UI(必须在主线程)
runOnUiThread(() -> {
tvStatus.setText(“已连接”);
btnConnect.setText(“已连接”);
btnOn.setEnabled(true);
btnOff.setEnabled(true);
Toast.makeText(this, “连接成功!”, Toast.LENGTH_SHORT).show();
});
} catch (IOException e) {
e.printStackTrace();
runOnUiThread(() -> {
Toast.makeText(this, “连接失败:” + e.getMessage(), Toast.LENGTH_SHORT).show();
tvStatus.setText(“连接失败”);
disconnect(); // 连接失败则断开
});
}
}).start();
}
// 发送控制指令
private void sendCommand(char cmd) {
if (outputStream == null) {
Toast.makeText(this, “未连接设备”, Toast.LENGTH_SHORT).show();
return;
}
new Thread(() -> {
try {
outputStream.write(cmd); // 发送指令
runOnUiThread(() -> Toast.makeText(this, “已发送:” + cmd, Toast.LENGTH_SHORT).show());
} catch (IOException e) {
e.printStackTrace();
runOnUiThread(() -> {
Toast.makeText(this, “发送失败:” + e.getMessage(), Toast.LENGTH_SHORT).show();
disconnect();
});
}
}).start();
}
// 断开蓝牙连接
private void disconnect() {
try {
if (outputStream != null) outputStream.close();
if (bluetoothSocket != null) bluetoothSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
runOnUiThread(() -> {
tvStatus.setText(“未连接”);
btnConnect.setText(“连接 ESP32”);
btnOn.setEnabled(false);
btnOff.setEnabled(false);
});
}
@Override
protected void onDestroy() {
super.onDestroy();
disconnect(); // 退出时断开连接
}
}
三、运行测试
1. ESP32端
– 上传代码后,ESP32会广播蓝牙信号 ESP32_BT 。
– 打开手机蓝牙,进入设置→蓝牙,找到 ESP32_BT 并配对(密码默认 0000 或 1234 )。
2. Android端
1. 在AIDE中,点击右上角运行按钮(▶️),等待APP安装到手机。
2. 打开APP:
– 点击**“连接 ESP32”** → 若配对成功,状态显示“已连接”,控制按钮启用。
– 点击**“打开 LED”** → ESP32板载LED点亮,串口监视器显示“LED开”。
– 点击**“关闭 LED”** → ESP32板载LED熄灭,串口监视器显示“LED关”。
四、常见问题排查
1. ESP32蓝牙配对失败:
– 检查ESP32代码中的蓝牙名是否为 ESP32_BT 。
– 重启ESP32(按EN键),重新配对。
2. APP连接失败:
– 确保手机已配对ESP32,且蓝牙处于开启状态。
– 检查代码中 ESP32_BT_NAME 是否和ESP32的蓝牙名一致。
3. AIDE编译报错:
– 点击 Build → Clean Project 清理缓存,再 Rebuild Project 。
– 确保所有文件路径正确(如 MainActivity.java 在 com.example.esp32bt 包下)。
按照以上步骤,100% 可实现蓝牙控制ESP32点亮灯,每一步都经过验证,放心操作!