基于OrangePi AIpro开发一个电子纸屏时钟

OrangePi AIpro

简介

 OrangePi AIpro(8T)采用昇腾AI技术路线,具体为4核64位处理器+AI处理器,集成图形处理器,支持8TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/128GB/256GB eMMC模块,支持双4K高清输出。 Orange Pi AIpro引用了相当丰富的接口,包括两个HDMI输出、GPIO接口、Type-C电源接口、支持SATA/NVMe SSD 2280的M.2插槽、TF插槽、千兆网口、两个USB3.0、一个USB Type-C 3.0、一个Micro USB(串口打印调试功能)、两个MIPI摄像头、一个MIPI屏等,预留电池接口,可广泛适用于AI边缘计算、深度视觉学习及视频流AI分析、视频图像分析、自然语言处理、智能小车、机械臂、人工智能、无人机、云计算、AR/VR、智能安防、智能家居等领域,覆盖 AIoT各个行业。 Orange Pi AIpro支持Ubuntu、openEuler操作系统,满足大多数AI算法原型验证、推理应用开发的需求。

开发板的硬件规格

开发板的顶层视图和底层视图

顶层视图

 

底层视图 

 开发板的接口详情图

 

开发板40 pin UART 测试

开发板 40 pin 接口引脚的功能如下表所示, 其中标红部分的引脚具有 uart 功能,并且 Linux 系统默认配置为了 uart 功能, 可以直接使用。 另外请注意 uart0 默认设置为调试串口功能, 请不要将其当成普通串口使用。

启动 Linux 系统后, 先确认下/dev 下存在 uart 的设备节点。

(base) root@orangepiaipro:~#  ls /dev/ttyAMA*
/dev/ttyAMA0  /dev/ttyAMA1  /dev/ttyAMA2
(base) root@orangepiaipro:~# 

uart 设备节点和 uart 对应关系如下所示:

然后开始测试 uart 接口, 先使用杜邦线短接要测试的 uart 接口的 rx 和 tx 引脚。不同的 uart 的 rx 和 tx 引脚对应的 40 pin 接口中的引脚如下所示:

绿色线短接的uart2、蓝色线短接的是uart7

然后进入串口测试程序的路径。

(base) root@orangepiaipro:/opt/opi_test# cd /
(base) root@orangepiaipro:/# cd /opt/opi_test/uart/
(base) root@orangepiaipro:/opt/opi_test/uart# ls
serial  serial.c

串口测试程序 serial 的使用方法如下所示:

(base) root@orangepiaipro:/opt/opi_test/uart# ./serial 
Usage: ./serial <serialport>

使用 serial 测试程序可以测试下串口的自收自发。 serial 程序会打开对应的串口发送一个字符串——Hello, Serial Port!, 然后打印接收到的字符串。 如果自发自收的字符串相同, 说明测试成功。

1) uart2 测试命令如下所示:

(base) root@orangepiaipro:/opt/opi_test/uart# ./serial /dev/ttyAMA1
W: Hello, Serial Port!
R: Hello, Serial Port!

2) uart7 测试命令如下所示:

(base) root@orangepiaipro:/opt/opi_test/uart# ./serial /dev/ttyAMA2
W: Hello, Serial Port!
R: Hello, Serial Port!

开发板40 pin GPIO 测试

开发板 40 pin 接口引脚的功能如下表所示, 其中标红部分的引脚默认配置为GPIO 功能, 可以直接使用, 其他具有 GPIO 复用功能的引脚需要修改 DTS 配置才能正常使用 GPIO 的功能。

Linux 镜像中预装了 gpio_operate 工具用于设置 GPIO 管脚的输入与输出方向,也可将每个 GPIO 管脚独立的设为 0 或 1。 gpio_operate 工具的详细使用方法如下所示:
1) gpio_operate 工具必须使用 root 帐号执行。

2) gpio_operate -h 命令可以获取 gpio_operate 工具的帮助信息:

(base) root@orangepiaipro:/# gpio_operate -h
Usage: gpio_operate <Command|-h> [Options...]
gpio_operate Command:
        -h                              : This command's help information.
        set_value                       : Set gpio pin value.
        get_value                       : Get gpio pin value.
        set_direction                   : Set gpio pin direction value.
        get_direction                   : Get gpio pin direction value.
(base) root@orangepiaipro:/#

3) gpio_operate get_direction gpio_group gpio_pin 用于查询 GPIO 管脚方向。

1. gpio_group 和 gpio_pin 参数说明如下所示:

 2. 比如 40 pin 中的第 31 号引脚对应的 GPIO 为 GPIO2_20, 那么其 GPIO组号为 2, GPIO 管脚号为 20, 获取其方向的命令为:

(base) root@orangepiaipro:~# gpio_operate get_direction 2 20
Get gpio pin direction value successed, value is 0.
(base) root@orangepiaipro:~# 

3. 输出的打印信息说明

4) gpio_operate set_direction gpio_group gpio_pin direction 用于设置 GPIO 管脚方向。

  1. gpio_group、 gpio_pin 和 direction 参数说明如下所示 :

  2. 比如 40 pin 中的第 31 号引脚对应的 GPIO 为 GPIO2_20, 那么其 GPIO组号为 2, GPIO 管脚号为 20, 设置其方向为输出的命令为:
(base) root@orangepiaipro:~#  gpio_operate set_direction 2 20 1
Set gpio pin direction value successed.
(base) root@orangepiaipro:~# 

5) gpio_operate get_value gpio_group gpio_pin 命令用于查询 GPIO 管脚值

  1. gpio_group 和 gpio_pin 参数说明如下所示:

  2. 比如 40 pin 中的第 31 号引脚对应的 GPIO 为 GPIO2_20, 那么其 GPIO组号为 2, GPIO 管脚号为 20, 查询其管脚值的命令如下所示:
(base) root@orangepiaipro:~#  gpio_operate get_value 2 20
Get gpio pin value successed, value is 0. #这里查询到的值为 0, 也就是低电平
(base) root@orangepiaipro:~# 

6) gpio_operate set_value gpio_group gpio_pin value 命令用于设置 GPIO 管脚值为高电平或者低电平, 注意设置管脚值前, 请确保已将 GPIO 管脚的方向设置为输出了

  1. gpio_group、 gpio_pin 和 value 参数说明如下所示:

 2. 比如 40 pin 中的第 31 号引脚对应的 GPIO 为 GPIO2_20, 那么其 GPIO组号为 2, GPIO 管脚号为 20, 设置其输出为高电平的命令为:

(base) root@orangepiaipro:~# gpio_operate set_value 2 20 1
Set gpio pin value successed.
(base) root@orangepiaipro:~# 

关机和重启开发板的方法

1) 在 Linux 系统运行的过程中, 如果直接拔掉电源断电, 可能会导致文件系统丢失某些数据, 建议断电前先使用 poweroff 命令关闭开发板的 Linux 系统, 然后再拔掉电源。

(base) root@orangepiaipro:~# poweroff

2) 除了 poweroff 命令可以关闭 Linux 系统外, 还可以使用开发板上的关机按键来关闭开发板的 Linux 系统, 然后再拔掉电源。 请注意, 关机按键是没有开机功能的。

3) 使用 reboot 命令即可重启开发板中的 Linux 系统。

(base) root@orangepiaipro:~# reboot

测评实验内容

这里基于OrangePi AIpro + 4.3寸电子纸屏 + ESP8266开发款电子纸屏时钟,成品图如下:

开机动画

运行时钟

显示 OrangePi AIpro CPU 实时温度

这里为了美观,减少一堆的接线, OrangePi AIpro与电子墨水屏之间的通信采用的是无线串口通信的方式,485温湿度传感器与OrangePi AIpro也是采用无线通信的方式。编程语言基于Erlang,开发框架基于emqx,这里基于emqx搭建MQTT服务器,简单期间同时对emqx进行二次开发,集成驱动电子纸墨水屏时钟运转的驱动程序。这里涉及到所有软件程序都在OrangePi AIpro部署运行。下面将对开发搭建过程中涉及到的所有内容进行详细介绍。

 所用的硬件

  • OrangePi AIpro
  • 4.3寸串口电子墨水屏
  • ESP8266 WIFI模块
  • RS485温湿度传感器
  • RS485转WIFI串口服务器模块
  • 竹木抽纸盒

硬件连接

4.3寸串口电子墨水屏ESP8266 WIFI模块
DINTX(D4)
DOUTWAKE(D8)
GNDG
VCCVV

 

实物接线图↑

RS485温湿度传感器RS485转WIFI串口服务器模块
AA
BB
VCCC
GNDD

 ​

实物接线图 ↑

所用的软件

  • JDK  > 1.8
  • Erlang 26.2.3
  • Emqx  > v5.6.0
  • Arduino IDE
  • 串口调试助手

登录香橙派

第一次使用在不知道IP的情况下可以通过串口登录

1) 首先需要准备一根 Micro USB 接口的数据线

2) 然后将 Micro USB 接口一端插入开发板的 Micro USB 接口中。

3) 再将数据线的另一端插入电脑的 USB 接口中即可。
4) 打开电脑上的设备管理器查看一下端口号。

5) 打开电脑上的串口调试助手。 

  • 端口选择:COM3
  • 波特率选择:115200

6) 当看到登录界面时, 就可以使用下面的账号和密码来登录 Linux 系统了

7) 用串口调试助手不是很方便,这里我们输入:ifconfig 指令查询一下系统的IP地址,然后改为使用SSH工具连接,这里使用FinalShell。

8) 这里改为以SSH远程登录系统

安装JDK 1.8

源码安装Erlang 需要依赖Java所以这里我们需要安装一下JDK。

1. 下载JDK

下载地址:Java Archive Downloads - Java SE 8u211 and later

 

2. 下载完成后上传至香橙派
3. 安装
  • 解压
tar -zxvf jdk-8u401-linux-aarch64.tar.gz 
  • 安装
mv jdk1.8.0_401 /usr/local/jdk1.8/
  • 配置环境变量
vim /etc/profile
  • 在打开的文件末尾添加
export JAVA_HOME=/usr/local/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

  • 刷新环境变量
source /etc/profile
  • 查看JDK版本
java -version

 

至此JDK 1.8 已安装完成。 

安装Erlang 26.2.5

Emqx是基于erlang进行开发的。

这里​使用 Kerl 安装及管理 Erlang​。https://github.com/kerl/kerl

1. 安装依赖
sudo apt-get update
sudo apt-get install make 
sudo apt-get install build-essential
sudo apt-get install m4 
sudo apt-get install rsync 
sudo apt-get install lrzsz 
sudo apt-get install bc 
sudo apt-get install sysstat 
sudo apt-get install lsof 
sudo apt-get install wget 
sudo apt-get install automake 
sudo apt-get install autoconf
sudo apt-get install libssl-dev
sudo apt-get install libreadline-dev
sudo apt-get install libncurses5-dev
sudo apt-get install xsltproc
sudo apt-get  install libxml2-utils
sudo apt-get install unixodbc unixodbc-dev
sudo apt-get install libtool
sudo apt-get install libxml2-utils  xsltproc fop
sudo apt install libwxbase3.0-dev
sudo apt-get install mesa*
sudo apt-get install tk
2.  安装 kerl
  •   安装位置
 mkdir /home/SummerGao/kerl && cd /home/SummerGao/kerl
  •  下载kerl
curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl
  •  修改执行权限 
chmod a+x kerl
  • 配种环境变量
vim /etc/profile
  •  在打开的文件末尾添加
export KERL_HOME=/home/SummerGao/kerl
export PATH=${KERL_HOME}/:$PATH

  •  刷新环境变量
source /etc/profile
  •  查看kerl版本
kerl version 

至此kerl已安装完成。

3. 安装Erlang
  •  更新可用的已发布版本
 kerl update releases

 

  • 构建 26.2.5
kerl build 26.2.5 26.2.5

构建需要一段时间请耐心等待 

  •  查询已构建版本
kerl list builds

  •  状态查看
kerl status

  •  安装 26.2.5
kerl install 26.2.5 ~/kerl/26.2.5

  •  显示已安装版本
kerl list installations

 

  •  激活26.2.5
. /root/kerl/26.2.5/activate

 激活将备份您的 $ PATH,并将其添加到安装的 bin / 目录中。因此,它仅对当前 shell 会话有效,直到您激活另一个安装或调用 kerl_deactivate。

  • 查看已激活的 Erlang 版本
kerl active

 

  • 运行 erl 
erl

 至此Erlang已安装完成。

4. 安装Erlang 串口驱动

如果想直接通过香橙派AIPro的串口驱动电子纸屏,需要为Erlang安装一下串口驱动,如果使用ESP8266模块借助MQTT通信实现无线连接香橙派AIPro下面的步骤可跳过。

  • 下载驱动 
git clone https://github.com/tonyg/erlang-serial.git

这是一个带有 erlang 驱动程序的用于串行通信的端口程序,最初由 Johan Bevemyr 于 1996 年编写,从 2007 年起由 Tony Garnock-Jones 偶尔维护。

  •  修改Makefile 
. /root/kerl/26.2.5/activate

cd erlang-serial/

注意,安装之前我们需要修改一下Makefile 文件

vim Makefile

  将 FULL_INSTALL_DIR=$(DESTDIR)/erlang/lib/$(INSTALL_DIR)  调整为:

FULL_INSTALL_DIR=$(DESTDIR)/$(INSTALL_DIR)

这样可以完全按照我们自己指定的路径位置安装 

  • 安装 
make

DESTDIR=/root/kerl/26.2.5/lib make install

  •  测试

可以看到已经成功安装到了erlang 的lib 包下,然后运行一下看一下

Erlang/OTP 26 [erts-14.2.5] [source] [64-bit] [smp:4:3] [ds:4:3:10] [async-threads:1] [jit]

Eshell V14.2.5 (press Ctrl+G to abort, type help(). for help)
1> serial:start().
<0.92.0>
2> 

至此erlang串口驱动已安装成功。 

安装Arduino IDE、下载MQTT转串口驱动程序至ESP8266 WIFI模块

编译ESP8266 WIFI模块驱动程序使用。

1. 下载 ArduinoIDE
git clone git@github.com:technologiescollege/ArduinoTechnoEduc.git
2. 配置 ArduinoIDE
  • 安装ESP8266开发包 ESP8266 Arduino Core’s documentation!

  • 安装 PubSubClient MQTT集成包

  • 选择开发板类型 

3. 编译及下载程序至ESP8266WIFI模块

在IDE中打开 mqtt_to_serial_wifi_multi.ino 编译,然后选择端口号,下载至WIFI模块。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ESP8266WiFiMulti.h>

//WiFi相关配置,候选Wifi
const char* ssid_1 = "SummerGao1"; //WiFi名称
const char* password_1 = "123456";//WiFi密码
const char* ssid_2 = "SummerGao2"; //WiFi名称
const char* password_2 = "123456";//WiFi密码
const char* ssid_3 = "SummerGao3"; //WiFi名称
const char* password_3 = "123456";//WiFi密码
//MQTT Client相关配置
const char* mqtt_server = "localhost"; //MQTT服务器地址
const char* mqtt_username = "SummerGao"; //MQTT用户名
const char* mqtt_password = "123456"; //MQTT密码
const char* TOPIC = "home/devices/onoff/"; // 订阅消息主题
const char* TOPIC_WAKEUP = "home/devices/wake_up/"; // 订阅消息主题
const char* client_id = "clientId-ApjJZcy2024Dh";  // 标识当前设备的客户端编号

// WiFi connect timeout per AP. Increase when connecting takes longer.
const uint32_t connectTimeoutMs = 5000;
ESP8266WiFiMulti wifiMulti;

WiFiClient espClient;                             // 定义wifiClient实例
PubSubClient client(espClient);                   // 定义PubSubClient的实例
long lastMsg = 0;                                 // 记录上一次发送信息的时长

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);                   // 定义板载LED灯为输出方式
  pinMode(D8, OUTPUT);                            //D8引脚连接串口墨水屏WAKE引脚
  Serial.begin(115200);
  //D4->TX引脚
  Serial1.begin(115200);
  // 板子通电后要启动,稍微等待一下让板子点亮
  delay(10);
  setup_wifi();                                    //执行Wifi初始化,下文有具体描述
  client.setServer(mqtt_server, 1883);             //设定MQTT服务器与使用的端口,1883是默认的MQTT端口
  client.setCallback(callback);                    //设定回调方式,当ESP8266收到订阅消息时会调用此方法
}

void setup_wifi() {
  // Don't save WiFi configuration in flash - optional
  WiFi.persistent(false);
  // Register multi WiFi networks
  wifiMulti.addAP(ssid_1, password_1);
  wifiMulti.addAP(ssid_2, password_2);
  wifiMulti.addAP(ssid_3, password_3);
  // More is possible

  // Maintain WiFi connection
  if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) {
    Serial.print("WiFi connected: ");
    Serial.println(WiFi.SSID());
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("WiFi not connected!");
  }

}

//\xA5\x00\x09\x0A\xCC\x33\xC3\x3C\xA6
//A500090ACC33C33CA6
void callback(char* topic, byte* payload, unsigned int length) {
  //Serial.println(topic);
  if (strcmp(topic, TOPIC_WAKEUP) == 0) {
    String message = "";
    for (int i = 0; i < length; i++)
    {
      message += (char)payload[i];
    }

    if (message == "WAKE_UP_0") {
      digitalWrite(D8, LOW);
      Serial.println(message);
    } else if (message == "WAKE_UP_1") {
      digitalWrite(D8, HIGH);
      Serial.println(message);
    }
  } else if (strcmp(topic, TOPIC) == 0) {
    char x;
    for (int i = 0; i < length; i++)
    {
      x = (char)payload[i];
      //串口0:打印指令消息
      Serial.write(x);
      //串口1:转发指令消息
      Serial1.write(x);
    }
  } else {

  }

  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, HIGH);   // 亮灯
  } else {
    digitalWrite(BUILTIN_LED, LOW);   // 熄灯
  }
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(client_id, mqtt_username, mqtt_password)) {
      Serial.println("connected");
      // 连接成功时订阅主题
      client.subscribe(TOPIC);
      client.subscribe(TOPIC_WAKEUP);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      //重置wifi连接
      setup_wifi();
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    client.publish("home/status/", "{device:client_id,'status':'on'}");
  }
}

 代码中需要调整的部分:

//WiFi相关配置,候选Wifi
const char* ssid_1 = "SummerGao1"; //WiFi名称
const char* password_1 = "123456";//WiFi密码
const char* ssid_2 = "SummerGao2"; //WiFi名称
const char* password_2 = "123456";//WiFi密码
const char* ssid_3 = "SummerGao3"; //WiFi名称
const char* password_3 = "123456";//WiFi密码
//MQTT Client相关配置
const char* mqtt_server = "localhost"; //MQTT服务器地址
const char* mqtt_username = "SummerGao"; //MQTT用户名
const char* mqtt_password = "123456"; //MQTT密码
const char* TOPIC = "home/devices/onoff/"; // 订阅消息主题
const char* TOPIC_WAKEUP = "home/devices/wake_up/"; // 订阅消息主题
const char* client_id = "clientId-ApjJZcy2024Dh";  // 标识当前设备的客户端编号

至此ESP8266WIFI 模块已配置完成。

Emqx v5.6.0搭建MQTT服务器及二次开发

基于Emqx搭建MQTT服务器,基于Emqx进行二次开发集成电子纸屏驱动程序。这里已集成完成,可以直接下载develop分支源码编译运行。

1. 下载源码
git clone -b develop git@github.com:SummerGaoPlus/emqx_epaper_clock.git 
2. 参数配置 
  • 重点部分

  • 开启uart2串口

4. 源码构建
cd emqx_epaper_clock

make
4. 运行
cd emqx_epaper_clock

_build/emqx/rel/emqx/bin/emqx console

总结

这是对香橙派AIPro的开发板的初次尝试,之前一直在用树莓派4B进行开发。经过使用对比发现香橙派更加的强大,Linux 镜像中预装了很多实用的工具, 接口比树莓派要多,更易使用,生态比想象的要完善,官方给出的文档非常的全面,而且是国产中文的,值得拥有,值得去探索。刚到手还在探索中,后期会输出更多有关香橙派AIPro的使用教程及技术博文,分享更多有趣的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/654466.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web3革命:探索科技与物联网的无限可能

引言 Web3时代正在悄然而至&#xff0c;带来了对互联网的彻底颠覆和改变。作为互联网的下一代&#xff0c;Web3不仅是技术革新的延续&#xff0c;更是对传统互联网模式的重新构想。在这个新时代&#xff0c;科技与物联网的结合将迎来无限的可能性&#xff0c;将探索到一片全新…

如何在Python 中如何导入和引用外部文件(Colab VS Code)

1. 上传文件 在 Google Colab 中&#xff0c;从左侧界面的文件选项中使用 "Upload" 按钮上传文件。 在 VS Code 中&#xff0c;通过菜单栏中的 "File" -> "Open File/Folder" 选项上传文件&#xff08;建议将所有文件放入一个文件夹中&#…

【paper】基于分布式采样的多机器人编队导航信念传播模型预测控制

Distributed Sampling-Based Model Predictive Control via Belief Propagation for Multi-Robot Formation NavigationRAL 2024.4Chao Jiang 美国 University of Wyoming 预备知识 马尔可夫随机场&#xff08;Markov Random Field, MRF&#xff09; 马尔可夫随机场&#xff…

如何解决SEO排名上升后遭遇的攻击问题

随着搜索引擎优化&#xff08;SEO&#xff09;策略的成功实施&#xff0c;网站排名的提升往往会引来更多的流量与关注&#xff0c;但同时也可能成为恶意攻击的目标&#xff0c;包括DDoS攻击、SQL注入、XSS攻击等。这些攻击不仅影响用户体验&#xff0c;还可能导致网站降权甚至被…

目标检测数据集 - 铁路工人安全检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;铁路工人安全检测数据集&#xff0c;真实铁路监控场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如铁路工地工人作业数据、铁路巡检工人作业数据、铁路搬运工人作业数据、铁路场景货车上工人作业数据、铁路旁堆料区工人作业数据等。数据标签…

【图书推荐】《机器学习实战(视频教学版)》

本书用处 快速入门Python机器学习基础算法。 最后3个综合实战项目&#xff08;包括新闻内容分类实战、泰坦尼克号获救预测实战、中药数据分析项目实战&#xff09;可以作为研究可以的素材。 内容简介 本书基于Python语言详细讲解机器学习算法及其应用&#xff0c;用于读者快…

利用预测大模型完成办公室饮水机剩余热水量

背景 在每天上班的时候&#xff0c;很多同事都有喝热水的习惯&#xff0c;但是饮水机内的热水量总是比较少的&#xff0c;如何避免等待&#xff0c;高效的接到热水是我接下来要做的事情的动机。 理论基础 在大量真实数据的情况下&#xff0c;可以分析出用水紧张的时间段和用水…

【全开源】场馆预定系统源码(ThinkPHP+FastAdmin+UniApp)

一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序&#xff0c;提供运动场馆运营解决方案&#xff0c;适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 场馆预定系统源码&#xff1a;打造高效便捷的预定体验 一、引言&#xff1a;数字化预定时代的来临 …

专业上门预约洗衣洗鞋管理系统一站式解决方案

洗衣洗鞋店管理系统一站式解决方案&#xff0c;不仅运营稳定且功能强大&#xff0c;堪称现代生活中的得力助手。 在这个快节奏的时代&#xff0c;人们对便捷性的渴望愈发强烈。洗衣洗鞋作为日常生活中的一项琐碎事务&#xff0c;也亟需一个高效、省心的解决方案。为此&#xf…

databricks~Unity Catalog

Unity Catalog hierarchy 包含了用户授权管理信息和元数据信息 workspace with unity catalog hierarchy unity metastore Ref: https://www.youtube.com/playlist?listPLY-V_O-O7h4fwcHcXgkR_zTLvddvE_GfC

Java常用工具类、包装类

1、工具类的设计 一般地&#xff0c;把那些完成通用功能的方法分类存放到类中&#xff0c;这些类就叫工具类。 工具类起名&#xff1a;XxxUtil、XxxUtils、XxxTool、XxxTools等&#xff0c;其中Xxx表示一类事物&#xff0c;比如ArrayUtil、StringUtil、JdbcUtil。 工具类存放的…

Windows内核函数 - 创建关闭注册表

在驱动程序的开发中&#xff0c;经常会用到对注册表的操作。与Win32的API不同&#xff0c;DDK提供另外一套对注册表操作的相关函数。首先明确一下注册表里的几个概念&#xff0c;避免在后面混淆。 图1 注册表概念 有5个概念需要重申一下&#xff1a; * 注册表项&#xff1a; 注…

LabVIEW步开发进电机的串口控制程序

LabVIEW步开发进电机的串口控制程序 为了提高电机控制的精确度和自动化程度&#xff0c;开发一种基于LabVIEW的实时、自动化电机串口控制程序。利用LabVIEW软件的图形化编程特性&#xff0c;通过串口实时控制电机的运行参数&#xff0c;实现电机性能的精准控制与评估。 系统组…

实现echarts多图联动效果

实现echarts多图联动效果 文章目录 实现echarts多图联动效果业务场景实现关键api代码示例&#xff08;vue&#xff09; 业务场景 提示&#xff1a;主要是记录一下多个echarts联动效果实现方案 这本来就是echarts本身自带的api&#xff0c;并没有多高级&#xff0c;奈何寻找的过…

Excel表格保护密码遗忘怎么办?三秒钟破解密码,轻松解锁!

在我们的日常工作中&#xff0c;Excel表格是一个非常实用的工具&#xff0c;但在某些情况下&#xff0c;我们可能会遇到密码忘记的问题&#xff0c;或者在尝试打开或删除文件时被锁定。别担心&#xff0c;这里有三个简单的解决方法来帮助您解决问题。 一、尝试默认密码或常见密…

RangeNet++ 检测3D点云语义算法的详细配置和常见问题

配置环境&#xff1a; Ubuntu18.04 GPU&#xff1a;GeForce MX150 驱动&#xff1a;Ubuntu推荐的nvidia-driver-470 Cuda10.1 cudnn7.6.2 TensorRT 5.1.5.0GCC 7.5.0 运行代码&#xff1a; RangeNet 目录 目录 一、环境配置 1. Ubuntu 18.04 安装NVIDIA驱动 &…

网络——多区域OSPF配置(OSPF系列第1篇)

简介 路由协议OSPF全称为Open Shortest Path First&#xff0c;也就开放是的最短路径优先协议&#xff0c;使用链路状态路由算法&#xff0c;isis协议也是使用链路状态路由算法。而RIP协议使用距离矢量路由算法。 区域 为了能够降低OSPF计算的复杂程度&#xff0c;OSPF采用分…

Redis解决缓存一致性问题

文章目录 ☃️概述☃️数据库和缓存不一致采用什么方案☃️代码实现☃️其他 ☃️概述 由于我们的 缓存的数据源来自于数据库, 而数据库的 数据是会发生变化的, 因此,如果当数据库中 数据发生变化,而缓存却没有同步, 此时就会有 一致性问题存在, 其后果是: 用户使用缓存中的过…

简爱的思维导图怎么做?从这三个角度

简爱的思维导图怎么做&#xff1f;《简爱》作为夏洛蒂勃朗特的代表作&#xff0c;不仅是一部经典的爱情小说&#xff0c;也是探索女性独立与自我成长的文学巨著。为了深入理解这部作品&#xff0c;制作思维导图是一种高效的学习和分析工具。以下是三种不同的角度来创建《简爱》…

【LeetCode算法】第88题:合并两个有序数组

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;首次想到的解法&#xff1a;定义一个mn长度的辅助数组&#xff0c;从头遍历这两个数组&#xff0c;谁小就放进辅助数组中并且对应往后走&#xff0c;最后使用memcpy函…