手把手教你用Arduino UNO和ADS1115模块DIY一个多通道电压表(可测正负电压)

心梓

用Arduino UNO和ADS1115打造高精度多通道电压监测系统

在电子制作和电路调试过程中,电压测量是最基础也最频繁的操作之一。虽然万用表可以满足基本需求,但当我们需要同时监测多个测试点、记录电压变化趋势或测量微小电压差时,传统工具就显得力不从心。本文将带你用Arduino UNO开发板和ADS1115模数转换模块,打造一个功能强大的多通道电压监测系统,不仅能同时测量四个独立通道的电压,还能处理正负电压信号,精度远超普通万用表。

这个项目的独特价值在于它的灵活性和扩展性。通过编程配置,你可以自定义测量范围(从±256mV到±6.144V)、采样速率(8-860次/秒),并选择单端或差分测量模式。最终成果可以作为一个独立的电压表使用,也可以集成到更大的项目中作为数据采集模块。无论是电源质量监测、传感器信号分析还是实验数据记录,这个DIY工具都能大显身手。

1. 硬件选型与核心组件解析

1.1 为什么选择ADS1115模块

ADS1115是德州仪器(TI)推出的一款16位精度模数转换器(ADC),相比Arduino UNO内置的10位ADC,它的分辨率提高了64倍。这意味着在相同的电压范围内,ADS1115能够检测到更微小的电压变化——对于测量传感器信号或微小电压差至关重要。

模块的核心特性包括:

  • 16位高分辨率:理论最小可检测电压变化约0.1875mV(在±6.144V量程下)
  • 可编程增益放大器(PGA):支持±6.144V、±4.096V、±2.048V、±1.024V、±0.512V、±0.256V六种量程
  • 多路输入:4个单端输入或2个差分输入通道
  • I2C接口:仅需两根信号线即可与Arduino通信
  • 低功耗设计:连续转换模式下仅消耗150μA电流

提示:ADS1115的PGA功能特别实用,它能自动放大微小信号,无需外接放大电路即可直接测量热电偶、称重传感器等输出的毫伏级信号。

1.2 Arduino UNO作为控制核心的优势

虽然市面上有更强大的开发板,但Arduino UNO仍然是此类项目的理想选择:

  • 丰富的库支持:几乎所有常见传感器都有现成的库文件
  • 稳定的I2C通信:硬件I2C接口确保与ADS1115的可靠数据传输
  • 充足的IO资源:即使使用I2C接口,仍有足够引脚连接显示屏或按钮
  • 广泛的兼容性:项目完成后可以轻松移植到其他Arduino兼容板

1.3 所需材料清单

要完成本项目,你需要准备以下组件:

组件 规格 数量 备注
Arduino UNO R3版本 1 或其他兼容板
ADS1115模块 16位ADC 1 带板载电压基准
面包板 830孔 1 用于原型搭建
杜邦线 公对公 若干 建议不同颜色
液晶屏 I2C接口1602 1 可选,用于显示
电阻 10kΩ 4 分压用,可选
电位器 10kΩ 1 测试信号源

2. 硬件连接与电路设计

2.1 基础接线方案

ADS1115与Arduino UNO的连接非常简单,只需要4根线:

arduino复制// ADS1115引脚定义
#define ADS1115_ADDR 0x48  // 默认I2C地址

// Arduino UNO连接方式:
// ADS1115 VCC → Arduino 5V
// ADS1115 GND → Arduino GND
// ADS1115 SCL → Arduino A5(SCL)
// ADS1115 SDA → Arduino A4(SDA)

实际接线时,建议使用不同颜色的杜邦线区分电源和信号线,例如红色接5V,黑色接GND,黄色接SCL,绿色接SDA。这种标准化配色方案能显著降低接错线的风险。

2.2 测量模式选择与输入配置

ADS1115支持两种基本测量模式:

  1. 单端输入模式

    • 每个通道相对于GND测量电压
    • 可同时使用全部4个通道(A0-A3)
    • 适合测量电源电压、传感器输出等常规场景
  2. 差分输入模式

    • 测量两个输入引脚之间的电压差
    • 可用通道对:A0-A1或A2-A3
    • 适合测量电桥输出、电流采样电阻压降等

模式选择不仅影响接线方式,也关系到量程设置。例如,当测量±5V信号时,在单端模式下需要选择±6.144V量程,因为每个引脚电压都是相对于GND的正值;而在差分模式下,可以选择±4.096V量程,因为实际电压差通常较小。

2.3 扩展功能电路设计

为了提升系统的实用性,可以考虑添加以下电路:

  • 电压分压网络:用电阻分压测量高于6.144V的电压

    text复制待测高压 → [R1] → ADC输入 → [R2] → GND
    

    分压比计算公式:Vadc = Vinput × R2/(R1+R2)

  • 信号调理电路:对于含有噪声的信号,可以添加RC低通滤波

    text复制信号输入 → [10kΩ] → ADC输入
                     ↓
                   [0.1μF] → GND
    
  • 过压保护:在ADC输入端串联1kΩ电阻并并联5.1V稳压管,防止意外高压损坏芯片

3. 软件配置与编程实现

3.1 基础库安装与设置

首先需要安装ADS1115的驱动库。在Arduino IDE中,可以通过库管理器搜索并安装"Adafruit ADS1X15"库,这是一个被广泛使用的优质库。

arduino复制#include <Wire.h>
#include <Adafruit_ADS1X15.h>

Adafruit_ADS1115 ads;  // 创建ADS1115实例

void setup() {
  Serial.begin(9600);
  if (!ads.begin(0x48)) {  // 初始化I2C通信
    Serial.println("Failed to initialize ADS1115!");
    while (1);
  }
  
  // 设置增益和量程 (±6.144V)
  ads.setGain(GAIN_TWOTHIRDS);
}

3.2 单通道电压测量实现

最基本的单端电压测量代码如下:

arduino复制void loop() {
  int16_t adc0 = ads.readADC_SingleEnded(0);  // 读取A0通道
  float voltage = ads.computeVolts(adc0);     // 转换为电压值
  
  Serial.print("A0 Voltage: "); 
  Serial.print(voltage, 4);  // 显示4位小数
  Serial.println("V");
  
  delay(500);  // 半秒更新一次
}

3.3 多通道扫描与差分测量

要充分利用ADS1115的多通道能力,可以实现循环扫描:

arduino复制void readAllChannels() {
  for (int ch = 0; ch < 4; ch++) {
    int16_t adc = ads.readADC_SingleEnded(ch);
    float volts = ads.computeVolts(adc);
    
    Serial.print("A"); Serial.print(ch);
    Serial.print(": "); Serial.print(volts, 4);
    Serial.print("V\t");
  }
  Serial.println();
}

差分测量则需要稍作修改:

arduino复制int16_t diff_0_1 = ads.readADC_Differential_0_1();
float diffVoltage = ads.computeVolts(diff_0_1);

3.4 采样率与精度优化

ADS1115允许调整采样率以平衡速度和精度:

arduino复制// 在setup()中添加:
ads.setDataRate(RATE_ADS1115_860SPS);  // 最高860次/秒

// 可选速率:
// RATE_ADS1115_8SPS     (8次/秒)
// RATE_ADS1115_16SPS    (16次/秒)
// ...
// RATE_ADS1115_860SPS   (860次/秒)

高采样率适合捕捉快速变化的信号,但会略微降低分辨率。对于静态或慢变信号,建议使用较低的采样率以获得更好的噪声性能。

4. 系统集成与功能扩展

4.1 添加LCD显示屏输出

为了摆脱对电脑串口监视器的依赖,可以添加I2C接口的LCD显示屏:

arduino复制#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // 地址可能为0x3F

void setup() {
  lcd.init();
  lcd.backlight();
}

void displayVoltage(int channel, float voltage) {
  lcd.setCursor(0, 0);
  lcd.print("CH"); lcd.print(channel);
  lcd.print(":");
  lcd.print(voltage, 3);
  lcd.print("V ");
}

4.2 数据记录与可视化

将电压数据记录到SD卡或发送到电脑进行可视化分析:

arduino复制#include <SD.h>

void logData(float v0, float v1, float v2, float v3) {
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  
  if (dataFile) {
    dataFile.print(millis()); dataFile.print(",");
    dataFile.print(v0, 4); dataFile.print(",");
    dataFile.print(v1, 4); dataFile.print(",");
    dataFile.print(v2, 4); dataFile.print(",");
    dataFile.println(v3, 4);
    
    dataFile.close();
  }
}

4.3 阈值报警功能实现

利用ADS1115内置的比较器,可以实现硬件级的阈值检测:

arduino复制// 设置阈值触发
ads.setComparatorQueEnable(false);  // 禁用队列
ads.setComparatorLatchEnable(true); // 启用锁存
ads.setComparatorPolarityLow();     // 低电平有效
ads.setComparatorModeTraditional(); // 传统比较模式

// 设置高低阈值 (以ADC计数值表示)
ads.setLowThreshold(-1000);
ads.setHighThreshold(1000);

// 在循环中检查警报
if (ads.getLastConversionResults() >= ads.getHighThreshold()) {
  digitalWrite(BUZZER_PIN, HIGH);  // 触发蜂鸣器
}

5. 实用案例与应用技巧

5.1 锂电池组电压监测

用分压电阻测量多节锂电池串联的总电压:

arduino复制// 假设使用100kΩ和10kΩ分压电阻
const float R1 = 100000.0;
const float R2 = 10000.0;
const float DIVIDER_RATIO = (R1 + R2) / R2;

float readBatteryVoltage(int channel) {
  int16_t adc = ads.readADC_SingleEnded(channel);
  float voltage = ads.computeVolts(adc) * DIVIDER_RATIO;
  return voltage;
}

5.2 电流测量应用

配合分流电阻测量电流:

text复制// 接线示例:
// 电源+ → 负载+ → 负载- → [分流电阻] → 电源-
// ADS1115 A0接分流电阻左侧,A1接右侧

计算电流的代码:

arduino复制const float SHUNT_RESISTOR = 0.1;  // 0.1欧姆分流电阻

float readCurrent() {
  int16_t diff = ads.readADC_Differential_0_1();
  float voltage = ads.computeVolts(diff);
  float current = voltage / SHUNT_RESISTOR;
  return current;  // 单位:安培
}

5.3 温度监测系统

通过测量热电偶或热敏电阻电压来监测温度:

arduino复制// NTC热敏电阻温度计算
const float BETA = 3950.0;      // B值
const float R25 = 10000.0;      // 25℃时的电阻值
const float R_REF = 10000.0;    // 分压参考电阻

float readTemperature(int channel) {
  int16_t adc = ads.readADC_SingleEnded(channel);
  float Vout = ads.computeVolts(adc);
  float Rntc = R_REF * (3.3 / Vout - 1.0);
  
  // Steinhart-Hart方程
  float steinhart = log(Rntc / R25) / BETA + 1.0 / (25.0 + 273.15);
  float tempK = 1.0 / steinhart;
  float tempC = tempK - 273.15;
  
  return tempC;
}

5.4 系统校准与误差补偿

为提高测量精度,可以进行简单的两点校准:

arduino复制// 校准参数
float gain_error = 1.012;  // 增益误差修正
float offset_error = 0.003; // 零点偏移修正(V)

float calibratedRead(int channel) {
  int16_t raw = ads.readADC_SingleEnded(channel);
  float voltage = ads.computeVolts(raw);
  return (voltage - offset_error) * gain_error;
}

校准步骤:

  1. 输入已知0V电压,记录读数作为offset_error
  2. 输入已知基准电压(如5.000V),计算gain_error = 实际值/测量值
  3. 将这两个参数应用到所有读数中

内容推荐

【车载开发系列】DRBFM实战:从设计变更到风险闭环
本文深入探讨了DRBFM在车载开发中的实战应用,从设计变更到风险闭环的全流程管理。通过案例分析展示了DRBFM如何帮助团队提前识别风险、优化资源分配,并实现跨部门协作,显著提升车载电子系统的开发效率和质量。文章特别强调了车载场景下的特殊考量和工具链集成实践,为行业从业者提供了宝贵经验。
我的第一个医学AI模型:用PyTorch在Colab上训练肺部X光分类器(避坑指南)
本文详细介绍了如何使用PyTorch在Google Colab上训练肺部X光分类器,涵盖环境准备、数据预处理、模型设计、训练优化和部署全流程。通过COVID-19肺部X光数据集,读者可以学习医学图像处理的关键技术,并避开常见陷阱,快速构建实用的AI模型。
Windows 10/11 双击 Docker Desktop 没反应?别急着重装,先检查这3个地方
本文详细解析了Windows 10/11双击Docker Desktop无反应的常见原因及解决方案。通过检查WSL2状态、系统版本兼容性和环境冲突,帮助用户快速定位问题,避免不必要的重装。特别针对Docker Desktop安装过程中的常见错误提供了实用排查技巧和命令。
从VGG到DeepLab:我是如何用空洞卷积(Dilated Conv)在Kaggle图像分割赛中省掉上采样层的
本文详细介绍了空洞卷积(Dilated Convolution)在Kaggle图像分割比赛中的实战应用,通过对比传统编码器-解码器结构,展示了空洞卷积在节省显存、提升推理速度方面的优势。文章包含代码示例、性能对比和优化策略,帮助开发者高效实现图像分割任务。
【2024实战指南】PyCharm无缝集成Jupyter Notebook:从环境配置到高效开发
本文详细介绍了如何在PyCharm 2024中无缝集成Jupyter Notebook,从环境配置到高效开发的实战指南。通过对比不同安装方案,推荐使用Conda虚拟环境,并分享PyCharm连接技巧、单元格魔法操作、调试与性能优化等实用技巧,帮助开发者提升数据分析和机器学习项目的开发效率。
VMware Workstation 17 实战:手把手教你部署macOS Sonoma 14及性能调优
本文详细介绍了在VMware Workstation 17上部署macOS Sonoma 14的完整流程及性能调优技巧。从环境准备、虚拟机配置到系统安装,逐步指导用户解决常见问题,并提供针对CPU、内存、网络等关键性能的优化方案,帮助用户在非苹果硬件上高效运行macOS系统。
Windows离线部署Oh-My-Zsh:从Git Bash到个性化终端的完整指南
本文提供了一份详细的Windows离线部署Oh-My-Zsh的完整指南,涵盖从Git Bash安装到Zsh配置、Oh-My-Zsh离线安装及个性化定制的全流程。特别针对内网环境开发者,解决了离线安装难题,并分享了主题配置、插件管理及性能优化等实用技巧,帮助用户打造高效命令行工作环境。
stm32 FOC从学习开发(六)SVPWM算法实战:从扇区判断到PWM生成
本文详细介绍了STM32 FOC开发中的SVPWM算法实战,从扇区判断到PWM生成的完整流程。通过优化计算方法和工程技巧,如避免三角函数、处理边界条件和过调制,提升算法效率和稳定性。文章还提供了STM32定时器配置和PWM生成的硬件级优化建议,帮助开发者快速实现高性能电机控制。
别再手动对时间了!一个Python脚本自动解析‘老板作息表’,生成你的空闲时间报告
本文介绍如何使用Python自动解析时间表并生成空闲时间报告,解放双手提升效率。通过`datetime`和`pandas`库处理时间数据,实现时间段排序、合并及空闲时段计算,支持多种输入格式和报告导出功能,适用于会议日程、项目计划等场景的时间管理优化。
OpenWRT SFTP服务搭建与内网穿透:构建个人安全的远程文件管理站
本文详细介绍了如何在OpenWRT上搭建SFTP服务并实现内网穿透,构建个人安全的远程文件管理站。通过安装配置openssh-sftp-server、优化存储设备挂载、加固SSH安全设置以及使用cpolar工具实现公网远程文件传输,帮助用户快速建立高效、安全的私有云解决方案。
Node.js 第十三章(os):从系统探针到跨平台自动化
本文深入探讨了Node.js的os模块在跨平台自动化开发中的强大应用。从系统类型检测到硬件信息获取,再到实战案例如跨平台脚本开发和资源监控工具,展示了如何利用os模块实现智能任务调度和路径处理。文章还提供了性能优化和错误处理的最佳实践,帮助开发者高效利用系统资源,提升跨平台应用的兼容性和性能。
别再只调包了!手把手教你用TensorFlow 1.x和Keras从零搭建CNN,搞定西储大学轴承数据故障诊断
本文详细介绍了如何使用TensorFlow 1.x和Keras从零搭建1D-CNN模型,应用于西储大学轴承数据的故障诊断。通过环境配置、数据预处理、模型架构设计、训练调优及部署实践,帮助读者掌握深度学习在工业故障诊断中的核心技术,提升故障识别效率。
罗技鼠标宏Lua脚本实战:从零打造你的CF专属外设方案(含一键鬼跳、压枪、瞬狙等核心代码)
本文详细介绍了如何利用罗技鼠标宏和Lua脚本为《穿越火线》打造专属外设方案,包含一键鬼跳、压枪、瞬狙等核心功能的实现代码。从基础入门到高级技巧,手把手教你通过G Hub驱动编写高效游戏脚本,提升操作水平。适合CF玩家和罗技鼠标用户学习参考。
构建坚不可摧的NVIDIA vGPU许可服务:高可用集群实战与避坑指南
本文详细介绍了如何构建高可用的NVIDIA vGPU许可服务集群,涵盖硬件配置、安全策略、双活节点部署及故障演练等关键环节。通过实战案例和避坑指南,帮助IT管理员实现秒级故障切换,确保虚拟化环境和AI开发的持续稳定运行。特别针对FlexNet许可服务的常见问题提供了解决方案。
揭秘TCP 2MSL:从四次挥手到连接复用的关键等待
本文深入解析TCP协议中的2MSL等待机制,从四次挥手的标准流程到连接复用的关键作用。2MSL作为网络通信的安全缓冲期,确保数据可靠传输并防止旧连接报文干扰新连接。文章还探讨了2MSL的实践调优策略,帮助开发者在安全性和性能之间找到平衡。
HC-05蓝牙模块配置:从AT指令到STM32通信实战
本文详细介绍了HC-05蓝牙模块的配置与STM32通信实战,包括硬件连接、AT指令模式进入、常用AT指令集详解、STM32串口配置及蓝牙数据收发实战。通过具体代码示例和常见问题排查,帮助开发者快速掌握蓝牙模块的应用技巧,实现稳定可靠的无线通信控制。
Android S 开发调试:手把手教你用CarrierTestOverride.xml模拟任意运营商SIM卡
本文详细介绍了如何在Android S开发中使用CarrierTestOverride.xml文件模拟任意运营商SIM卡,包括环境准备、配置文件创建、部署激活及高级调试技巧。通过这一方法,开发者可以低成本高效地测试不同运营商网络下的应用功能,特别适合需要多运营商兼容性验证的场景。
实战避坑:解决训练中‘wandb’报错的三种高效方案
本文详细解析了深度学习训练中常见的‘wandb’报错问题,提供了三种高效解决方案:强制离线模式、代码级禁用和完整登录流程。针对不同场景,从新手友好到团队协作需求,帮助开发者快速解决wandb初始化失败、网络连接等问题,确保训练流程顺利进行。
PCL点云处理实战:用KD-Tree和Octree搞定最近邻搜索(附C++代码避坑指南)
本文深入探讨PCL点云处理中KD-Tree和Octree两种空间索引结构的实战应用,通过C++代码示例展示它们在最近邻搜索中的高效实现。文章对比了KD-Tree和Octree的特性差异,提供了性能调优策略和常见问题解决方案,帮助开发者在自动驾驶、机器人导航等场景中优化点云处理效率。
LLMs之Code:SQLCoder的实战评测、性能对比与部署优化指南
本文深入评测了SQLCoder在自然语言转SQL场景中的性能表现,并与GPT-3.5 turbo、GPT-4等主流模型进行横向对比。文章详细介绍了SQLCoder的部署优化方案,包括本地GPU配置、Colab Pro技巧和云端成本分析,并提供了生产环境性能调优的实战经验,帮助开发者高效应用这一AI工具。
已经到底了哦
精选内容
热门内容
最新内容
别再只用WPA2了!保姆级教程带你用Wireshark抓包,亲手验证WPA3-SAE如何防破解
本文深入解析WPA3-SAE安全机制,通过Wireshark抓包对比实验,揭示其如何有效防御WPA2的经典破解手法。从环境搭建到四次握手漏洞重现,再到SAE的蜻蜓密钥交换协议,详细展示了WPA3的抗暴力破解特性及前向保密优势,为提升WiFi安全提供实战指南。
从IEEE Vis 2017到2023:我是如何用这些体渲染论文搞定毕业设计的
本文分享了如何利用IEEE Vis会议论文高效完成体渲染毕业设计的实战经验。通过建立三级筛选法、逆向解析法等系统方法,作者从2017-2023年的精选论文中提炼出可复现的算法思路和创新点,并详细介绍了技术降维、模块替换等五个转换技巧,帮助读者将学术理论转化为可行方案。
ARM内存屏障实战:从架构规范到Cortex-M实现的20个关键场景解析
本文深入解析ARM架构中内存屏障(DMB、DSB、ISB)的20个关键应用场景,涵盖Cortex-M系列处理器的单线程、多核同步、外设控制等实战案例。通过具体代码示例和性能数据,揭示内存屏障在确保指令顺序、数据一致性方面的核心作用,帮助开发者规避常见并发问题,提升嵌入式系统可靠性。
Python自动化脚本报错?一招搞定‘confidence参数’依赖的OpenCV安装
本文详细解析了Python自动化脚本中因缺少OpenCV导致的'confidence参数'报错问题,提供了OpenCV的多种安装方法和跨平台指南。通过深入分析PyAutoGUI与OpenCV的技术依赖关系,帮助开发者快速解决图像匹配中的常见问题,并优化自动化脚本的准确性和性能。
DTC状态机:从Pending到Aging的完整生命周期解析
本文深入解析了DTC状态机从Pending到Aging的完整生命周期,详细介绍了其在UDS协议框架下的工作原理和状态转换机制。通过实际案例和代码示例,阐述了跳闸计数器和老化计数器的精妙设计,以及状态转换中的工程实践和常见陷阱,为汽车诊断系统的开发提供了宝贵经验。
Unity ML-Agents实战:用GAIL+BC给你的AI智能体‘开小灶’,训练速度提升90%
本文详细介绍了如何利用GAIL(生成对抗模仿学习)和BC(行为克隆)技术加速Unity ML-Agents智能体训练,提升90%的训练效率。通过实战案例和配置示例,展示了模仿学习在游戏开发、机器人控制等领域的应用优势,帮助开发者快速掌握混合训练方法。
【Element UI深度定制】el-dialog标题栏样式重构与交互优化实践
本文详细介绍了Element UI中el-dialog组件的深度定制方法,包括标题栏样式重构与交互优化实践。通过使用slot插槽、深度样式覆盖和Flex布局等技巧,开发者可以灵活实现自定义标题栏设计,满足复杂业务场景需求。文章还提供了性能优化与常见问题解决方案,帮助提升前端开发效率。
跨越物理界限:MODBUS RTU Over TCP/IP 的工业网络融合实践
本文深入探讨了MODBUS RTU Over TCP/IP在工业网络中的融合实践,详细解析了协议转换的底层原理、实战配置流程及性能优化技巧。通过实际案例展示了如何突破传统MODBUS RTU的物理距离限制,实现老旧设备与现代系统的无缝对接,显著提升工业网络的灵活性和效率。
从Blender建模到Unity上架:一个完整3D道具(FBX格式)的工作流实战记录
本文详细记录了从Blender建模到Unity上架的完整3D道具工作流,重点解析FBX格式在跨软件协作中的关键技巧。通过中世纪短剑案例,涵盖拓扑优化、UV展开、FBX导出参数设置及Unity集成等实战环节,帮助开发者高效实现游戏就绪的3D模型制作。
AD21 PCB设计实战:巧用FPGA管脚交换优化高速布线
本文详细介绍了在AD21 PCB设计中如何巧妙运用FPGA管脚交换技术优化高速布线。通过分析FPGA管脚交换的基本原理、设计前的准备工作、PCB编辑器中的实战操作以及设计验证流程,帮助工程师解决高速信号布线中的交叉冲突问题,提升设计效率与信号完整性。特别适合使用Altium Designer进行复杂FPGA设计的硬件工程师参考。