两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

阿里云教程2个月前发布
16 0 0

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

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电源供电,否则电机工作时会对电脑有影响。

主机程序修改注释,更换电机控制方式。

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

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

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

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)下载并安装

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

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

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

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

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

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

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

安装好了,点击完成。

添加ESP32和ESP8266硬件支持

方法一:通过Arduino IDE的板管理器安装

打开Arduino IDE点击”文件”>

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

    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点击”确定”保存。

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

     4. 打开”开发板管理器”

     5. 分别搜索”ESP32和ESP8266″

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

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

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

安装完成后就可以在工具中找到我们的开发板了。如果在线安装比较慢,可以使用其他方法。

方法二:下载安装包

在资料中找到ESP32和ESP8266安装包

通过网盘分享的文件:ESP32和ESP8266

链接: https://pan.baidu.com/s/1WbRYix14iPC4PNCOB2qHwQ 提取码: qy8h

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

      2. 分别已管理员身份运行,安装成功后,就能在工具中找到开发板了。

方法三:ESP32离线安装工具

    1. 在首选项中查看项目文件夹地址

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

     2. 打开项目文件夹新建文件hardware两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

 

     3.在资料中找到ESP32离线安装工具,解压后把两个文件复制到hardware文件中,然后以管理员身份运行arduino-esp32进行安装。安装成功后就可以在工具中找到ESP32开发板了。

     4.通过网盘分享的文件:ESP32和ESP8266链接: https://pan.baidu.com/s/12OZs0a-G2W1fcw1DWkY1HQ 提取码: kn2h两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

3 新建项目

     1.点击”文件”>两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

 

    2. 选择开发板对应的型号。

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

     3.  选择端口

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

测试安装

上传一个简单的示例:



void setup() {
  pinMode(2, OUTPUT);  // 设置GPIO2为输出模式
}
 
void loop() {
  digitalWrite(2, HIGH);  // 点亮LED(高电平)
  delay(1000);            // 保持1秒
  digitalWrite(2, LOW);   // 熄灭LED
  delay(1000);            // 等待1秒
}

两块ESP32模块蓝牙互联通过温湿度传感器控制电机转速

指示灯会闪烁,说明安装成功。

常见问题解决

1. 上传失败:

检查板子选择是否正确

检查USB线是否可靠连接

2. 串口不识别:

检查设备管理器中的端口

安装必要的驱动程序

3. 编译错误:

确保安装了所有必要的库

检查Arduino IDE版本是否最新

 

© 版权声明

相关文章

暂无评论

none
暂无评论...