ESP32-C3 应用 篇(实例二、通过蓝牙将传感器数据发送给手机,手机端控制 SK6812 LED)

2023-11-13

ESP32-C3 蓝牙部分我们学习了GATT,本文尝试使用蓝牙做一个简单的小应用。

前言

前面文章说过,蓝牙协议博主了解不是很深入,只进行一些基础的了解,示例的测试,和初学者一样,基本上蓝牙专栏系列博文都是一步一步摸索过来的,功夫不负有心人,到目前为止,多多少少对蓝牙 GATT 有了一定的认识。

那么我们今天就要学以致用,使用 ESP32-C3 的蓝牙 GATT,做一个数据通信的应用实例。

与本实例相关的 ESP32-C3 专栏系列博文如下:

ESP32-C3 入门专栏目录【导航】ESP32-C3 入门教程目录 【快速跳转】
❤️
ESP32-C3学习 蓝牙 篇系列博文连接:

❤️
测试使用的开发板:
自己画一块ESP32-C3 的开发板(第一次使用立创EDA)(PCB到手)

❤️
测试使用的开发环境:
ESP32-C3 VScode开发环境搭建(基于乐鑫官方ESP-IDF——Windows和Ubuntu双环境)
❤️
蓝牙篇系列相关博文:
ESP32-C3 学习测试 蓝牙 篇(一、认识 ESP-IDF 的蓝牙框架、简单的了解蓝牙协议栈)
ESP32-C3 学习测试 蓝牙 篇(二、蓝牙调试APP、开发板手机连接初体验)
ESP32-C3 学习测试 蓝牙 篇(三、认识蓝牙 GATT 协议)
ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)
ESP32-C3 学习测试 蓝牙 篇(五、添加 characteristic)
ESP32-C3 学习测试 蓝牙 篇(六、添加 Service)
ESP32-C3 学习测试 蓝牙 篇(七、GATT 数据通信 — 发送自定义数据)
❤️
本应用涉及的博文除了上面之外还有:
ESP-IDF工程结构说明:
认识 ESP-IDF-v4.3+工程结构(ESP32-C3应用调整示例)
设备和传感器驱动:
ESP32-C3入门教程 基础篇(四、I2C总线 — 与SHT21温湿度传感器通讯)
ESP32-C3入门教程 基础篇(五、RMT应用 — 控制 SK6812全彩RGB 灯)


一、整体框架

整个实例功能还是比较简单的,毕竟我们也刚接触 ESP32-C3 的蓝牙,直接用下图表示:

在这里插入图片描述
.

安卓手机 APP 我得考虑一下 ,因为我是 java 小白,虽然照猫画虎做过APP, 有时间当然搞起来没问题,但是得花些时间,而博主最近时间不太够用…… 所以这个,再看把 = =!

废话不多说,我们直接开始……

二、数据传输部分

先实现把传感器数据上传至手机的部分功能。

2.1 添加温湿度驱动组件

在我的博文 认识 ESP-IDF-v4.3+工程结构(ESP32-C3应用调整示例)中提到过,如何调整一个工程以及如何添加自己的组件代码,我们按照步骤先把需要的组件添加。

组件的添加,我们如果熟悉工程架构,可以直接把文件夹复制到工程中,那我们温湿度驱动组件,我们先用一下标准的组件添加方式,如下图:

在这里插入图片描述

当然,这里只是搭建了一个标准的组件框架,我们得把以前的 sht21 驱动代码复制到这两个文件中。

2.2 传感器数据传输程序

驱动代码移植好了,我们要使用起来,这个地方主要就是在于怎么把数据传输出去,在蓝牙系列的文章ESP32-C3 学习测试 蓝牙 篇(七、GATT 数据通信 — 发送自定义数据)中我们做过分析,我们如何传输自定义数据。

所以在那个基础之上我做了如下处理:

case ESP_GATTS_READ_EVT:
            ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_READ_EVT, conn_id %d, trans_id %d, handle %d\n", 
                                    param->read.conn_id, param->read.trans_id, param->read.handle);
            // ESP_LOGI(GATTS_TABLE_TAG, "VAL_B %d\n", heart_rate_handle_table[IDX_CHAR_VAL_B]);
            if(heart_rate_handle_table[IDX_CHAR_VAL_B] == param->read.handle){
                int thread;
                float T = 0;
                float H = 0;

                char th_data[20];
                thread = SHT2X_THMeasure(I2C_MASTER_NUM);
                if(thread == ESP_ERR_TIMEOUT){}
                else{
                    T = (getTemperature()/100.0);
                    H = (getHumidity()/100.0);
                }
                sprintf(th_data,"tem:%.2f , hum:%.2f",T,H);
              esp_ble_gatts_set_attr_value(param->read.handle,sizeof(th_data),(uint8_t*)th_data);
            }
            break;

温湿度的逻辑不是一定得写在这里,程序任何地方都可以。需要连续读取2才才能正确的读到实时数据。

请看下面详细说明。

再次说明: ESP_GATTS_READ_EVT 事件

这里要先再次说明一个问题,就是回调函数中断的事件,我们这个 ESP_GATTS_READ_EVT 事件。

ESP_GATTS_READ_EVT 事件,回调函数的事件,是在事件发生之后。回调函数中的事件都是在事件发生了,才会触发的!

READ 读取的数据不是靠回调函数里面写逻辑给的数据,而是一直存在的 characteristic 的 value 值。 事件只是告诉你有读事件发生!

改变 characteristic 的 value 值的逻辑,可以在程序中任意地方修改,手机读取时候只取当时的 characteristic 的 value 值。

在上一篇博文

在这里插入图片描述
.

回到我们上面给出的代码要注意的地方:

1、 是用上面的方式,需要在下一次读取的时候才能读到上一次温湿度的值,如果需要实时数据,可以采取连续读取2次的方式(下文有优化代码);

这个是一个逻辑问题,就是如何传输实时数据,比如可以另外创建一个任务,不停的周期性读取温湿度数据,放入characteristic 的 value 中。 那么每次 READ 就可以直接读取到最新的 温湿度数据。

2、还是需要注意示例中 value 的长度不能操作 20 字节(我们上一篇文章测试的结果);

在上面程序中使用了组合字符串的 sprintf 函数,注意长度不能过长。

2.3 功能测试

我们完成上述代码,测试一下。

记得添加了新的组件,最好是make clean 一下,这里就是清除一下编译,重新编译。

烧录测试:

在这里插入图片描述

数据传输成功!

再次说明这个数据逻辑问题,可以自行处理,我这里计划读取实时数据时候连续读取2次,取第2次的数据。

2.4 代码优化

本来想着让大家自己测试的,后来想想这种连续读取2次确实不太妥当,干脆自己改个,反正简单:

就是新建一个任务,如下图:

在这里插入图片描述

READ 事件中可以声明都不用做:

在这里插入图片描述

本以为没问题,没想到= =!

连接的时候就出问题了,确实不太明白:

在这里插入图片描述

后来考虑了一下,我直接在手机与设备连接上了以后再创建任务,断开了之后再删除任务不是挺好的?

于是改了一下任务创建的位置:

在 GATT 回调函数,找到设备连接上的事件,进行对应的修改(图中有点问题,下文有修改说明):

在这里插入图片描述

感觉可以,测试一下:

在这里插入图片描述

OK! 第一次就是读到已经更新过的值!

但是上面的代码 还是有个问题,就是断开链接删除任务的时候会出错,上面犯了一个错误,vTaskDelete() 的参数应该是任务句柄,我在创建任务的时候没有给任务句柄。

具体原因可以查看我的FreeRTOS 博文:

FreeRTOS记录(二、FreeRTOS任务API认识和源码简析)

所以代码还是得修改一下,如下图:

在这里插入图片描述

在这里插入图片描述
.

❤️ 到这里,我们成功实现了手机通过蓝牙实时读取开发板的温湿度数据!

额外说明:

这个地方还是得说一下,我通过创建任务的的方式可以读取实时数据,但是我多次测试下来,有时候还是会出问题,在连接的时候有可能重启,但是因为会立即重启恢复,所以到不影响使用测试。

还有一个就是设置的 THread 任务栈太小了,后来把任务放到 2048 ,就没有栈溢出的问题。

出问题的情况就是 THread 任务,如果任务时正常创建,然后手动断开,都没有问题,只有在连接过后,也没有手动断开,过了很长一段时间可能会出现。

猜测原因:估计就是在没有正常连接的时候不应该对 characteristic 的 value 进行修改操作(后面知道原因再来更新说明)。

三、控制部分

控制部分我们的目标是通过手机控制板载的 SK6812全彩RGB 灯。

3.1 添加LED驱动组件

首先还是LED驱动的组件添加,上面我们延时了通过标准架构方式添加组件,在熟悉组件的基础之上,我们可以直接把文件复制过来。

在这里插入图片描述

复制过来,我们得做个基础的测试:

具体的使用方式可以查看专栏中的博文《ESP32-C3入门教程 基础篇(五、RMT应用 — 控制 SK6812全彩RGB 灯)》,在这个工程中:

在这里插入图片描述

做个简单的测试,在我们上面的温湿度读取任务中,切换一下灯的状态:

在这里插入图片描述

上面给出的代码:

1、 一旦手机与开发板建立蓝牙连接,LED灯红绿蓝三色切换;

这里其实知识为了测试一下驱动是否正常,但是这里让我想到,也可以使用一个单独的LED来表示蓝牙连接状态,无蓝牙连接一种状态,有蓝牙连接另一种状态;

2、在 ESP-IDF 中使用 FreeRTOS 的延时函数vTaskDelay,需要得到精准延时,需要加上pdMS_TO_TICKS

习惯了 stm32 中 FreeRTOS 的vTaskDelay 的使用容易在这里出问题,在上面vTaskDelay(pdMS_TO_TICKS(2000));才是延时2s,如果不加时间不准确。

3、在上面创建 THread 任务的时候,给的任务栈是 1024 ,但是还是会有栈溢出,所以这里根据需要可以适当加大。

测试正常,SK6812 灯驱动添加成功。

3.2 控制 SK6812 程序

驱动添加成功,现在来考虑一下如何使用蓝牙控制开发板的 SK6812 。

我们使用了一个 characteristic 来做传感器数据传输,我们同样可以用一个 characteristic 来做数据接收,这次我们使用一个只写的 characteristic :

在这里插入图片描述

通过我们以前可知,Service 中的 C characteristic 为只写的,而且我们知道他的句柄为 47。

而且我们对会回调函数的理解,这个灯的操作我们可以直接在回调函数中实现,本次主要是为了表达这种方法,所以我们使用比较简单的控制指令,看代码就知道:

(下图代码有问题,粗心大意!)

在这里插入图片描述

上面代码直接使用3字节的指令控制 0xA5 0x03 0x01 打开红灯,其他类似,记得把上面任务中 SK6812 测试代码去掉。

编译烧录测试…… ,我擦,有问题……:

在这里插入图片描述

这个是因为上面代码粗心大意!! 判断符写成了赋值,== 写成了= ,除了这个还有颜色红色和绿色搞反了,最后修改代码:

case ESP_GATTS_WRITE_EVT:
            if (!param->write.is_prep){
                // the data length of gattc write  must be less than GATTS_DEMO_CHAR_VAL_LEN_MAX.
                ESP_LOGI(GATTS_TABLE_TAG, "GATT_WRITE_EVT, handle = %d, value len = %d, value :", param->write.handle, param->write.len);
                esp_log_buffer_hex(GATTS_TABLE_TAG, param->write.value, param->write.len);
                if(heart_rate_handle_table[IDX_CHAR_VAL_C] == param->write.handle && param->write.len == 3){
                    if((param->write.value[0] == 0xA5)&&(param->write.value[1] == 0x03)&&(param->write.value[2] == 0x01)){
                        ESP_LOGI(GATTS_TABLE_TAG, "SK6812 turn green!!");
                        strip->set_pixel(strip, 0, 255, 0, 0);
                        strip->refresh(strip, 100);
                    }
                    else if((param->write.value[0] == 0xA5)&&(param->write.value[1] == 0x03)&&(param->write.value[2] == 0x02)){
                        ESP_LOGI(GATTS_TABLE_TAG, "SK6812 turn red!!");
                        strip->set_pixel(strip, 0, 0, 255, 0);
                        strip->refresh(strip, 100);
                    }
                    else if((param->write.value[0] == 0xA5)&&(param->write.value[1] == 0x03)&&(param->write.value[2] == 0x03)){
                        ESP_LOGI(GATTS_TABLE_TAG, "SK6812 turn blue!!");
                        strip->set_pixel(strip, 0, 0, 0, 255);
                        strip->refresh(strip, 100);
                    }                 
                }
                // 后面省略

说明,上文中的 RGB 对应的位置有点问题,红色 和 绿色 的值对应位置好像反了,是因为ESP-IDF 驱动中的颜色处理驱动函数是反过来的:
在这里插入图片描述
可以自行改正过来!

实际测试,效果一切正常:

在这里插入图片描述

❤️ 到这里,我们成功实现了手机通过蓝牙控制开发板的 SK6812 LED!

额外说明:

当然示例只是提供了最基本简单的思路,SK6812 是可以多个串联,然后还能支持调光的,使用蓝牙当然也可以实现。

虽然我们在示例中,直接在事件中通过判断写入的值来进行操作,但是也要明白,这个写入的值最后是直接写入了这个 characteristic 的 value 中,我们使用这个 characteristic 的值来改变 SK6812 LED的颜色也是可以的。

3.3 代码优化

本来要结尾了,糟糕完成以后回家路上想了想,我可以发送3个字节,那么我可以直接发送 RGB 的颜色值啊? 这不是正好3个字节代表颜色吗?还是傻乎乎的自定义指令……

我们在代码中添加一个分支做控制,因为颜色组成为3个字节,我们把上面测试用到的控制代码,变成2个字节好做区分,实现代码很简单:

if(heart_rate_handle_table[IDX_CHAR_VAL_C] == param->write.handle ){
         if(param->write.len == 3){
             ESP_LOGI(GATTS_TABLE_TAG, "SK6812 set color!");
             strip->set_pixel(strip, 0, param->write.value[0], param->write.value[1], param->write.value[2]);
             strip->refresh(strip, 100);
         }
         else if(param->write.len == 2){
             if((param->write.value[0] == 0xA5)&&(param->write.value[1] == 0x01)){
                 ESP_LOGI(GATTS_TABLE_TAG, "SK6812 turn green!!");
                 strip->set_pixel(strip, 0, 255, 0, 0);
                 strip->refresh(strip, 100);
             }
             else if((param->write.value[0] == 0xA5)&&(param->write.value[1] == 0x02)){
                 ESP_LOGI(GATTS_TABLE_TAG, "SK6812 turn red!!");
                 strip->set_pixel(strip, 0, 0, 255, 0);
                 strip->refresh(strip, 100);
             }
             else if((param->write.value[0] == 0xA5)&&(param->write.value[1] == 0x03)){
                 ESP_LOGI(GATTS_TABLE_TAG, "SK6812 turn blue!!");
                 strip->set_pixel(strip, 0, 0, 0, 255);
                 strip->refresh(strip, 100);
             }  
         }               
     }

测试下来,好用许多!开发板图就算了,放一下LOG图,想要什么颜色,对着颜色表输入 RGB 值即可:

在这里插入图片描述

四、APP 部分

APP部分,如果要做,至少我想实现的是全色调光,实时的改变 LED 的颜色。这个市面上已经有许多成型的产品和 APP 了。

我这个… java 实在一言难尽,先暂时搁置,容我好好想想先 … …

在这里插入图片描述

结语

本文使用 ESP32-C3 的蓝牙,实现了数据的上传和下行的控制,也算完成我们最初的小目标了。

我这里把本应用上传至资源备份: 本应用实例代码

本应用所有的代码,只要看过我的博文,各个部分都是有分析说明的,没有必要特意去下载。

本来想把 app_main.c 源码放出来给大家复制,但是一放文章直接显示3W多字,系统提示建议修改,怕影响文章曝光度, 就不放了, = =! 大家根据文中的图片自己敲吧……,好像也没多少,文章还是放了修改的部分代码的!

❤️

从最开始的面对蓝牙的迷茫,到现在实现了一个简单的应用。

乘风破浪会有时 ,直挂云帆济长海 !

❤️

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32-C3 应用 篇(实例二、通过蓝牙将传感器数据发送给手机,手机端控制 SK6812 LED) 的相关文章

  • Arduino安装ESP32下载失败的解决方法

    Arduino安装ESP32时 经常下载失败 解决办法 1 复制命令行中的提示信息到记事本 找到下载地址 2 打开浏览器 在地址栏中贴粘下载地址 回车开始下载 3 将下载的包复制到C Users Administrator AppData
  • 蓝牙Mesh LPN节点

    选择LPN模式的原因 能有效的降低产品功耗 比如 一个温湿度传感器产品 需要超过设定阈值才会从上送数据 这样就没有长时间唤醒时间 就无法接收到网关下发的设置数据 这时候就需要LPN模式 LPN的节点正常还是超过阈值才会上报数据 然后会过一段
  • 【ESP-IDF】ESP32利用wifi联网(STA模式)

    1 AP和STA的含义 AP模式 Access Point模式 提供无线接入服务 允许其它无线设备接入 提供数据访问 STA模式 Station模式 类似于无线终端 sta本身并不接受无线的接入 它可以连接到AP设备 2 STA模式例程 官
  • 单片机开发---ESP32S3移植lvgl+触摸屏

    书接上文 单片机开发 ESP32 S3模块上手 本章内容 熟悉一下ESP32S3的开发 修改范例程序的lvgl 使之能够匹配现在的显示屏 具体工作大概为通过SPI接口连接一块SPI串口屏幕 并且适配lvgl 最后加上触摸屏作为输入 屏幕 用
  • micropython RX8025T 驱动简单演示

    我就知道可能八百年会有一位大哥来找这个驱动 让我来猜猜为啥用这个 嫌一般的RTC不够精准是吧 想用个带温度补偿的试试 代码拿去 其实巨简单的 没啥好说的 而且只有基本功能 from micropython import const impo
  • esp32-S3专题二:内存2之RTC内存、FLASH使用

    承接上文 讲一下esp32上剩下的几个存储空间的用途 目录 一 RTC存储器 一 RTC 快速存储器 二 RTC 慢速存储器 二 Flash 一 NVS 表 二 程序和OTA分区 三 SPIFFS 文件系统 三 总结 一 RTC存储器 es
  • ESP32(MicroPython) 编码器电机闭环控制

    本人最近查找资料时 发现ESP32上的使用MicroPython的编码器电机相关程序较少 闭环控制程序都是Pyboard上的 与ESP32不完全兼容 本人通过micropython编程 esp32 drv8833 霍尔编码器 micropy
  • ESP32开发板手动更换外置的flash

    ESP32开发板手动更换外置的flash 实物板 风险提示 操作有风险 需谨慎 新手请勿模仿 第一步拿下屏蔽罩 用热风枪 360 吹下来的 第二步 更换flash芯片 ESP32 D0WDQ6芯片下方那个就是flash芯片了型号 25VQ3
  • nRF52832 — 串口BLE例程逐行解析【转载】

    原文链接 http blog csdn net u011034150 article details 50617686 转载文章 若有不妥 通知后我会立即删除 本讲逐行代码解析官方串口BLE例程demo 主要分一下几个部分 1 Main函数
  • 启明云端分享

    提示 启明云端从2013年起就作为Espressif 乐鑫科技 大中华区合作伙伴 我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程 同时也用心推出了基于乐鑫的相关应用方案 希望你能第一时间了解并快速用上好的方案和产品
  • 使用Arduino开发ESP32(22):蓝牙作为客户端使用

    文章目录 目的 基础准备 搜索蓝牙设备 搜索设备 信息查询 连接与交互 总结 目的 ESP32的蓝牙除了作为服务器 从设备 使用还可以作为客户端 主机 使用 这篇文章将对相关内容做个简单说明 基础准备 这篇文章中测试需要先准备一个蓝牙服务器
  • 在 esp32 上运行 lvgl + freetype

    前言 最近有个需求 如何在 esp32 上运行 lvgl freetype 这个想法的难点是 freetype 的环境搭建 我想将其做得非常简单 最好的办法是做成组件来使用 所以我将 freetype 的相关依赖做成了 esp idf 组件
  • ESP32学习笔记05-串口事件方式读取数据

    串口中断方式处理数据 事件机构体 typedef struct uart event type t type lt UART event type size t size lt UART data size for UART DATA ev
  • Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:快速入门

    文章目录 目的 特征 安装 快速体验 注意事项 总结 目的 Arduino for ESP8266 和 Arduino for ESP32 中默认就有WebServer 不过这些WebServer都是同步的 不支持同时处理多个连接 这在很多
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • ESP32 - 具有本机 LwIP 库的 UDP 广播器/接收器

    我正在使用 ESP32 顺便说一句 这是一个很棒的平台 构建一个分布式应用程序 所有参与者都应该以最简单的形式通过 UDP 进行通信 通过广播发送消息并监听周围所有的消息 每个参与者自行过滤相关消息 到目前为止 我有以下初始化例程 int
  • 【ESP32接入国产大模型之文心一言】

    1 怎样接入文心一言 随着人工智能技术的不断发展 自然语言处理领域也得到了广泛的关注和应用 在这个领域中 文心一言作为一款强大的自然语言处理工具 具有许多重要的应用价值 本文将重点介绍如何通过ESP32接入国产大模型之文心一言api 以及其
  • Google iot MQTT - ESP32 首次连接,仅在 30m 后重新连接

    我正在使用 ESP32 与谷歌物联网云合作 我发送假值只是为了使用 MQTT 数据 PUB SUB 进行测试 显然我成功发布了值 有时 我无法重新连接到谷歌物联网 我不知道为什么它不断检查 wifi publishing 并且不检查 JWT
  • BluetoothGatt:协商新的 MTU 成功,但无法使用新的大小(相差 3 个字节)

    我正在开发一个使用 BLE 在设备之间交换数据的应用程序 为了获得更好的性能 在连接两个设备后 我正在协商增加 MTU 以便通过 BLE 交换更大的数据包 连接蓝牙设备并读取所有服务和特征后 我请求使用以下方法增加 MTU private
  • Android 如何读取 BLE 属性 可读 可写 可通知 GATT 特性

    如何阅读BluetoothGattCharacteristic属性如特征Readable Writable or Notifiable return Returns b true b if property is writable publ

随机推荐

  • 矩阵求导——Numerator Layout & Denominator Layout

    突然想起这个问题了 刚刚看到有人在问某个的公式 自己闷头想了想居然都忘的差不多了 于是乎稍微整理一下供以后参考 其实 关于矩阵求导讲的最详细的还是wiki上的页面面http en wikipedia org wiki Matrix calc
  • 【janio】janio 官网 翻译 Janino 是一个超小、超快的 Java 编译器

    1 概述 翻译 http janino compiler github io janino janino as a 20compiler Janino 是一个超小 超快的 Java 编译器 Janino不仅可以像JAVAC一样将一组源文件编
  • Echarts特殊用法总结

    最近做了一个微信公众号项目 使用Echarts绘制降雨量曲线 水库水位及库容曲线 大坝断面监测等图表 通过查阅官方文档及示例 度娘 与Echarts的距离更近了一步 总结一下 不能直接在官网上找到答案的用法 有以下几处 x轴为value类型
  • JavaScript DOM和BOM

    目录 查找html元素 1 通过id 2 通过标签名 3 通过类名 DOM 1 创建动态的HTML内容 2 修改元素内容 3 改变HTML属性 4 改变css样式 DOM事件 DOM节点 1 添加HTML元素 2 删除HTML元素 浏览器对
  • nginx学习记录(一) 认识、了解

    本文记录个人学习nginx的学习笔记 方便自己日后查看 也希望各位大佬看到有什么不对可以指点一二 一 什么是nginx 基本介绍 Nginx 是一款轻量级的 Web 服务器 反向代理服务器 电子邮件 IMAP POP3 代理服务器 在BSD
  • 使用SVG绘制带箭头的线

  • 小程序实现小窗功能

    效果图 正常情况下 正常退出直播间后 可添加官方支持的小窗展示功能 小窗使用过程中 不会影响其他界面的使用 共存状态 用户端 主播段 异常情况下 1 当长时间悬挂小窗后 或者主播网络出问题的情况下 小窗会有加载loadding 点击进入直播
  • word中插入公式实现换行和对齐

    一 准备阶段 默认Unicode模式 进入公式编辑模式 输入 eqarray 紧接着按下空格键输入空格 如下 二 实现换行和对齐 将要编辑的公式输入到括号内 实现位置对齐 实现换行 三 结束公式编辑 输入完所有公式后 输入右括号 紧接着按下
  • 漂亮的表格样式(使用CSS样式表控制表格样式)

    依照WEB2 0风格 设计了几个表格样式 希望大家喜欢 WEB2 0提倡使用div开布局 但不是要完全放弃使用表格 表格在数据展现方面还是不错的选择 现在使用介绍使用CSS样式表来控制 美化表格的方法 lt html xmlns http
  • 蓝桥杯嵌入式创建第一个工程(点亮led灯)

    蓝桥杯嵌入式创建第一个工程 点亮led灯 一 keil导入stm32G431RX板级芯片包 1 1 下载板级芯片包 1 2 导入芯片包 1 2 1 我们首先打开keil 点击Pack installer 如图 1 2 2 然后选中file
  • arm基础知识

    目录 arm基础知识 谈谈对嵌入式的理解 计算机基本理论 计算机的组成 指令的解析 编译原理 ARM相关知识介绍 1 认识ARM ARM含义 架构 内核 SOC ARM的发展历史 指令集 ARM公司产品分布 ARM体系结构 ARM v8 A
  • 机器学习笔记:李宏毅ChatGPT Finetune VS Prompt

    1 两种大语言模型 GPT VS BERT 2 对于大语言模型的两种不同期待 2 1 专才 2 1 1 成为专才的好处 Is ChatGPT A Good Translator A Preliminary Study 2023 Arxiv
  • 华为OD机试 - 英文输入法(Java)

    题目描述 主管期望你来实现英文输入法单词联想功能 需求如下 依据用户输入的单词前缀 从已输入的英文语句中联想出用户想输入的单词 按字典序输出联想到的单词序列 如果联想不到 请输出用户输入的单词前缀 注意 英文单词联想时 区分大小写 缩略形式
  • requests库学习

    requests库学习 requests快速上手 http 2 python requests org zh CN latest user quickstart html Requests库是用来发送HTTP请求 接收HTTP响应的一个Py
  • ES使用中遇到的坑

    1 ES分页超过10000条报错 es 默认采用的分页方式是 from size 的形式 是一种逻辑上的分页 在深度分页的情况下 采用from to方式进行分页效率会非常的低 例如以下查询 1 GET student doc search
  • 记一次在k8s集群搭建的Harbor私有仓库无法提供服务之镜像迁移恢复实践

    本章目录 记一次在k8s集群搭建的Harbor私有仓库无法提供服务之镜像迁移恢复实践 描述 Harbor 是一个用于存储和分发Docker镜像的企业级Registry服务器 通过添加一些企业必需的功能特性 例如安全 标识和管理等 扩展了开源
  • 内网隧道代理技术(十七)之 NPS的使用

    NPS的介绍和使用 NPS介绍 nps是一款轻量级 高性能 功能强大的内网穿透代理服务器 目前支持tcp udp流量转发 可支持任何tcp udp上层协议 访问内网网站 本地支付接口调试 ssh访问 远程桌面 内网dns解析等等 此外还支持
  • [752]压力测试工具-ab工具

    在学习ab工具之前 我们需了解几个关于压力测试的概念 吞吐率 Requests per second 概念 服务器并发处理能力的量化描述 单位是reqs s 指的是某个并发用户数下单位时间内处理的请求数 某个并发用户数下单位时间内能处理的最
  • JS进阶第三篇:开发中对数组及对象的判断方法

    系列文章传送门 JS进阶第一篇 手写call apply bind JS进阶第二篇 函数参数按值传递 文章目录 JS判断数组 1 通过instanceof运算符判断 2 通过constructor判断 3 通过数组自带的isArray方法判
  • ESP32-C3 应用 篇(实例二、通过蓝牙将传感器数据发送给手机,手机端控制 SK6812 LED)

    ESP32 C3 蓝牙部分我们学习了GATT 本文尝试使用蓝牙做一个简单的小应用 目录 前言 一 整体框架 二 数据传输部分 2 1 添加温湿度驱动组件 2 2 传感器数据传输程序 再次说明 ESP GATTS READ EVT 事件 2