唯客微博客

专注于计算机,嵌入式领域的技术

0%

电源反接,会给电路造成损坏,电源反接是不可避免的。所以我们就需要给电路中加入保护电路,达到即使接反电源,也不会损坏的目的,下面介绍几种常用防反接电路。

1. 单二极管防反接电路

二极管防反接保护

通常情况下直流电源输入防反接保护电路是运用二极管的单向导电性来完结防反接保护。这种接法简略可靠,但当输入大电流的情况下功耗影响是非常大的。以输入电流额定值达2A,二极管额定管压降为0.7V,那么功耗至少也要达到:Pd=2A×0.7V=1.4W,这样功率低,发热量大,要加散热器,不适合大电流供电电路、电池供电电路和低功耗电路

阅读全文 »

运算放大器常用电路

1. 反相放大电路

\[ V_{out} = - \frac{R2}{R1} * V_{in} \] 关于R1,R2及R3的选值:

1)、R1,R2及R3应该在K级,不宜达到M级;

2)、R3应该等于或近似于R1与R2的并联,以消除偏置电流的影响。

阅读全文 »

Jetpack Compose 使用技巧 - HorizontalPager

1. HorizontalPager 页面变化回调

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fun PhotoPagerScreen(
images: List<Image>,
page: Int,
onPageChange: (Int) -> Unit
) {
val pagerState = rememberPagerState()
LaunchedEffect(pagerState) {
snapshotFlow { pagerState.currentPage }.collect { page ->
onPageChange(page)
}
}
HorizontalPager(count = images.size, state = pagerState) { page ->
// load composable
}
LaunchedEffect(page) {
pagerState.scrollToPage(page)
}
}

2. HorizontalPager 无限循环(伪)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)
@Composable
fun MainScreen() {
val images = remember {
mutableStateListOf(
"https://images.pexels.com/photos/1450082/pexels-photo-1450082.jpeg?auto=compress&cs=tinysrgb&fm=jpg&w=640&h=960",
"https://images.pexels.com/photos/1366919/pexels-photo-1366919.jpeg?auto=compress&cs=tinysrgb&fm=jpg&w=640&h=960",
"https://images.pexels.com/photos/1743165/pexels-photo-1743165.jpeg?auto=compress&cs=tinysrgb&fm=jpg&w=640&h=960",
"https://images.pexels.com/photos/2437291/pexels-photo-2437291.jpeg?auto=compress&cs=tinysrgb&fm=jpg&w=640&h=960",
"https://images.pexels.com/photos/1670187/pexels-photo-1670187.jpeg?auto=compress&cs=tinysrgb&fm=jpg&w=640&h=960",
"https://images.pexels.com/photos/1266810/pexels-photo-1266810.jpeg?auto=compress&cs=tinysrgb&fm=jpg&w=640&h=960",
"https://images.pexels.com/photos/2832034/pexels-photo-2832034.jpeg?auto=compress&cs=tinysrgb&fm=jpg&w=640&h=960",
"https://images.pexels.com/photos/1743366/pexels-photo-1743366.jpeg?auto=compress&cs=tinysrgb&fm=jpg&w=640&h=960",
"https://images.pexels.com/photos/4555468/pexels-photo-4555468.jpeg?auto=compress&cs=tinysrgb&fm=jpg&w=640&h=960",
"https://images.pexels.com/photos/4552789/pexels-photo-4552789.jpeg?auto=compress&cs=tinysrgb&fm=jpg&w=640&h=960",
)
}

val imageCount = images.count() // 图片的个数
val dummyPageCount = Int.MAX_VALUE // 将页面个数设置为Int最大值,所以理论上是有尽头的

val pagerState = rememberPagerState(
// 起始位置为中间,以便左右都能翻页
initialPage = (dummyPageCount / imageCount / 2) * imageCount
)
val matrix = remember { ColorMatrix() }

Scaffold(modifier = Modifier.padding(vertical = 48.dp)) {
HorizontalPager(
pageCount = dummyPageCount, // 设置页面个数
state = pagerState
) { dummyIndex ->
// 实际页面索引
val index = dummyIndex % imageCount
// 实际当前页面索引
val currentIndex = pagerState.currentPage % imageCount
val pagerOffset = (currentIndex - index) + pagerState.currentPageOffsetFraction
val imageSize by animateFloatAsState(
targetValue = if (pagerOffset != 0.0f) 0.75f else 1f,
animationSpec = tween(durationMillis = 300)
)

LaunchedEffect(key1 = imageSize) {
if (pagerOffset != 0.0f) {
matrix.setToSaturation(0f)
} else {
matrix.setToSaturation(1f)
}
}

AsyncImage(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
.graphicsLayer {
scaleX = imageSize
scaleY = imageSize
}
.clip(RoundedCornerShape(16.dp)),
model = ImageRequest.Builder(LocalContext.current)
.data(images[index])
.build(),
contentDescription = "Image",
contentScale = ContentScale.Crop,
colorFilter = ColorFilter.colorMatrix(matrix)
)
}
}
}
阅读全文 »

QT获取下载、桌面、临时文件....等系统默认目录

头文件:

1
#include <QStandardPaths>

示例代码:

1
2
3
4
5
6
7
8
9
qDebug()<<"系统字体目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::FontsLocation);
qDebug()<<"系统桌面目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);
qDebug()<<"用户文档目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation);
qDebug()<<"用户音乐目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::MusicLocation);
qDebug()<<"用户图片目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
qDebug()<<"系统临时文件目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::TempLocation);
qDebug()<<"系统缓存目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::CacheLocation);
qDebug()<<"系统下载目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::DownloadLocation);
qDebug()<<"系统缓存目录路径:"<<QStandardPaths::standardLocations(QStandardPaths::CacheLocation);
阅读全文 »

CMake杂记

1. 在编译过程中打印编印信息

  • 执行命令cmake时追加:-DCMAKE_VERBOSE_MAKEFILE=ON
  • 在CMakeLists.txt中添加:set(CMAKE_VERBOSE_MAKEFILEON ON)

2. 打印自定义变量及其值

1
2
3
4
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
阅读全文 »

平面三角形外接(内切)圆圆心与半径求解算法

0.1 三角形面积S与外接圆半径R的关系

\[ \begin{align*} S &= \frac{a * b * c}{4 * R} \\ 外接圆半径R &= \frac{a * b * c}{4 * S} \end{align*} \]

0.2 三角形面积S与内切圆半径r的关系

\[ \begin{align*} S &= \frac{a * b * c}{4 * R} \\ 内切圆半径 r &= \frac{2 * S}{a + b + c} \end{align*} \]

阅读全文 »

题目

Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。

请你实现 Trie 类:

  • Trie() 初始化前缀树对象。
  • void insert(String word) 向前缀树中插入字符串 word 。
  • boolean search(String word)如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
  • boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。

示例:

阅读全文 »

ArchLinux自动挂载U盘

在Arch Linux中,您可以通过以下步骤来自动挂载USB设备:

  1. 确保您的系统上安装了udisks2软件包。您可以使用以下命令来安装该软件包:

    1
    sudo pacman -S udisks2
  2. 为了能够自动挂载USB设备,您需要启用udisks2服务。您可以使用以下命令启用该服务:

    1
    sudo systemctl enable udisks2.service
  3. 然后,您需要将您的用户添加到storage组中,以便您可以访问挂载点。您可以使用以下命令将您的用户添加到storage组中:

    1
    sudo gpasswd -a yourusername storage
  4. 最后,您可以将以下行添加到/etc/fstab文件中,以便自动挂载USB设备:

    1
    UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /mnt/usb auto nosuid,nodev,nofail,x-gvfs-show 0 0

    您需要将XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX替换为您的USB设备的UUID,并将/mnt/usb替换为您希望将USB设备挂载到的挂载点。

    您可以使用以下命令查找USB设备的UUID:

    1
    lsblk -f

    找到您的USB设备,然后在UUID列中查找UUID。

这样,每次插入USB设备时,它都会自动挂载到指定的挂载点。请注意,在第一次插入USB设备时,系统可能需要一些时间来创建挂载点。

Jetpack Compose组件-惰性列表(LazyColumn.LazyRow)

惰性列(LazyColumn)

在 LazyListScpoe 中,可以使用以下语句进行操作:

  • item 添加单个列表项
  • items 添加一组列表项
  • itemsIndexed 添加一组列表项
  • stickyHeader 添加粘性头部
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Composable
fun LazyColumn(
// 修饰符
modifier: Modifier = Modifier,
// 列表状态
state: LazyListState = rememberLazyListState(),
// 内容padding
contentPadding: PaddingValues = PaddingValues(0.dp),
// 反转滚动和布局方向
reverseLayout: Boolean = false,
// 垂直排列
verticalArrangement: Arrangement.Vertical = if (!reverseLayout) Arrangement.Top else Arrangement.Bottom,
// 水平排列
horizontalAlignment: Alignment.Horizontal = Alignment.Start,
// 甩动偏好
flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
// 禁止用户滚动,但可以通过编程方式滚动
userScrollEnabled: Boolean = true,
content: LazyListScope.() -> Unit
): Unit
阅读全文 »