基于ESP32单片机的蓝牙环境检测手机APP设计

  • 0、毕业设计选题原则说明(重点)
  • 1、项目简介
  • 1.1 系统构成
  • 1.2 系统功能
  • 1.3 演示视频
  • 2、部分电路设计
  • 2.1 esp32单片机核心板电路设计
  • 2.2 DHT11温湿度检测电路设计
  • 2.3光照检测电路设计
  • 3、ESP32代码展示
  • 3.1 系统初始化
  • 3.2 ESP32与手机APP蓝牙通信
  • 3.3 DHT11读取温湿度数据
  • 4、Anrdoid Studio APP代码设计
  • 4.1、创建网络服务器
  • 4.2、手机APP与单片机通信


0、毕业设计选题原则说明(重点)

  • 选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的!
  • 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。
  • 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业证而已!!!
  • 当你明白这一点后,作毕业设计的要求就是在满足老师的要求后,越简单越好,这样不但容易去做,而且你自己也容易去理解,掌握,同样也能花最少的钱!!!
  • 满足老师的要求,这个没办法,毕竟他是决定你是否能通过答辩的人。
  • 每年都有很多同学找到我的时候,后悔当初为什么要把功能写的那么复杂,后悔没有提前找我咨询一下!所以在这里提醒同学们,提交开题报告之前一定

1、项目简介

1.1 系统构成

  • esp32单片机最小系统+dht11温湿度传感器+水位传感器+光照采集电路+继电器控制电路+电源电路构成。

1.2 系统功能

  • 功能介绍:
  • 1、采集温度、湿度、光照强度、降水量数据
  • 2、使用手机app实时显示湿度、光照强度、降水量数据
  • 3、可以设置温度,湿度,光照,降水量的报警阈值
  • 4、数据超过阈值时,进行报警,比如温度超过报警阈值30,蜂鸣器报警

1.3 演示视频

2、部分电路设计

2.1 esp32单片机核心板电路设计

  • ESP32单片机是一款基于改进的Tensilica LX6微架构的32位双核处理器 SoC,配备2.4 GHz Wi-Fi和蓝牙功能。由于其低功耗、高速度和广泛的应用适用性而被广泛应用。
  • 处理器与内存:采用双核处理器设计,包括一个主频高达240MHz的主核和一个协处理器核心,通常配备约520KB到4MB的RAM,包括内部RAM和外部PSRAM,用于存储程序和数据。
    无线通信:内置Wi-Fi和蓝牙功能,支持IEEE 802.11 b/g/n Wi-Fi标准(工作在2.4GHz频段)以及蓝牙4.2(包括BR/EDR和BLE),使得ESP32能够轻松连接到无线局域网络,进行Internet访问、局域网通信和远程控制,同时也能与各种蓝牙设备进行通信。
    外设与接口:拥有丰富的外设和接口,包括最多34个可编程GPIO引脚、UART、SPI、I2C、I2S、PWM等多种通信协议支持,以及12位ADC(最多18通道)、8位DAC(2通道)、触摸传感器(最多10通道)等模拟和数字信号处理能力。
    低功耗特性:支持深度睡眠模式,其中所有非必要的电路都被关闭,以最小化功耗。此外,Wi-Fi模块和蓝牙模块都支持功耗优化功能,可以在数据传输时限制功率消耗,从而延长电池寿命。ESP32还具有一个低功耗的RTC模块,可在芯片进入深度睡眠模式时继续运行,用于提供时间戳或执行时间相关的任务。

单片机最小系统原理图如下图所示:

基于ESP32单片机的蓝牙环境检测手机APP设计_智能手机

实物图:

基于ESP32单片机的蓝牙环境检测手机APP设计_毕业设计_02

2.2 DHT11温湿度检测电路设计

  • DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复 合传感器。它包括一个电阻式感湿元件和一个 NTC 测温元件。每个 DHT11 传 感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数,用户 无需重新校准。单线制串行接口,使系统集成变得简易快捷。超小的体积、 极低的功耗,信号传输距离可达 20 米以上。

其具体电路原理图如下图所示:

基于ESP32单片机的蓝牙环境检测手机APP设计_课程设计_03

  • 实物图:
  • 基于ESP32单片机的蓝牙环境检测手机APP设计_esp32_04

2.3光照检测电路设计

  • 光敏电阻为一种无结(PN结)器件,光敏特性主要利用了光导电体导电特性。 当光敏电阻在受到光的照射时,如果光子能量大于本征半导体材料的禁带宽度,则价带中的电子吸收一个光子后就足以跃迁到导带,并产生一个自由电子和一个自由空穴,从而使其导电性能增加,电阻值下降。光照停止,自由电子与空穴逐渐复合,电阻又恢复原值。光敏电阻的电阻值会随着入射光的强弱而发生改变;
  • 即当入射光较强时,光敏电阻的阻值会明显减小;当入射光变弱时,光敏电阻的电阻会显著增大。

其具体电路原理图如下图所示:

基于ESP32单片机的蓝牙环境检测手机APP设计_esp32_05


实物图如下:

基于ESP32单片机的蓝牙环境检测手机APP设计_esp32_06


3、ESP32代码展示

3.1 系统初始化

/* 系统初始化 */
void setup() {
  Serial.begin(115200);

  BEEP_INIT;  /* 蜂鸣器初始化 */
  BEEP_ON     /* 蜂鸣器打开 */
  delay(1000);  /* 延时 */
  BEEP_OFF     /* 蜂鸣器关闭 */
  DHT11Init();  /* dht11 温湿度传感器初始化 */
  
  WiFiAPPInit();  /* wifi模式初始化 */
}

3.2 ESP32与手机APP蓝牙通信

/* 处理与app通信数据 */
static void DealWithAppData(WiFiClient *p_client, DeviceData *p_data, uint8_t *rcv_data, uint8_t *send_data, uint8_t len)
{
  if(rcv_data[0] == 0x85)
  {
    if(rcv_data[1] == 0x09)
    {
      p_data->yuzhi_temp = rcv_data[2];     //温度阈值
      p_data->yuzhi_humi = rcv_data[3];     //湿度阈值
      p_data->yuzhi_light = rcv_data[4];    //光照阈值
      p_data->yuzhi_water = rcv_data[5];    //水位阈值
      p_client->write(send_data, len);      //向手机发送数据
    }
  }
}

3.3 DHT11读取温湿度数据

uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)    
{        
  uint8_t buf[5];
  uint8_t i;
  DHT11_Rst();
  if(DHT11_Check()==0)
  {
    for(i=0;i<5;i++)//读取40位数据
    {
      buf[i]=DHT11_Read_Byte();
    }
    if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    {
      *humi=buf[0];
      *temp=buf[2];
    }
    
  }else return 1;
  return 0;     
}

4、Anrdoid Studio APP代码设计

4.1、创建网络服务器

public void connect_server() {
        public_info.buf_length = 8;
        public_info.buf = new byte[public_info.buf_length];
        public_info.need_send_cmd = false;
        public_info.recv_thread_exit = false;
        public_info.info_thread_exit = false;
        public_info.temp_yuzhi = 10;

        if (public_info.connect_cnt > 0)
            public_info.info_thread_exit = true;              //如果之前已经有连接了,需要断开后再连接
        //创建网络线程,并在线程中连接服务器
        client_info_thread = new clientInfoThread(netMessageHandle);
        client_info_thread.start();
    }

4.2、手机APP与单片机通信

public void send_buffer_to_network(byte []msg,byte length) {
        while (true) {
          if (public_info.need_send_cmd) {         //如果正在发送数据,则要等待它完成再做操作
            try {
                Thread.sleep(100);         //100ms延时
            }catch (Exception ex) {}
            continue;
          }
          break;
        }
        //设置要发送的数据和长度
        public_info.buf_length = length;
        public_info.buf = msg;
        public_info.need_send_cmd = true;
    }