桌面小屏幕实战课程:DesktopScreen 11 SPI 水墨屏
飞书文档https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb
SPI说明
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上占用四根线。
参考源码位置
/home/kemp/work/esp/esp-idf/examples/peripherals/spi_master
源码下载方式参考:
源码下载方式
屏幕接口
SCLK IO25 SPI 串口通信时钟信号线。
SDI IO26 SPI 串口通信数据信号线。
CS IO27 片选,低电平有效。
D/C IO14 数据/命令 读写选择,高电平为数据,低电平为命令。
RES IO12 电子纸复位信号,低电平有效。
BUSY IO13 电子纸刷新时,BUSY 引脚发出忙信号给主 MCU,此时 MCU 无法对电子纸驱动 IC 进行读写操作;电子纸刷新完成后,BUSY 引脚发出闲置状态信号,此时 MCU 可以对 电子纸驱动 IC 进行读写操作。GDEW 系列电子纸 BUSY 引脚忙状态为高电平(GDEH 系列为低电平),BUSY 引脚空闲状态反之。
墨水屏原理
152*152个像素 19Byte=152Bit 19*152的数组
152*152 19BYTE 1BYTE=8BIT 0000 0000 1111 1111
更多屏幕相关手册
1.54寸电子纸屏/ 152x152分辨率电子纸/ 四灰阶/ 支持局部刷新电子墨水屏 GDEW0154T8D_电子纸屏-大连佳显电子有限公司
代码说明
SPI部分
SPI Master Driver - - ‒ ESP-IDF 编程指南 release-v4.1 文档
/* SPI Master exampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES ORCONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "driver/spi_master.h"
#include "driver/gpio.h"#include "ds_gpio.h"//#define PIN_NUM_MISO 1 //屏幕只写不读,此引脚不用
#define PIN_NUM_MOSI 26
#define PIN_NUM_CLK 25
#define PIN_NUM_CS 27spi_device_handle_t spi;void spi_send_cmd(const uint8_t cmd)
{esp_err_t ret;spi_transaction_t t;//设置发送指令ds_gpio_set_screen_dc(0);//设置片选模块ds_gpio_set_screen_cs(0);memset(&t, 0, sizeof(t)); //Zero out the transaction// t.flags=SPI_TRANS_USE_TXDATA;t.length=8; //Command is 8 bitst.tx_buffer=&cmd; //The data is the cmd itselft.user=(void*)0; //D/C needs to be set to 0//发送指令ret=spi_device_polling_transmit(spi, &t); //Transmit!//取消片选模块ds_gpio_set_screen_cs(1);assert(ret==ESP_OK); //Should have had no issues.
}void spi_send_data(const uint8_t data)
{esp_err_t ret;spi_transaction_t t;//设置发送数据ds_gpio_set_screen_dc(1);//设置片选模块ds_gpio_set_screen_cs(0);memset(&t, 0, sizeof(t)); //Zero out the transactiont.length=8; //Len is in bytes, transaction length is in bits.t.tx_buffer=&data; //Datat.user=(void*)1; //D/C needs to be set to 1//发送数据ret=spi_device_polling_transmit(spi, &t); //Transmit!//取消片选模块ds_gpio_set_screen_cs(1);assert(ret==ESP_OK); //Should have had no issues.
}//This function is called (in irq context!) just before a transmission starts. It will
//set the D/C line to the value indicated in the user field.
void spi_pre_transfer_callback(spi_transaction_t *t)
{int dc=(int)t->user;printf("dc callback\n");ds_gpio_set_screen_dc(dc);
}void screen_spi_init(void)
{esp_err_t ret;//IO设置spi_bus_config_t buscfg={.miso_io_num = PIN_NUM_MISO, // MISO信号线.mosi_io_num = PIN_NUM_MOSI, // MOSI信号线.sclk_io_num = PIN_NUM_CLK, // SCLK信号线.quadwp_io_num = -1, // WP信号线,专用于QSPI的D2.quadhd_io_num = -1, // HD信号线,专用于QSPI的D3.max_transfer_sz = 64*8, // 最大传输数据大小};//速率 模式设置spi_device_interface_config_t devcfg={.clock_speed_hz=15*1000*1000, //Clock out at 26 MHz.mode=0, //SPI mode 0.queue_size=7, //We want to be able to queue 7 transactions at a time// .pre_cb=spi_pre_transfer_callback, //Specify pre-transfer callback to handle D/C line};//Initialize the SPI busret=spi_bus_initialize(HSPI_HOST, &buscfg, 0);ESP_ERROR_CHECK(ret);//Attach the LCD to the SPI busret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi);ESP_ERROR_CHECK(ret);}void screen_spi_test(){spi_send_cmd(0x55);vTaskDelay(10 / portTICK_PERIOD_MS);spi_send_data(0x55);
}
屏幕驱动部分
注意:这里的代码和视频中不太一样,因为旧版本屏幕停产,更换了屏幕型号,下方代码为0154B-D67的屏幕驱动代码,和最新版本屏幕是一致的。
#include <string.h>
#include <stdio.h>#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"#include "ds_screen.h"
#include "ds_gpio.h"
#include "ds_spi.h"
#include "ds_data_image.h"// Detection busy
static void lcd_chkstatus(void)
{int count = 0;unsigned char busy;while (1){busy = ds_gpio_get_screen_busy();busy = (busy & 0x01);//=1 BUSYif (busy == 0)break;vTaskDelay(10 / portTICK_PERIOD_MS);count++;if (count >= 1000){printf("---------------time out ---\n");break;}}
}static void init_display()
{vTaskDelay(10 / portTICK_PERIOD_MS);ds_gpio_set_screen_rst(0); // Module resetvTaskDelay(10 / portTICK_PERIOD_MS);ds_gpio_set_screen_rst(1);vTaskDelay(100 / portTICK_PERIOD_MS);lcd_chkstatus();spi_send_cmd(0x12); // SWRESETlcd_chkstatus();spi_send_cmd(0x01); // Driver output controlspi_send_data(0xC7);spi_send_data(0x00);spi_send_data(0x01);spi_send_cmd(0x11); // data entry modespi_send_data(0x01);spi_send_cmd(0x44); // set Ram-X address start/end positionspi_send_data(0x00);spi_send_data(0x18); // 0x0C-->(18+1)*8=200spi_send_cmd(0x45); // set Ram-Y address start/end positionspi_send_data(0xC7); // 0xC7-->(199+1)=200spi_send_data(0x00);spi_send_data(0x00);spi_send_data(0x00);spi_send_cmd(0x3C); // BorderWavefromspi_send_data(0x05);spi_send_cmd(0x18); // Read built-in temperature sensorspi_send_data(0x80);spi_send_cmd(0x4E); // set RAM x address count to 0;spi_send_data(0x00);spi_send_cmd(0x4F); // set RAM y address count to 0X199;spi_send_data(0xC7);spi_send_data(0x00);vTaskDelay(100 / portTICK_PERIOD_MS);lcd_chkstatus();
}/Enter deep sleep mode
void deep_sleep(void) // Enter deep sleep mode
{spi_send_cmd(0x10); // enter deep sleepspi_send_data(0x01);vTaskDelay(100 / portTICK_PERIOD_MS);
}void refresh(void)
{spi_send_cmd(0x22); // Display Update Controlspi_send_data(0xF7);spi_send_cmd(0x20); // Activate Display Update Sequencelcd_chkstatus();
}void refresh_part(void)
{spi_send_cmd(0x22); // Display Update Controlspi_send_data(0xFF);spi_send_cmd(0x20); // Activate Display Update Sequencelcd_chkstatus();
}// 图片全刷-全白函数
static void ds_screen_display_white(void)
{unsigned int i, k;spi_send_cmd(0x24); // write RAM for black(0)/white (1)for (k = 0; k < 250; k++){for (i = 0; i < 25; i++){spi_send_data(0xff);}}
}// 图片全刷-数据函数
void ds_screen_full_display_data(const uint8_t *data)
{unsigned int i;spi_send_cmd(0x24); // write RAM for black(0)/white (1)for (i = 0; i < 5000; i++){spi_send_data(*data);data++;}
}// 全刷 不带数据
void ds_screen_full_display(void pic_display(void))
{init_display();pic_display(); // picturerefresh(); // EPD_refreshdeep_sleep();
}// 全刷 带数据
void ds_screen_full_display_bydata(void display_func(const uint8_t *data), const uint8_t *data)
{init_display();display_func(data); // picturerefresh(); // EPD_refreshdeep_sleep();
}// 局部刷 不带数据
void ds_screen_partial_display(unsigned int x_start, unsigned int y_start, void partial_new(void), unsigned int PART_COLUMN, unsigned int PART_LINE)
{unsigned int i;unsigned int x_end, y_start1, y_start2, y_end1, y_end2;x_start = x_start / 8;x_end = x_start + PART_LINE / 8 - 1;y_start1 = 0;y_start2 = 200 - y_start;if (y_start >= 256){y_start1 = y_start2 / 256;y_start2 = y_start2 % 256;}y_end1 = 0;y_end2 = y_start2 + PART_COLUMN - 1;if (y_end2 >= 256){y_end1 = y_end2 / 256;y_end2 = y_end2 % 256;}// Add hardware reset to prevent background color changeds_gpio_set_screen_rst(0); // Module resetvTaskDelay(10 / portTICK_PERIOD_MS);ds_gpio_set_screen_rst(1);vTaskDelay(10 / portTICK_PERIOD_MS);// Lock the border to prevent flashingspi_send_cmd(0x3C); // BorderWavefrom,spi_send_data(0x80);spi_send_cmd(0x44); // set RAM x address start/end, in page 35spi_send_data(x_start); // RAM x address start at 00h;spi_send_data(x_end); // RAM x address end at 0fh(15+1)*8->128spi_send_cmd(0x45); // set RAM y address start/end, in page 35spi_send_data(y_start2); // RAM y address start at 0127h;spi_send_data(y_start1); // RAM y address start at 0127h;spi_send_data(y_end2); // RAM y address end at 00h;spi_send_data(y_end1); // ????=0spi_send_cmd(0x4E); // set RAM x address count to 0;spi_send_data(x_start);spi_send_cmd(0x4F); // set RAM y address count to 0X127;spi_send_data(y_start2);spi_send_data(y_start1);spi_send_cmd(0x24); // Write Black and White image to RAMpartial_new();refresh_part();deep_sleep();
}// 局部刷 带数据
void ds_screen_partial_display_bydata(unsigned int x_start, unsigned int y_start,void partial_new(const uint8_t *data), const uint8_t *new_data,unsigned int PART_COLUMN, unsigned int PART_LINE)
{printf("x_start=%d x_end=%d y_start=%d y_end=%d\n", x_start, y_start, PART_COLUMN, PART_LINE);unsigned int i;unsigned int x_end, y_start1, y_start2, y_end1, y_end2;x_start = x_start / 8;x_end = x_start + PART_LINE / 8 - 1;y_start1 = 0;y_start2 = 200 - y_start;if (y_start >= 256){y_start1 = y_start2 / 256;y_start2 = y_start2 % 256;}y_end1 = 0;y_end2 = y_start2 + PART_COLUMN - 1;if (y_end2 >= 256){y_end1 = y_end2 / 256;y_end2 = y_end2 % 256;}// Add hardware reset to prevent background color changeds_gpio_set_screen_rst(0); // Module resetvTaskDelay(10 / portTICK_PERIOD_MS);ds_gpio_set_screen_rst(1);vTaskDelay(10 / portTICK_PERIOD_MS);// Lock the border to prevent flashingspi_send_cmd(0x3C); // BorderWavefrom,spi_send_data(0x80);spi_send_cmd(0x44); // set RAM x address start/end, in page 35spi_send_data(x_start); // RAM x address start at 00h;spi_send_data(x_end); // RAM x address end at 0fh(15+1)*8->128spi_send_cmd(0x45); // set RAM y address start/end, in page 35spi_send_data(y_start2); // RAM y address start at 0127h;spi_send_data(y_start1); // RAM y address start at 0127h;spi_send_data(y_end2); // RAM y address end at 00h;spi_send_data(y_end1); // ????=0spi_send_cmd(0x4E); // set RAM x address count to 0;spi_send_data(x_start);spi_send_cmd(0x4F); // set RAM y address count to 0X127;spi_send_data(y_start2);spi_send_data(y_start1);spi_send_cmd(0x24); // Write Black and White image to RAMpartial_new(new_data);
}uint8_t partial_data[200][25];
uint8_t partial_data_array[5000];void ds_screen_partial_data_init()
{for (int index = 0; index < 200; index++){for (int yindex = 0; yindex < 25; yindex++){partial_data[index][yindex] = 0xff;}}
}void ds_screen_partial_data_add(unsigned int x_start, unsigned int x_end, unsigned int y_start, unsigned int y_end, const uint8_t *data)
{uint8_t x_len = x_end - x_start;// uint8_t y_len = y_end - y_start;uint8_t x_data_location = x_start / 8;uint8_t x_size = x_len / 8;int data_index = 0;// int move = x_start % 8;if (x_start % 8 != 0){x_data_location++;}if (x_len % 8 != 0){x_size++;}for (int x_index = y_start; x_index < y_end; x_index++){for (int y_index = x_data_location; y_index < (x_data_location + x_size); y_index++){partial_data[x_index][y_index] = (~data[data_index]);data_index++;}}
}// 图片全刷-全白函数
static void ds_screen_display_data(void)
{unsigned int i;spi_send_cmd(0x24);for (i = 0; i < 5000; i++){spi_send_data(partial_data_array[i]);}spi_send_cmd(0x26);for (i = 0; i < 5000; i++){spi_send_data(partial_data_array[i]);}
}// 局刷数据-复制
void ds_screen_partial_data_copy()
{int data_index = 0;for (int index = 0; index < 200; index++){for (int yindex = 0; yindex < 25; yindex++){partial_data_array[data_index] = partial_data[index][yindex];data_index++;}}ds_screen_full_display(ds_screen_display_data);
}// 接口初始化
void init_screen_interface()
{ds_screen_gpio_init();screen_spi_init();
}// 清屏为白色
void ds_screen_clean_white()
{ds_screen_init();vTaskDelay(2000 / portTICK_PERIOD_MS);
}// 初始化
void ds_screen_init()
{ds_screen_full_display(ds_screen_display_white); // EPD_sleep
}
参考:
【科普贴】SPI接口详解_湉湉家的小虎子的博客-CSDN博客_spi
1.54寸高频刷新 快刷1.5秒电子墨水屏 分辨率200x200 SPI串口 GDEY0154D67_电子墨水屏幕-大连佳显电子
相关文章:
桌面小屏幕实战课程:DesktopScreen 11 SPI 水墨屏
飞书文档https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb SPI说明 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上占用…...
小知识点五、无刷电机闭环控制(电流)
0 前言 该部分只用于自学使用,作为笔记方便后续自查。 资料参考:http://dengfoc.com 硬件:2208云台电机MT6701磁编码器 1 电流控制理论 1.1 待解决的问题 简单回顾一下在之前的学习中,我们通过 U q U_q Uq和电角度 θ \the…...
Java 编程之备忘录模式
前言 有时候,我们真希望人生能有“CtrlZ”。在日常生活中,我们经常使用“撤销”功能,例如在写 Word、画图、写代码时一不小心操作失误,就希望能回到之前的状态。这种**“状态快照 恢复”**机制,在设计模式中就叫做&a…...
SQL SERVER存储过程
什么是存储过程 SQL 存储过程(Stored Procedure)是一个在数据库中预编译并存储的一组 SQL 语句。它们可以包含查询、插入、更新、删除等数据库操作,甚至包括控制流语句(如条件判断、循环等)。存储过程可以通过调用来执…...
Vue样式绑定与条件渲染详
一、Vue样式绑定 在Vue中,我们可以通过多种方式动态地绑定样式,让界面根据数据状态变化而自动更新样式。 1. class样式绑定 (1) 字符串写法 适用场景:样式的类名不确定,需要动态指定 <template><div><!-- 绑定…...
python基于协同过滤的动漫推荐系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
光场操控新突破!3D 光学信息处理迎来通用 PSF 工程时代--《自然》子刊:无需复杂算法,这一技术让 3D 光学成像实现 “即拍即得”念日
导语 在光学成像领域,如何突破分辨率与成像速度的瓶颈,一直是科研人员探索的焦点。近日,加州大学洛杉矶分校(UCLA)的研究团队在《Light: Science & Applications》发表论文,提出了一种通用点扩散函数&a…...
ubuntu20.04如何给appImage创建快捷方式
ubuntu20.04如何给appImage创建快捷方式 1. 确保AppImage是可执行的 chmod x /path/to/your/appimage2. 创建.desktop文件 在~/.local/share/applications/目录下创建一个新的 .desktop 文件: vi ~/.local/share/applications/your-appname.desktop添加以下内容…...
网络安全之SQL RCE漏洞
引言 堡垒机(Bastion Host),也称为跳板机或运维安全审计系统,是一种用于管理和控制对内部网络资源访问的安全设备。它的主要作用是作为运维人员访问内部服务器和网络设备的唯一入口,通过集中化的身份认证、权限管理和…...
DeepSeek网页版随机点名器
用DeepSeek帮我们生成了一个基于html5的随机点名器,效果非常棒,如果需要加入名字,请在代码中按照对应的格式添加即可。 提示词prompt 帮我生成一个随机点名的HTML5页面 生成真实一点的名字数据 点击随机按钮开始随机选择 要有闪动的效果 &…...
Elasticsearch索引字段的类型
在 Elasticsearch 中,索引字段的类型(即 Mapping 中的字段类型)对搜索和存储性能影响很大。下面是各种常用数据类型的用途及推荐使用场景总结: 1. keyword 类型(精确匹配) 适合数据: 不需要分词…...
大模型在慢性病毒性肝炎预测及诊疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、慢性病毒性肝炎概述 2.1 疾病定义与分类 2.2 发病机制与病理特征 2.3 流行病学现状 三、数据收集与预处理 3.1 数据来源 3.2 数据清洗 3.3 特征工程 四、大模型选择与构建 4.1 模型选择依据 4.2 模型…...
DAY 43 复习日
浙大疏锦行https://blog.csdn.net/weixin_45655710 第一步:寻找并准备图像数据集 在Kaggle等平台上,你可以找到大量用于图像分类任务的数据集,例如英特尔图像分类数据集 (Intel Image Classification) 或手写数字识别数据集 (Digit Recogni…...
SQL学习笔记3
SQL常用函数 1、字符串函数 函数调用的语法:select 函数(参数); 常用的字符串函数有: 拼接字符串,将几个字符串拼到一起:concat (s1,s2,……); select concat(你好,hello); update mytable set wherefo concat(中…...
JVM调优实战 Day 7:JVM线程分析与死锁排查
【JVM调优实战 Day 7】JVM线程分析与死锁排查 文章标签 jvm调优, 线程分析, 死锁排查, JVM监控, Java性能优化, JVM参数配置 文章简述 在Java应用的高并发场景中,线程管理与死锁问题往往是性能瓶颈的根源。本文作为“JVM调优实战”系列的第7天,深入解析…...
Android-Layout Inspector使用手册
Layout Inspector Android Layout Inspector 是 Android Studio 中用于调试应用布局的工具 启动方法: 通过下载Layout Inspector插件,在 “View - Tool Windows - Layout Inspector” 或 “Tools - Layout Inspector” 启动。 主要界面区域:…...
【51单片机5毫秒定时器】2022-6-1
缘由单片机的代码,求大家来帮帮我-编程语言-CSDN问答 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号 unsigned char Js0, miao0;//中断…...
Flutter 多平台项目开发指南
Flutter 多平台项目开发指南 本指南将帮助你从 0 到 1 创建并适配一个支持 Android / iOS / Web / Windows / macOS / Linux 的 Flutter 多平台项目。 ✅ 一、创建支持多平台的 Flutter 项目 flutter create my_multi_platform_app cd my_multi_platform_app默认会生成支持以…...
Mac电脑如何搭建基于java后端的开发的各种工具服务
1. 确认Mac的CPU架构 首先,确认您的Mac是使用Intel还是Apple Silicon(如M1芯片)架构: uname -m如果返回x86_64,表示是Intel架构。如果返回arm64,表示是Apple Silicon架构。 2.安装IDEA Download Intelli…...
深入解析前端 Meta 标签:HTML 的隐形守护者与功能大师
在构建现代网页时,我们常常关注炫目的视觉效果、复杂的交互逻辑或强大的框架,却容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 标签。这些标签如同网页的隐形守护者,无声地承担着定义文档元数据、指导浏览器行为、优化搜…...
CRON表达式编辑器与定时任务实现技术文档
1. 前端CRON表达式编辑器组件 CronExpressionEditor.vue组件是系统中用于创建和编辑CRON表达式的核心UI组件,它提供了直观的界面来生成复杂的定时任务表达式。 1.1 组件结构与状态管理 // 核心状态变量 const second ref<string>(0); const minute ref&…...
45. 跳跃游戏 II
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…...
《解锁AudioSet:开启音频分析的无限可能》
音频新时代的 “密钥”:AudioSet 登场 在科技飞速发展的今天,音频作为信息传播与交互的关键媒介,早已渗透到现代科技的各个角落。从智能手机中的语音助手,让我们通过简单的语音指令就能查询信息、发送消息,到智能家居系…...
环境太多?不好管理怎么办?TakMll 工具帮你快速切换和管理多语言、多版本情况下的版本切换。
本篇文章主要介绍一款环境管理工具,即TakMll,通过简单的入口命令 “tkm” 即可快速的管理多种语言下、多种版本的环境切换,诸如快速切换PHP、同时存在java、mave等不同版本。 作者:任聪聪 日期:2025年6月26日 TakMll 特…...
spring-ai 1.0.0 (1)模型调用能力
听说1.0是一个非常好用的版本,最后还是扛不住听说的压力,为了落实自己悬浮心理,自己还是着手实践一下了。 第一步pom集成: 参考spring-projects/spring-ai | DeepWiki维基以及官方文档入门 :: Spring AI …...
如何在 Manjaro Linux 上启用 AUR 仓库来安装软件包
Manjaro 是基于 Arch 的系统,是了解和学习 Arch Linux 命令的绝佳方式。它自带所有流行的桌面环境界面,无论是 XFCE 还是 Gnome 的爱好者,都可以在 Manjaro 中直接使用。 Manjaro 或 Arch Linux 的默认软件包管理器是 Pacman,我们…...
简单使用python
本文章没有深入探讨python,只说语法格式,合适于有其他编程语言的基础、并想快速使用python的人查看。 一、print() 用于打印信息,括号中可以是数学运算表达式或者字符串(或者说是文字)。 print(hello!) 1.1、转义字…...
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝 前言 蜻蜓I即时通讯系统是一款不依赖第三方服务的私有化即时通讯解决方案,本指南将详细介绍如何使用宝塔面板在CentOS系统上完成系统的完整部署。私有化部署意味着您…...
用Streamlit开发第一个Python应用程序
用Streamlit开发第一个Python应用程序 Using Streamlit to Develop the First Application in Python By JacksonML 1.Streamlit简介 Streamlit是个新出世的、功能强大的Python第三方库,将为基于Web的Python应用程序大放异彩。 Streamlit官网主页面如下&#x…...
IDEA + Spring Boot + javadoc 实例应用
1、添加 javadoc 插件 依赖 pom.xml <build><plugins><!-- javadoc 插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><version>3.6.3</version><…...
【机器学习深度学习】交互式线性回归 demo
目录 一、环境准备 二、Demo 功能 三、完整交互 demo 代码 3.1 执行代码 3.2 示例交互演示 3.3 运行结果 3.4 运行线性图 使用 PyTorch 构建交互式线性回归模型:输入数据、拟合直线、图像可视化并实现实时预测,助你深入理解机器学习从数据到模型的…...
新手向:Anaconda3的安装与使用方法
我们在刚开始接触Python时使用的是Python的直接编译器,如果我们需要进行其他的项目编写往往需要使用另一个版本的Python ,这样反复的下载很是麻烦并且还会造成系统变量的紊乱.这次我们引入Anaconda3,可创建虚拟的Python环境,满足不同项目的需要,当不用的时候可以直接放心删除不…...
详解零拷贝
目录 一、用户态(User Mode)和内核态(Kernel Mode) 1.1 用户态 (User Mode): 1.2 内核态 (Kernel Mode): 1.3 关键交互:系统调用 (System Call) 二、为什么需要区分用户态和内核态&#x…...
微服务常用的基础知识
1.微服务介绍 1.1 产生背景 随着互联网的发展,网站应用的规模不断扩大,传统单体架构逐渐难以应对大型网站高并发、高扩展性等需求,于是分布式系统架构应运而生。Spring Cloud 就是在这种背景下诞生的,它利用 Spring Boot 的开发便…...
【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整Python源码
🛡️【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整源码 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。 🐋 希望大家多多支持,…...
6月份最新代发考试战报:思科华为HCIP HCSE 考试通过
6月份最新代发考试战报:思科华为HCIP HCSE 考试通过 H19-423 HCSA-Presales-IP Network 数通考试通过, H12-725 HCIP-Security安全 考试通过,H13-121 HCIP-Kunpeng Application Developer鲲鹏计算 考试通过,CCNP 350-401考试通过…...
本地部署开源时间跟踪工具 Kimai 并实现外部访问( Windows 版本)
Kimai 是一款开源的时间跟踪工具,它易于使用,并提供了强大的报告功能,在个人和团队记录工作时间、项目时间和活动时间等之后可以帮助用户了解他们是如何花费时间的,从而提高生产力和效率。本文将详细介绍如何在 Windows 系统本地部…...
SpringBoot 中 @Transactional 的使用
SpringBoot 中 Transactional 的使用 一、Transactional 的基本使用二、Transactional 的核心属性三、使用避坑(失效场景)3.1 自调用问题3.2 异常处理不当3.3 类未被 Spring 管理3.4 异步方法内使用失效 四、工作实践4.1 事务提交之后执行一些操作4.2 事…...
Mac电脑安装iTerm2通过rz命令上传文件到远程服务器
背景 闲着没事买了个云服务器玩(京东云轻量云主机),Mac本地搞了个java的jar包,想上传到云服务器,通过scp命令在Mac自带的【终端】上怎么都上传不了,如图。但是通过ssh命令(ssh root主机IP &…...
供应链数据可视化大屏
在全球化与数字化转型的双重浪潮下,供应链管理正面临前所未有的挑战:黑天鹅事件频发、多环节协同效率低下、库存与成本难以平衡……如何让供应链更透明、更敏捷、更具韧性?供应链数据可视化大屏应运而生,成为企业破解管理痛点的关…...
A2O MAY登上央视《中国音乐TOP榜》舞台,展现新歌榜冠军实力
——A2O MAY凭借新歌《BOSS》登上中国QQ音乐新歌榜冠军后,成功出演CCTV音乐节目《中国音乐TOP榜》,以实力赢得瞩目。 由A2O Entertainment(以下简称A2O)推出的全球女团 A2O MAY(成员包括朱晨予CHENYU、李诗洁SHIJIE、…...
关于如何在 Git 中切换到之前创建的分支的方法
文章目录 关于如何在 Git 中切换到之前创建的分支的方法一、确保你在项目目录中二、查看所有分支(可选)三、切换到目标分支四、如果分支仅在远程存在五、验证是否切换成功六、常见问题处理七、总结命令流程 PS:下次进入分支时,只需完成步骤1 …...
vue3+element-plus 组件功能实现 上传功能
一、整体功能概述 这段代码实现了一个基于 Vue 3 和 Element Plus 组件库的文件导入及预览功能模块。主要包含了一个主导入对话框(用于上传文件、展示文件相关信息、进行导入操作等)以及一个用于预览文件内容的预览对话框。支持导入特定格式(…...
多相机人脸扫描设备如何助力高效打造数字教育孪生体?
在教育数字化转型浪潮中,数字孪生体作为现实教育场景的虚拟映射,正成为智慧教育发展的关键技术支点。传统教育模式面临师资资源分布不均、个性化教学难以覆盖、跨时空教学场景受限等痛点,而数字孪生体通过构建高仿真虚拟教育主体(…...
高中成绩可视化平台开发笔记
高中成绩可视化平台(1) 一、项目概述 本系统是一个基于 PyQt5 和 Matplotlib 的高中成绩数据可视化分析平台,旨在帮助教师快速了解学生成绩分布、班级对比、学科表现等关键指标。平台支持文科与理科的数据切换,并提供多个维度的图…...
圆周期性显示和消失——瞬态实现(CAD c#二次开发、插件定制)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; [assembly: CommandClass(typeof(IfoxDemo.Commands))] namespace IfoxDemo {// 新增的圆形闪烁命令实…...
Spark SQL to_json 函数介绍
目录 前言函数介绍参数说明示例 前言 在Apache Hive中,并没有内置的to_json函数。在Apache Spark SQL中确实有to_json函数,它可以用来将结构化数据(如结构化类型或MAP类型)转换为JSON字符串。这个功能对于需要将表格数据输出为JSON格式的场景…...
5个免费的硬盘分区工具,操作简单功能全
电脑用久了,系统盘空间告急、数据盘混乱无序,很多人想重新分区,却又担心太复杂或怕搞坏硬盘。其实,只要用对工具,分区操作其实一点都不难。更重要的是,有很多免费的分区软件,不仅好用࿰…...
uniapp事件onLoad区分大小写
区分大小写。不然会不起作用。onLoad方法中的功能均不会被执行。 除了功能逻辑要检查外。大小写是要认真检查的一部分...
Flutter Riverpod 使用详细解析
📚 Flutter 状态管理系列文章目录 Flutter 状态管理(setState、InheritedWidget、 Provider 、Riverpod、 BLoC / Cubit、 GetX 、MobX 、Redux) setState() 使用详解:原理及注意事项 InheritedWidget 组件使用及原理 Flutter 中 Provider 的使用、注…...