ESP32 Vscode 蓝牙接收信息及其发送信息(Android控制)、IIC 切换默认引脚、VL53L0X测试、开启多任务、呼吸灯控制

本文介绍了使用ESP32进行蓝牙开发的经验,包括蓝牙APP的使用、IIC引脚自定义以适应VL53L0X激光测距模块、LED呼吸灯控制以及震动检测任务的实现。通过代码注释详细解析了ESP32的蓝牙通信、硬件配置和传感器操作。同时,展示了如何检测I/O输入状态并进行串口通信。
摘要由CSDN通过智能技术生成
  1. ESP32 蓝牙接收发送消息
    最近在使用ESP32的蓝牙开发,总结自己的学习笔记,注:本笔记作为自己学习参考,可能有不规范的地方,如有请多多指正。 蓝牙APP如下图所示
    具体如以下位代码注释。
  2. EPS32 IIC切换引脚
    由于硬件中默认的IIC硬脚被占用,但是VL53L0X 激光测距模块也需要IIC ,于是只有改IIC的引脚,具体见代码注释。
  3. 在整个测试文件中包括开启震动检测任务;LED呼吸灯状态显示任务。具体见代码注释,其原理自行百度。
  4. ESP32 输入检测 在文件中对于I/O的输入检测,首先初始化为输入上拉设置,之后就直接检测I/O的电平状态。
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SPIDevice.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "Adafruit_VL53L0X.h"
#include <Filters.h>
#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
#define I2C_SDA 18              //自定义IIC——SDA
#define I2C_SCL 19              //自定义IIC——SCL

BluetoothSerial SerialBT;
#define LED_contorl   23        //LED状态显示
#define vibrator_contorl  27    //震动检测
Adafruit_VL53L0X lox = Adafruit_VL53L0X();  
//LED控制
 int LEDfreq = 5000;           //频率
 int LEDChanne = 0;            //通道
 int LED_resolution = 8;       //分辨率

void vibrator_task(void *parameter);
void Run_State_Task(void *parameter);
void Run_state();
#if (SSD1306_LCDHEIGHT != 32)
 #error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup() {
  pinMode(vibrator_contorl,INPUT_PULLUP);             //内部上拉
  ledcSetup(LEDChanne, LEDfreq, LED_resolution);      // 设置通道
  ledcAttachPin(LED_contorl, LEDChanne);              // 将通道与对应的引脚连接 

  Serial.begin(115200);                               //开启串口
  SerialBT.begin("ESP32test");                        //开启蓝牙
  Serial.println("The device started, now you can pair it with bluetooth!");  //串口打印消息

  delay(1000);
  Wire.begin(I2C_SDA,I2C_SCL);                        //开启IIC
  if (!lox.begin()) 
  {
    // while(1)
    // {
    //   Serial.println(F("Failed to boot VL53L0X"));
    // }
  }
  xTaskCreate(vibrator_task,"vibrator_task",15000,NULL,1,NULL);   //创建网络任务
  xTaskCreate(Run_State_Task,"Run_State_Task",1000,NULL,1,NULL);  //创建状态指示任务
  // put your setup code here, to run once:
}
/*********************************************************
 *  函数功能:状态指示灯
 *  输入参数:无
 *  输    出:无
 * ******************************************************/
void Run_state()
{
  for(int dutyCycle = 50; dutyCycle <= 250;dutyCycle = dutyCycle + 5)
    {
      ledcWrite(LEDChanne,dutyCycle);
      delay(20);
    }
    for (int dutyCycle = 250; dutyCycle >= 50;dutyCycle = dutyCycle - 5)
    {
      ledcWrite(LEDChanne,dutyCycle);
      delay(20);
    }
}
void loop() {
  char text;
  if (SerialBT.available()) {           //获取蓝牙状态
    text = SerialBT.read();             //读取蓝牙接收信息
    SerialBT.print(text);               //将接收到的信息发送出去
    Serial.print(text);                 //串口发送接收消息
  }
  vTaskDelay(1 / portTICK_RATE_MS);     //延时
  // put your main code here, to run repeatedly:
  VL53L0X_RangingMeasurementData_t measure;
  lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout!
  if (measure.RangeStatus != 4) {  // phase failures have incorrect data
      Serial.print("now distance:");
      Serial.print(measure.RangeMilliMeter);
      // SerialBT.print(measure.RangeMilliMeter);
      Serial.print("mm");
      Serial.print("\r\n");
  } else {
    return;
  }
}
void vibrator_task(void *parameter)
{
  int munber =0;
  for (;;)
  {
    if(digitalRead(vibrator_contorl)==0)
    {
      if(digitalRead(vibrator_contorl)==0)
      {
        printf("\n\t vibrator coming \n\t");
      }
    }
    munber ++;
    SerialBT.printf("measure.RangeMilliMeter:%d\n\r",munber);
    delay(1);
  }
  vTaskDelete(NULL);
}
void Run_State_Task(void *parameter)
{
  for(;;)
  {
    Run_state();
  }
  vTaskDelete(NULL);
}

附录:
1、蓝牙APP ,在百度中直接可以下载,这个百度搜索比较多就不放下载连接了

2、调试信息 蓝牙手机端
在这里插入图片描述3、上位机端显示
在这里插入图片描述

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于串口模拟IIC总线去控制VL53L0X激光传感器的代码示例: ```c++ #include <SoftwareSerial.h> #include <Wire.h> #define SDA 2 #define SCL 3 SoftwareSerial mySerial(9, 10); // RX, TX void setup() { Serial.begin(9600); mySerial.begin(9600); Wire.begin(SDA, SCL); pinMode(SDA, OUTPUT); pinMode(SCL, OUTPUT); } void loop() { readDistance(); delay(1000); } void readDistance() { byte dataToSend[3] = {0x00, 0x01, 0xE8}; byte dataReceived[2]; mySerial.write(0x29); mySerial.write(dataToSend, 3); Wire.beginTransmission(0x29); Wire.write(dataToSend[0]); Wire.write(dataToSend[1]); Wire.write(dataToSend[2]); Wire.endTransmission(); delay(70); mySerial.write(0x29); mySerial.write(0x00); Wire.requestFrom(0x29, 2); dataReceived[0] = Wire.read(); dataReceived[1] = Wire.read(); int distance = (dataReceived[0] << 8) | dataReceived[1]; Serial.print("Distance: "); Serial.print(distance); Serial.println(" mm"); } ``` 在代码中,我们首先定义了SDA和SCL引脚的编号。然后在`setup()`函数中初始化串口、IIC总线并设置SDA和SCL引脚为输出模式。在`loop()`函数中调用`readDistance()`函数来读取距离值,并延时1秒。 `readDistance()`函数中,首先定义了要发送给传感器的3个字节的数据,其中第一个字节是命令字节,第二个和第三个字节是用于设置传感器的参数。然后使用串口模拟IIC总线发送数据,并等待70毫秒以便传感器有时间处理数据。接着再次使用串口模拟IIC总线发送命令字节,并使用Wire库从传感器读取2个字节的数据。最后将读取到的2个字节转换为距离值,并打印输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值