H7-TOOL的LUA小程序教程第15期:电压,电流,NTC热敏电阻以及4-20mA输入(2024-10-21,已经发布)

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用,支持在线调试运行,支持离线运行。TOOL的LUA教程争取做到大家可以无痛调用各种功能函数,不需要学习成本。


简介

电压,电流,NTC热敏电阻以及4-20mA输入,可以在上位机端设置,也可以显示屏端设置

详细使用说明可以看在线或者离线操作说明手册:H7-TOOL操作说明和客户常见问题汇总贴,含PDF离线版(2024-08-16) - H7-TOOL开发工具 - 硬汉嵌入式论坛 - Powered by Discuz!

建议优先熟悉下,特别是这几个功能对应使用的引脚。


LUA函数说明:

1、启动模拟量采集。

启动模拟量采集仅需用到两个大类配置,一个负载电流测量,还有一个低速多通道。

所以启动模拟信号采集封装了两种配置

(1)负载电流测量,配置代码固定如下:

function start_dso(void)write_reg16(0x01FF, 1) -- 测量模式 0:示波器 1:负载电流 2:多路低速扫描write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DCwrite_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC--量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mVwrite_reg16(0x0202, 0) -- CH1量程write_reg16(0x0203, 0) -- CH2量程write_reg16(0x0204, 0) -- CH1通道直流偏值,未用write_reg16(0x0205, 0) -- CH2通道直流偏值,未用write_reg16(0x0206, 12) --采样频率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K--8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5Mwrite_reg16(0x0207, 0) --采样深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32Kwrite_reg16(0x0208, 32768) --触发电平ADC 0-65535write_reg16(0x0209, 50) --触发位置百分比 0-100write_reg16(0x020A, 0) --触发模式 0:自动 1:普通 2:单次write_reg16(0x020B, 0) --触发通道 0:CH1 1:CH2write_reg16(0x020C, 0) --触发边沿 0:下降沿 1:上升沿 write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2write_reg16(0x020E, 1) --采集控制 0:停止 1:启动end

(2)低速多通道测量,配置代码固定如下:

--启动模拟量电路
function start_dso(void)write_reg16(0x01FF, 2) -- 测量模式 0:示波器 1:负载电流 2:多路低速扫描write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DCwrite_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC--量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mVwrite_reg16(0x0202, 0) -- CH1量程write_reg16(0x0203, 0) -- CH2量程write_reg16(0x0204, 0) -- CH1通道直流偏值,未用write_reg16(0x0205, 0) -- CH2通道直流偏值,未用write_reg16(0x0206, 12) --采样频率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K--8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5Mwrite_reg16(0x0207, 0) --采样深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32Kwrite_reg16(0x0208, 32768) --触发电平ADC 0-65535write_reg16(0x0209, 50) --触发位置百分比 0-100write_reg16(0x020A, 0) --触发模式 0:自动 1:普通 2:单次write_reg16(0x020B, 0) --触发通道 0:CH1 1:CH2write_reg16(0x020C, 0) --触发边沿 0:下降沿 1:上升沿 write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2write_reg16(0x020E, 1) --采集控制 0:停止 1:启动end

2、测量函数,读取模拟值

测量函数比较简单,周期调用即可,建议100ms以上读取一次,因为所有数据100ms更新一轮

read_analog(9) --9 - 读取4-20mA


(1)电压读取

read_analog(0) -- 0 - CH1电压
read_analog(1) -- 1 - CH2电压

举例:每500ms读取一次CH1和CH2通道电压

实现代码如下:

--启动模拟量电路
function start_dso(void)write_reg16(0x01FF, 2) -- 测量模式 0:示波器 1:负载电流 2:多路低速扫描write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DCwrite_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC--量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mVwrite_reg16(0x0202, 0) -- CH1量程write_reg16(0x0203, 0) -- CH2量程write_reg16(0x0204, 0) -- CH1通道直流偏值,未用write_reg16(0x0205, 0) -- CH2通道直流偏值,未用write_reg16(0x0206, 12) --采样频率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K--8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5Mwrite_reg16(0x0207, 0) --采样深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32Kwrite_reg16(0x0208, 32768) --触发电平ADC 0-65535write_reg16(0x0209, 50) --触发位置百分比 0-100write_reg16(0x020A, 0) --触发模式 0:自动 1:普通 2:单次write_reg16(0x020B, 0) --触发通道 0:CH1 1:CH2write_reg16(0x020C, 0) --触发边沿 0:下降沿 1:上升沿 write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2write_reg16(0x020E, 1) --采集控制 0:停止 1:启动endprint("启动电压测量")
start_dso() -- 调用一次初始化for i = 1, 10, 1 do -- 读取10次
data1 = read_analog(0) -- 0 - CH1电压
data2 = read_analog(1) -- 1 - CH2电压
print(string.format("CH1电压:%f,CH2电压:%f", data1,data2))
delayms(500)
end

实际效果:


(2)高侧负载测量

read_analog(2) --2 - 高侧负载电压
read_analog(3) --3 - 高端负载电流

举例:每500ms读取一次

实现代码如下

--启动模拟量电路
function start_dso(void)write_reg16(0x01FF, 1) -- 测量模式 0:示波器 1:负载电流 2:多路低速扫描write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DCwrite_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC--量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mVwrite_reg16(0x0202, 0) -- CH1量程write_reg16(0x0203, 0) -- CH2量程write_reg16(0x0204, 0) -- CH1通道直流偏值,未用write_reg16(0x0205, 0) -- CH2通道直流偏值,未用write_reg16(0x0206, 12) --采样频率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K--8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5Mwrite_reg16(0x0207, 0) --采样深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32Kwrite_reg16(0x0208, 32768) --触发电平ADC 0-65535write_reg16(0x0209, 50) --触发位置百分比 0-100write_reg16(0x020A, 0) --触发模式 0:自动 1:普通 2:单次write_reg16(0x020B, 0) --触发通道 0:CH1 1:CH2write_reg16(0x020C, 0) --触发边沿 0:下降沿 1:上升沿 write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2write_reg16(0x020E, 1) --采集控制 0:停止 1:启动endprint("启动高侧测量")
start_dso() -- 调用一次初始化for i = 1, 10, 1 do -- 读取10次
data1 = read_analog(2) --2 - 高侧负载电压
data2 = read_analog(3) --3 - 高端负载电流
print(string.format("负载电压:%f,负载电流:%f", data1,data2))
delayms(500)
end

实际效果:


(3)TVCC测量

read_analog(4) --4 - TVCC电压
read_analog(5) --5 - TVCC电流

举例:每500ms读取一次

实现代码如下:

--启动模拟量电路
function start_dso(void)write_reg16(0x01FF, 2) -- 测量模式 0:示波器 1:负载电流 2:多路低速扫描write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DCwrite_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC--量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mVwrite_reg16(0x0202, 0) -- CH1量程write_reg16(0x0203, 0) -- CH2量程write_reg16(0x0204, 0) -- CH1通道直流偏值,未用write_reg16(0x0205, 0) -- CH2通道直流偏值,未用write_reg16(0x0206, 12) --采样频率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K--8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5Mwrite_reg16(0x0207, 0) --采样深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32Kwrite_reg16(0x0208, 32768) --触发电平ADC 0-65535write_reg16(0x0209, 50) --触发位置百分比 0-100write_reg16(0x020A, 0) --触发模式 0:自动 1:普通 2:单次write_reg16(0x020B, 0) --触发通道 0:CH1 1:CH2write_reg16(0x020C, 0) --触发边沿 0:下降沿 1:上升沿 write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2write_reg16(0x020E, 1) --采集控制 0:停止 1:启动endprint("启动TVCC测量")
start_dso() -- 调用一次初始化for i = 1, 10, 1 do -- 读取10次
data1 = read_analog(4) --4 - TVCC电压
data2 = read_analog(5) --5 - TVCC电流
print(string.format("TVCC电压:%f,TVCC电流:%f", data1,data2))
delayms(500)
end

(4)NTC热敏电阻测量

read_analog(6) --6 - NTC热敏电阻阻值

举例:每500ms读取一次

--启动模拟量电路
function start_dso(void)write_reg16(0x01FF, 2) -- 测量模式 0:示波器 1:负载电流 2:多路低速扫描write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DCwrite_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC--量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mVwrite_reg16(0x0202, 0) -- CH1量程write_reg16(0x0203, 0) -- CH2量程write_reg16(0x0204, 0) -- CH1通道直流偏值,未用write_reg16(0x0205, 0) -- CH2通道直流偏值,未用write_reg16(0x0206, 12) --采样频率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K--8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5Mwrite_reg16(0x0207, 0) --采样深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32Kwrite_reg16(0x0208, 32768) --触发电平ADC 0-65535write_reg16(0x0209, 50) --触发位置百分比 0-100write_reg16(0x020A, 0) --触发模式 0:自动 1:普通 2:单次write_reg16(0x020B, 0) --触发通道 0:CH1 1:CH2write_reg16(0x020C, 0) --触发边沿 0:下降沿 1:上升沿 write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2write_reg16(0x020E, 1) --采集控制 0:停止 1:启动endprint("启动NTC热敏电阻测量")
start_dso() -- 调用一次初始化for i = 1, 10, 1 do -- 读取10次
data1 = read_analog(6) --6 - NTC热敏电阻阻值
print(string.format("NTC热敏电阻:%f", data1))
delayms(500)
end

(5)供电电压测量

read_adc(7) --7 - 外部供电电压
read_analog(8) --8 - USB供电电压

举例:每500ms读取一次

--启动模拟量电路
function start_dso(void)write_reg16(0x01FF, 2) -- 测量模式 0:示波器 1:负载电流 2:多路低速扫描write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DCwrite_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC--量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mVwrite_reg16(0x0202, 0) -- CH1量程write_reg16(0x0203, 0) -- CH2量程write_reg16(0x0204, 0) -- CH1通道直流偏值,未用write_reg16(0x0205, 0) -- CH2通道直流偏值,未用write_reg16(0x0206, 12) --采样频率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K--8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5Mwrite_reg16(0x0207, 0) --采样深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32Kwrite_reg16(0x0208, 32768) --触发电平ADC 0-65535write_reg16(0x0209, 50) --触发位置百分比 0-100write_reg16(0x020A, 0) --触发模式 0:自动 1:普通 2:单次write_reg16(0x020B, 0) --触发通道 0:CH1 1:CH2write_reg16(0x020C, 0) --触发边沿 0:下降沿 1:上升沿 write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2write_reg16(0x020E, 1) --采集控制 0:停止 1:启动endprint("启动供电电压测量")
start_dso() -- 调用一次初始化for i = 1, 10, 1 do -- 读取10次
data1 = read_adc(7) --7 - 外部供电电压
data2 = read_analog(8) --8 - USB供电电压
print(string.format("外部供电电压:%f, USB供电电压:%f", data1, data2))
delayms(500)
end

(6)4-20mA测量
read_analog(9) -- 4-20mA测量

举例:每500ms读取一次

--启动模拟量电路
function start_dso(void)write_reg16(0x01FF, 2) -- 测量模式 0:示波器 1:负载电流 2:多路低速扫描write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DCwrite_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC--量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mVwrite_reg16(0x0202, 0) -- CH1量程write_reg16(0x0203, 0) -- CH2量程write_reg16(0x0204, 0) -- CH1通道直流偏值,未用write_reg16(0x0205, 0) -- CH2通道直流偏值,未用write_reg16(0x0206, 12) --采样频率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K--8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5Mwrite_reg16(0x0207, 0) --采样深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32Kwrite_reg16(0x0208, 32768) --触发电平ADC 0-65535write_reg16(0x0209, 50) --触发位置百分比 0-100write_reg16(0x020A, 0) --触发模式 0:自动 1:普通 2:单次write_reg16(0x020B, 0) --触发通道 0:CH1 1:CH2write_reg16(0x020C, 0) --触发边沿 0:下降沿 1:上升沿 write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2write_reg16(0x020E, 1) --采集控制 0:停止 1:启动endprint("启动4-20mA测量")
start_dso() -- 调用一次初始化for i = 1, 10, 1 do -- 读取10次
data1 = read_analog(9) -- 4-20mA测量
print(string.format("4-20mA读取:%f", data1, data2))
delayms(500)
end

测量的10mA,精度还是非常不错的


3、测量函数,直接读取ADC值

这个用法和第2步读取模拟值是完全一样的。只是这里获取的是ADC支持。

read_adc(0) --0 - CH1电压
read_adc(1) --1 - CH2电压
read_adc(2) --2 - 高侧负载电压
read_adc(3) --3 - 高端负载电流
read_adc(4) --4 - TVCC电压
read_adc(5) --5 - TVCC电流
read_adc(6) --6 - NTC热敏电阻阻值
read_adc(7) --7 - 外部供电电压
read_adc(8) --8 - USB供电电压
read_adc(9) -- 9 - 4-20mA输入
 

4、使用上位机同时展示这些数值

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UICollectionView 的UICollectionReusableView复用 IOS18报错问题记录

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 方法复用报错 报错详情: Terminating app due to uncaught exception NSInternal…

无人机电机运行算法

一、电机控制策略 无人机电机通常采用无刷直流电机(BLDC)或永磁同步电机(PMSM),其控制策略主要包括以下几个方面: PID控制: PID(Proportional Integral Derivative)控…

to_sql报错not all arguments converted during string formatting

报错: DatabaseError: Execution failed on sql SELECT name FROM sqlite_master WHERE typetable AND name?;: not all arguments converted during string formattingb 报错的代码如下: import pymysql import pandas as pd con pymysql.connect(…

双向循环带头链表

双向循环带头链表是一种复杂的数据结构。 带头链表是指在链表的最前端有一个额外的节点(头节点),这个头节点不存储实际的数据,主要用于方便链表的操作,比如在表头插入或删除节点时不用特殊处理空链表的情况。 双向…

Linux基础命令(入门)

linux 用户 root 用户 一个特殊的管理帐户 也被称为超级用户 root已接近完整的系统控制 对系统损害几乎有无限的能力 除非必要,不要登录为 root 普通( 非特权 ) 用户权限有限 造成损害的能力比较有限 linux的哲学思想(优点&#xf…

DCS项目调试踩坑记录

最近在调试一个DCS项目(集散控制系统),实际上就是一个新建厂区的控制系统。PLC用的是西门子1500,控制画面使用组态王7.5。 在调试过程中,发现给西门子DB块的变量转移到组态王太难了,因此记录一下&#xff0…

【设计模式-我的思考】套餐模式

imom排故下线-订单状态集查询功能实现(套餐模式) 需求描述 排故下线状态 不排故:未启用排故下线确认配置&订单状态参数值!(170、180、190) 待排故:启用排故下线确认配置&排故下线确认未执行&订单状态参数…

Spire.PDF for .NET【页面设置】演示:在 C# 中应用 PDF 页面转换

当您在导出为 PDF 格式的文档中翻页时,页面过渡会显示装饰效果,例如溶解或擦除。当您以 PDF 格式创建幻灯片时,页面过渡特别有用。Spire.PDF是一款专为开发人员设计的强大 .NET 组件,可让您将页面过渡应用于 PDF 文件。 这里介绍…

vue3学习记录-组件通信

vue3学习记录-组件通信 1.父子组件通信2.兄弟组件传值2.1 以父组件为媒介2.2 发布订阅模式2.3 使用mitt2.3.1 全局使用2.3.2 局部使用 1.父子组件通信 父组件&#xff1a; <template>父组件原有的title:{{ title }}<p>---</p><com :title"title&qu…

MyBatis入门之一对一关联关系(示例)

【图书介绍】《SpringSpring MVCMyBatis从零开始学&#xff08;视频教学版&#xff09;&#xff08;第3版&#xff09;》-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)&#xff08;第3版&#xff09;》(杨章伟&#xff0c;刘祥淼)【摘要 书评 试读】- 京东图书 …

FreeRTOS实时操作系统(1)

前言&#xff1a;FreeRTOS内容较多&#xff0c;分篇发布&#xff0c;较为基础&#xff0c;旨在梳理知识&#xff0c;适合入门的同学 &#xff08;基于正点原子STM32F103开发板V2&#xff09; &#xff08;对于本篇&#xff0c;若有疑问&#xff0c;欢迎在评论区留言&#…

Wooden UI(木头UI纹理按钮边框 背景图标 带PNG素材)

资源包包含以下元素&#xff1a;按钮、图标、框架、复选框等&#xff0c;提供分层的 PSD 文件。 下载&#xff1a;​​Unity资源商店链接资源下载链接 效果图&#xff1a;

橡皮鸭调试法(Rubber Duck Debugging)

橡皮鸭调试法&#xff08;Rubber Duck Debugging&#xff09;是一种编程中的调试技巧&#xff0c;名字来源于一本书《The Pragmatic Programmer》&#xff0c;其中提到程序员可以把问题讲给一只橡皮鸭听&#xff0c;以便在讲解的过程中梳理思路并找到问题的根源。 基本原理&am…

微服务基础架构(图)

微服务基础架构是一种现代化的软件架构模式&#xff0c;旨在将大型复杂的应用程序拆分为多个小型、独立的服务。每个微服务专注于特定的业务功能&#xff0c;可独立开发、部署和扩展。 在微服务基础架构中&#xff0c;通常会使用轻量级的通信机制&#xff0c;如 RESTful API 或…

RISC-V笔记——RVWMO基本体

1. 前言 RISC-V使用的内存模型是RVWMO(RISC-V Weak Memory Ordering)&#xff0c;它是Release Consistency的扩展&#xff0c;因此&#xff0c;RVWMO的基本特性类似于RC模型。 2. RC模型 Release consistency(RC)的提出是基于一个观察&#xff1a;将所有同步操作用FENCE围在一…

升级Unity后产生的Objects内存泄露现象

1&#xff09;升级Unity后产生的Objects内存泄露现象 2&#xff09;能否使用OnDemandRendering API来显示帧率 3&#xff09;Unity闪退问题 4&#xff09;配置表堆内存如何优化 这是第405篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答…

PHP 8.1.0-dev后门远程命令执行漏洞

#简介 PHP verion 8.1.0-dev于2021年3月28日与后门一起发布&#xff0c;但是后门很快被发现并删除。 #漏洞概述 PHP verion 8.1.0-dev的PHP在服务器上运行&#xff0c;则攻击者可以通过发送User-Agentt标头执行任意代码。 #影响版本 PHP 8.1.0-dev #环境搭建 新建docker…

LLM之RAG实战(四十四)| rag-chatbot:支持Huggingface和Ollama任意模型的多PDF本地RAG方案

特点&#xff1a; 支持本地运行和Kaggle (new)运行支持Huggingface 和Ollama 的任意模型Process multiple PDF inputs.Chat with multiples languages (Coming soon).Simple UI with Gradio. 一、安装使用 1.1 Kaggle&#xff08;推荐&#xff09; Step1&#xff1a;把https…

Android 10.0 Camera2 拍照镜像功能实现

1.前言 在10.0的系统rom定制化开发中,在进行camera2的相关拍照功能开发中,在某些时候会遇到拍照照片 左右镜像的问题,就是照片左半边和右半边是反的,所以就需要在拍照的时候保存图片的时候实现 左右镜像功能,接下来就来分析下拍照保存图片的流程 2.Camera2 拍照镜像功能实…

SQL 干货 | SQL 反连接

最强大的 SQL 功能之一是 JOIN 操作&#xff0c;它提供了一种优雅而简单的方法&#xff0c;将一个表中的每一条记录与另一个表中的每一条记录结合起来。不过&#xff0c;有时我们可能想从一个表中找到另一个表中没有的值。正如我们将在今天的博客文章中看到的&#xff0c;通过包…