1清单
|
ESP-WROOM-32两个 |
L298N电机驱动板 |
万用板 |
|
DHT22温湿度传感器 |
0.96寸4针IIC接口OLED显示屏 |
电机 |
|
自锁式按钮 |
|
|
2实现功能
两块ESP32蓝色指示灯点亮表示蓝牙连接成功。
①显示温湿度值。
②当温度小于等于25℃或者按下按键时,电机停止工作;当温度在25~27℃时,电机一档工作;当温度在27~32℃时,电机二档工作;当温度大于32℃时,电机三档工作。
③也可以通过湿度控制电机,需要把温度控制程序注释,再把湿度程序解注。当湿度小于等于60%或者按下按键时,电机停止工作;当湿度在60~70%时,电机一档工作;当湿度在70~80%时,电机二档工作;当湿度大于80%时,电机三档工作。
④自己修改程序可以控制电机正转和反转。
注意:从机下载完程序后,不要用电脑USB接口供电,使用外接5V电源供电,否则电机工作时会对电脑有影响。
主机程序修改注释,更换电机控制方式。

从机程序中修改高低电平,可以更改电机正反转,还可以修改占空比。

3程序
3.1获取蓝牙MAC地址
通过以下程序获取从机的MAC地址,再填写到主机当中。
#include "esp_bt_main.h"
#include "esp_bt_device.h"
#include "esp32-hal.h"
#include "BluetoothSerial.h"
void setup() {
//设置蓝牙波特率
Serial.begin(115200);
//开启蓝牙
btStart();
//初始化蓝牙协议
esp_bluedroid_init();
//开启蓝牙协议
esp_bluedroid_enable();
}
void loop() {
//获取本机蓝牙地址
auto address = esp_bt_dev_get_address();
if (address) {
for (int i = 0; i < 6; i++) {
// 格式化输出蓝牙6个字节内容
Serial.printf("%02X", address[i]);
if (i < 5) {
Serial.print(":");
}
}
Serial.println();
delay(1000);
}
}
3.2蓝牙主机
#include <Arduino.h>
#include <DHT.h>
#include <Wire.h>
#include <U8g2lib.h>
#include "BluetoothSerial.h"
#include <AsyncTimer.h>
// 硬件配置
#define LEDPIN 2
#define DHTPIN 4
#define BUTTON_PIN 15
#define DHTTYPE DHT22
// 全局对象
DHT dht(DHTPIN, DHTTYPE);
BluetoothSerial SerialBT;
AsyncTimer timer;
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, 22, 21);
// 目标蓝牙设备地址
uint8_t clientAddress[] = {0x34, 0x5F, 0x45, 0xAA, 0xB1, 0x16};
// 传感器数据变量
float temperature = 0.0;
float humidity = 0.0;
unsigned long previousMillis = 0;
const long sensorInterval = 2000;
bool isBluetoothConnected = false;
// 函数声明
void readDHTSensor();
void updateDisplay();
void sendBluetoothSignal();
void onBluetoothData(const uint8_t *buffer, size_t size);
void onDeviceDiscovered(BTAdvertisedDevice* pDevice);
void connectToBluetoothDevice();
void setup() {
Serial.begin(9600);
// 初始化硬件引脚
pinMode(LEDPIN, OUTPUT);
digitalWrite(LEDPIN, LOW);
pinMode(BUTTON_PIN, OUTPUT);
digitalWrite(BUTTON_PIN, LOW);
// 初始化蓝牙
if (!SerialBT.begin("ESP32_Device", true)) {
Serial.println("蓝牙初始化失败");
return;
}
SerialBT.onData(onBluetoothData);
// 开始搜索蓝牙设备
if (SerialBT.discoverAsync(onDeviceDiscovered)) {
Serial.println("开始搜索蓝牙设备...");
// 10秒后停止搜索并尝试连接
timer.setTimeout([] {
Serial.println("停止搜索蓝牙设备");
SerialBT.discoverAsyncStop();
connectToBluetoothDevice();
}, 10000);
} else {
Serial.println("蓝牙搜索启动失败");
}
// 初始化OLED显示屏
u8g2.begin();
u8g2.setPowerSave(0);
u8g2.enableUTF8Print();
// 显示启动信息
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_lunar2);
u8g2.drawStr(0, 30, "启动中...");
u8g2.sendBuffer();
// 初始化DHT传感器
dht.begin();
delay(2000);
}
void loop() {
timer.handle();
// 蓝牙连接状态
if (SerialBT.connected()) {
digitalWrite(LEDPIN, HIGH);
} else {
digitalWrite(LEDPIN, LOW);
}
// 定时读取传感器数据
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= sensorInterval) {
previousMillis = currentMillis;
readDHTSensor();
updateDisplay();
sendBluetoothSignal();
// 串口打印数据用于调试
Serial.printf("温度: %.1f ℃, 湿度: %.1f %%
", temperature, humidity);
}
}
void readDHTSensor() {
humidity = dht.readHumidity();
temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("读取DHT传感器数据失败!");
// 使用上次的有效值
humidity = (isnan(humidity)) ? humidity : 0;
temperature = (isnan(temperature)) ? temperature : 0;
}
}
void updateDisplay() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_lunar2);
// 显示温度
u8g2.setCursor(0, 20);
u8g2.printf("温度: %.1f ℃", temperature);
// 显示湿度
u8g2.setCursor(0, 40);
u8g2.printf("湿度: %.1f %%", humidity);
// 显示蓝牙连接状态
u8g2.setCursor(0, 60);
if (SerialBT.connected()) {
u8g2.printf( "蓝牙: 已连接" );
} else {
u8g2.printf( "蓝牙: 未连接" );
}
u8g2.sendBuffer();
}
void sendBluetoothSignal() {
if (!isBluetoothConnected) return;
int buttonState = digitalRead(BUTTON_PIN);
char signal = 'A'; // 默认信号
//温度控制电机
if (temperature <= 25 || buttonState == HIGH) {
signal = 'A';
} else if (temperature <= 27) {
signal = 'B';
} else if (temperature <= 32) {
signal = 'C';
} else if (temperature <= 100) {
signal = 'D';
}
//湿度控制电机
// if (humidity <= 60 || buttonState == HIGH) {
// signal = 'A';
//} else if (humidity <= 70) {
// signal = 'B';
//} else if (humidity <= 80) {
// signal = 'C';
//} else if (humidity <= 100) {
//signal = 'D';
// }
SerialBT.write(signal);
Serial.printf("发送蓝牙信号: %c
", signal);
}
void onBluetoothData(const uint8_t *buffer, size_t size) {
if (size > 0) {
Serial.print("收到蓝牙数据: ");
Serial.write(buffer, size);
Serial.println();
}
}
void onDeviceDiscovered(BTAdvertisedDevice* pDevice) {
Serial.printf("发现设备: %s [%s] RSSI: %d
",
pDevice->getName().c_str(),
pDevice->getAddress().toString().c_str(),
pDevice->getRSSI());
}
void connectToBluetoothDevice() {
Serial.println("尝试连接蓝牙设备...");
if (SerialBT.connect(clientAddress)) {
isBluetoothConnected = true;
Serial.println("蓝牙连接成功");
} else {
isBluetoothConnected = false;
Serial.println("蓝牙连接失败");
// 30秒后重试连接
timer.setTimeout(connectToBluetoothDevice, 30000);
}
}
3.3蓝牙从机
#include <Arduino.h>
#include "BluetoothSerial.h"
#include <esp_bt_device.h>
#include <ESP32Servo.h>
#define LEDPIN 2
BluetoothSerial SerialBT_A; //定义一个蓝牙对象
volatile int E;
int enA = 13;
int in1 = 12;
int in2 = 14;
//定义一个接收信息方法
void RecvData(const uint8_t *buffer, size_t size)
{
if(size > 0)
{
Serial.write(buffer, size); //打印出来
int anotherAsciiValue = *buffer; // 'B'的ASCII码
char anotherChar = (char)anotherAsciiValue;
E = anotherChar;
SerialBT_A.write(buffer, size);
SerialBT_A.println(" - Slave");
if (E == 'A'){
// 设置 PWM 占空比,控制电机速度
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
Serial.print("I");
delay(500);
}
else if(E == 'B'){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, 80);
Serial.print("F");
delay(500);
}
else if(E == 'C'){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, 115);
Serial.print("G");
delay(500);
}
else if(E == 'D'){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, 150);
Serial.print("H");
delay(500);
}
}
}
void setup() {
pinMode(LEDPIN, OUTPUT);
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
Serial.begin(9600);
SerialBT_A.onData(RecvData); //注册接收回调函数
SerialBT_A.begin("ESP32BT"); //蓝牙的名字叫ESP32xx, 从机模式
auto address = esp_bt_dev_get_address(); //获取本机的蓝牙mac地址
if(address) //找到地址了
{
for(int i=0;i<6;i++)
{
Serial.printf("%02X", address[i]);
if(i<5)
Serial.print(":");
}
Serial.println();
}
Serial.println("The device started, now you can pair it with bluetooth!");
}
void loop()
{
//判断是否有设备连接
if(SerialBT_A.hasClient())
{
digitalWrite(LEDPIN, HIGH);
}
else
{
digitalWrite(LEDPIN, LOW);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
delay(200);
}
#include <Arduino.h>
#include "BluetoothSerial.h"
#include <esp_bt_device.h>
#include <ESP32Servo.h>
#define LEDPIN 2
BluetoothSerial SerialBT_A; //定义一个蓝牙对象
volatile int E;
int enA = 13;
int in1 = 12;
int in2 = 14;
//定义一个接收信息方法
void RecvData(const uint8_t *buffer, size_t size)
{
if(size > 0)
{
Serial.write(buffer, size); //打印出来
int anotherAsciiValue = *buffer; // 'B'的ASCII码
char anotherChar = (char)anotherAsciiValue;
E = anotherChar;
SerialBT_A.write(buffer, size);
SerialBT_A.println(" - Slave");
if (E == 'A'){
// 设置 PWM 占空比,控制电机速度
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
Serial.print("I");
delay(500);
}
else if(E == 'B'){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, 80);
Serial.print("F");
delay(500);
}
else if(E == 'C'){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, 115);
Serial.print("G");
delay(500);
}
else if(E == 'D'){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, 150);
Serial.print("H");
delay(500);
}
}
}
void setup() {
pinMode(LEDPIN, OUTPUT);
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
Serial.begin(9600);
SerialBT_A.onData(RecvData); //注册接收回调函数
SerialBT_A.begin("ESP32BT"); //蓝牙的名字叫ESP32xx, 从机模式
auto address = esp_bt_dev_get_address(); //获取本机的蓝牙mac地址
if(address) //找到地址了
{
for(int i=0;i<6;i++)
{
Serial.printf("%02X", address[i]);
if(i<5)
Serial.print(":");
}
Serial.println();
}
Serial.println("The device started, now you can pair it with bluetooth!");
}
void loop()
{
//判断是否有设备连接
if(SerialBT_A.hasClient())
{
digitalWrite(LEDPIN, HIGH);
}
else
{
digitalWrite(LEDPIN, LOW);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
delay(200);
}
附录
在Arduino IDE中搭建ESP32和ESP8266开发环境
要在Arduino IDE中开发ESP32和ESP8266微控制器,您需要安装适当的硬件支持包。以下是详细步骤:
1 安装Arduino IDE
首先确保您已安装最新版本的Arduino IDE:
从[Arduino官网](https://www.arduino.cc/en/software)下载并安装


使用管理员身份运行打开安装包,再点击我同意。

选择为使用这台电脑的任何人安装,点击下一步。

选择安装位置,点击安装。

安装好了,点击完成。
2 添加ESP32和ESP8266硬件支持
方法一:通过Arduino IDE的板管理器安装
打开Arduino IDE点击”文件”>

3. 在”其他开发板管理器地址”字段中添加以下URL:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
https://dl.espressif.com/dl/package_esp32_index.json
https://git.oschina.net/dfrobot/FireBeetle-ESP32/raw/master/package_esp32_index.json点击”确定”保存。

4. 打开”开发板管理器”
5. 分别搜索”ESP32和ESP8266″


6. 分别找到”ESP32和ESP8266 “并点击”安装”

安装完成后就可以在工具中找到我们的开发板了。如果在线安装比较慢,可以使用其他方法。
方法二:下载安装包
在资料中找到ESP32和ESP8266安装包
通过网盘分享的文件:ESP32和ESP8266
链接: https://pan.baidu.com/s/1WbRYix14iPC4PNCOB2qHwQ 提取码: qy8h

2. 分别已管理员身份运行,安装成功后,就能在工具中找到开发板了。
方法三:ESP32离线安装工具
1. 在首选项中查看项目文件夹地址

2. 打开项目文件夹新建文件hardware
3.在资料中找到ESP32离线安装工具,解压后把两个文件复制到hardware文件中,然后以管理员身份运行arduino-esp32进行安装。安装成功后就可以在工具中找到ESP32开发板了。
4.通过网盘分享的文件:ESP32和ESP8266链接: https://pan.baidu.com/s/12OZs0a-G2W1fcw1DWkY1HQ 提取码: kn2h

3 新建项目
1.点击”文件”>
2. 选择开发板对应的型号。

3. 选择端口

4 测试安装
上传一个简单的示例:
void setup() {
pinMode(2, OUTPUT); // 设置GPIO2为输出模式
}
void loop() {
digitalWrite(2, HIGH); // 点亮LED(高电平)
delay(1000); // 保持1秒
digitalWrite(2, LOW); // 熄灭LED
delay(1000); // 等待1秒
}

指示灯会闪烁,说明安装成功。
常见问题解决
1. 上传失败:
检查板子选择是否正确
检查USB线是否可靠连接
2. 串口不识别:
检查设备管理器中的端口
安装必要的驱动程序
3. 编译错误:
确保安装了所有必要的库
检查Arduino IDE版本是否最新
