基于ESP32与ADS1115的工业级0-10V电压采集与OLED显示实战
1. 项目概述与核心价值在工业现场摸爬滚打这些年信号采集是绕不开的基础活。从简单的温度、压力到复杂的流量、液位很多传感器最终输出的都是一个0-10V的模拟电压信号。把这个连续的物理信号稳定、准确地“翻译”成微控制器能懂的数字语言是自动化系统感知世界的“眼睛”。过去我们可能得自己搭电路用运放做信号调理再选个合适的ADC芯片折腾下来一个采集模块的成本和体积都不小。最近上手了一款叫Norvi-IIOT-AE02-V的工业控制器它直接把ESP32、高精度ADC、数字输入输出、OLED屏和工业通信接口打包成了一个坚固的小盒子特别适合用来快速搭建工业级的信号采集与显示节点。今天我就结合自己的实操经验把这个基于ESP32实现0-10V电压测量并OLED显示的项目从硬件原理到代码细节掰开揉碎了讲清楚。这个项目的核心就是利用控制器内置的ADS1115这款16位模数转换器ADC去测量外部的0-10V电压信号然后将转换后的数字量通过I2C通信传给ESP32主控进行计算和处理最终将换算出的实际电压值实时显示在同样通过I2C连接的OLED显示屏上。整个过程涉及硬件分压电路、ADC配置、I2C总线操作和显示驱动是一个典型的嵌入式数据采集应用。无论你是想监控设备供电电压、采集传感器信号还是学习工业级数据采集系统的构建这个案例都能提供一个非常扎实的参考模板。2. 硬件深度解析从信号输入到数字显示2.1 Norvi-IIOT-AE02-V控制器功能模块拆解拿到这个控制器第一感觉就是“全”。它不像一个开发板更像一个为工业环境定制的终端设备。我们重点关注与本次项目相关的几个核心部分主控与通信核心ESP32这是整个设备的大脑负责运行逻辑程序、处理数据、管理Wi-Fi/蓝牙无线连接以及RS-485有线通信。它的强大之处在于双核处理器和丰富的通信接口为复杂的物联网应用提供了可能。模拟信号输入前端ADS1115 x2这是实现高精度测量的关键。控制器集成了两片德州仪器TI的ADS1115芯片。这是一款16位分辨率、带可编程增益放大器PGA的ADC本身每个芯片有4个差分/单端输入通道。高分辨率意味着它能将模拟电压划分成更多2^1665536个离散等级从而获得更精细的测量结果减少量化误差。人机交互界面OLED显示屏与按键一块0.96英寸、128x64分辨率的SSD1306 OLED屏通过I2C与ESP32连接。OLED的自发光特性使其在光线不佳的工业现场也能清晰显示。三个实体按键可用于菜单导航或参数设置增加了本地操作的灵活性。工业接口与电源提供了8路24V数字量输入用于连接开关、传感器和2路晶体管输出可作开关量或PWM控制。电源输入接口宽压设计能适应波动的工业现场电压。所有这些都被封装在一个坚固的塑料或金属外壳内具备一定的防尘和抗干扰能力。注意工业现场环境复杂存在电磁干扰、电源波动等问题。这种一体化控制器在设计时通常会考虑隔离、滤波和电源净化比用面包板搭建的系统在可靠性和抗干扰能力上要强得多。对于关键应用务必确认设备满足你的环境等级如IP防护等级、工作温度范围。2.2 0-10V测量背后的硬件设计原理这是本项目的一个技术重点。ADS1115芯片的数据手册明确写着其模拟输入引脚能承受的绝对最大电压范围是VSS - 0.3V 到 VDD 0.3V。当ADC的参考电压VDD为3.3V时你直接给它的输入脚加一个10V电压芯片瞬间就会损坏。那么控制器是如何安全地测量0-10V的呢答案就在内部的分压电阻网络上。原理图里通常会显示每个模拟输入通道A0-A5前端都串联了两个精密电阻构成一个分压器。假设总电阻为R1R2接在输入信号0-10V和地之间而ADC测量点是R2上的电压。根据分压公式V_adc V_input * (R2 / (R1 R2))。为了让10V输入时ADC端电压不超过其量程比如设定在4.096V就需要精心选择R1和R2的比值。资料中提到内部设计使得ADC读到的电压值是实际输入电压的1/2.5即0.4倍。我们来反推一下如果V_input_max 10V 期望V_adc_max 4.0V那么分压比应为 4.0 / 10 0.4。所以R2 / (R1R2) 0.4。这意味着实际到达ADS1115输入引脚的电压被缩小到了安全范围。在软件中我们需要将ADC读取的电压值乘以2.5即1/0.4才能还原出真实的0-10V输入电压。为什么是2.5倍这是一种硬件上的信号调理。它带来了两个好处一是保护了精贵的ADC芯片使其免于过压损坏二是实际上“放大”了ADC的有效测量范围。虽然ADC本身的量程可能只有4.096V但通过分压它能间接测量0-10V的信号只是分辨率会有所折损。不过得益于ADS1115的16位高分辨率这种折损在多数工业场合是可以接受的。2.3 I2C总线与设备地址分配控制器内部ESP32、两个ADS1115和一个OLED屏都挂载在同一组I2C总线上。I2C是一种简单、高效的两线制串行通信协议SDA数据线SCL时钟线非常适合板载设备间的短距离通信。这里有一个关键细节所有I2C设备都必须有一个唯一的地址。在Norvi-IIOT-AE02-V中OLED显示屏 (SSD1306)地址固定为0x3C十六进制。这是该型号芯片的常见地址。ADS1115 ADC模块芯片本身可以通过配置其ADDR引脚的电平来设置多个地址。控制器中焊接了两片分别被设置为第一片ADS1115负责A0-A3通道地址0x48第二片ADS1115负责A4-A5通道地址0x49ESP32的GPIO 16和GPIO 17被分别定义为SDA和SCL用于与这些设备通信。在代码中我们正是通过指定这些地址来与特定的ADC或显示屏进行数据读写操作的。这种设计使得主控可以用最少的IO引脚管理多个外设。3. 软件环境搭建与核心库解析3.1 Arduino IDE开发环境配置虽然ESP32可以用ESP-IDF等更底层的框架开发但对于快速原型和大多数应用来说Arduino IDE以其库生态丰富和上手简单而广受欢迎。你需要做以下准备安装Arduino IDE从Arduino官网下载并安装最新稳定版。添加ESP32开发板支持打开IDE进入“文件”-“首选项”在“附加开发板管理器网址”中输入https://espressif.github.io/arduino-esp32/package_esp32_index.json。然后打开“工具”-“开发板”-“开发板管理器”搜索“esp32”找到并安装“Espressif Systems”提供的ESP32开发板包。选择正确的开发板与端口安装完成后在“工具”-“开发板”中选择“ESP32 Dev Module”或类似的通用型号。将Norvi控制器通过USB线连接电脑在“工具”-“端口”中选择新出现的串口通常是COMx或/dev/ttyUSBx。实操心得有时ESP32的USB驱动会出问题特别是在Windows上。如果端口不出现或上传失败可以尝试重新插拔USB线、更换USB口或者安装CP210x或CH340等USB转串口芯片的驱动具体取决于控制器使用的桥接芯片。在Mac或Linux下可能需要给串口设备添加读写权限。3.2 关键第三方库的安装与作用本项目代码依赖几个优秀的开源库它们封装了底层硬件操作让我们能专注于应用逻辑Adafruit ADS1X15 Library这是驱动ADS1115以及其低分辨率版本ADS1015的核心库。它提供了简单的函数来初始化ADC、设置增益、读取单端或差分通道的值。通过库函数readADC_SingleEnded(channel)我们可以直接获取指定通道的原始ADC计数值库内部会处理I2C通信细节。Adafruit SSD1306 Adafruit GFX Library这是一对组合库。Adafruit SSD1306是专门针对SSD1306系列OLED驱动的库负责底层的显示初始化、像素控制等。Adafruit GFX Library是一个图形库提供了画点、线、圆、矩形以及显示文本的高级函数。我们调用GFX库的函数如setTextSize,println来显示内容SSD1306库则在底层执行。Wire.h这是Arduino核心库的一部分提供了I2C通信的底层API。虽然Adafruit的库已经封装了它但在初始化时我们仍需要调用Wire.begin(SDA_pin, SCL_pin)来指定ESP32用于I2C的引脚。安装方法在Arduino IDE中点击“工具”-“管理库…”打开库管理器。分别搜索“Adafruit ADS1X15”、“Adafruit SSD1306”和“Adafruit GFX”找到并安装它们。安装SSD1306和GFX时注意库的依赖关系通常IDE会提示你安装依赖库。4. 代码逐行详解与功能实现让我们结合提供的示例代码深入理解每一部分的作用和背后的原理。一个好的程序不仅要能运行更要明白为什么这么写。4.1 头文件引入与全局对象定义#include Wire.h #include SPI.h #include Adafruit_ADS1015.h #include Adafruit_GFX.h #include Adafruit_SSD1306.h #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, Wire, -1); Adafruit_ADS1115 ads1(0x48); Adafruit_ADS1115 ads2(0x49); float Voltage 0.0;#include引入必要的库。SPI.h在这里虽然引入了但未使用SSD1306也支持SPI模式此处为I2C保持兼容性。#define定义OLED屏幕的宽度和高度像素方便后续引用。Adafruit_SSD1306 display(...)创建一个名为display的OLED对象。参数依次是宽度、高度、通信方式Wire表示I2C、以及复位引脚编号-1表示未使用硬件复位由软件控制。Adafruit_ADS1115 ads1(0x48)创建第一个ADC对象ads1并传入其I2C地址0x48。同理创建ads2地址0x49。这里使用的是ADS1115类对应16位精度。库也提供了ADS1015类12位不要混淆。float Voltage定义一个浮点数变量用于存储计算后的电压值。使用float类型是为了保留小数精度。4.2 Setup()函数硬件初始化void setup() { Wire.begin(16, 17); // 初始化I2C指定SDAGPIO16, SCLGPIO17 Serial.begin(115200); // 初始化串口用于调试输出波特率115200 ads1.begin(); // 初始化第一个ADC模块 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 初始化OLED供电方式为内部开关电容地址0x3C display.display(); // 将缓冲区内容发送到屏幕显示初始会显示Adafruit的LOGO delay(2000); // 保持显示2秒 display.clearDisplay(); // 清空屏幕缓冲区 }Wire.begin(16,17)这是非常关键的一步。它告诉ESP32使用GPIO16和GPIO17作为I2C总线的SDA和SCL线。如果不指定或指定错误ESP32会使用默认引脚导致无法与屏幕和ADC通信。务必与硬件连接对应。Serial.begin(115200)打开串口监视器设置波特率为115200。这是调试的“眼睛”我们可以在电脑上查看ADC原始值和计算出的电压验证程序逻辑。ads1.begin()启动第一个ADC。库函数会通过I2C向地址0x48发送初始化命令配置ADC的默认工作状态如增益、数据速率。示例代码只初始化了ads1因为只用了它的通道0。如果需要使用ads2的通道也需要加上ads2.begin()。display.begin(...)初始化OLED。SSD1306_SWITCHCAPVCC表示使用内部电荷泵产生驱动电压通常为3.3V。0x3C是屏幕的I2C地址。display.display()和delay(2000)上电后屏幕通常会显示库自带的启动画面延时2秒让用户确认屏幕工作正常。display.clearDisplay()清空显示缓冲区为后续绘制新内容做准备。注意clearDisplay()只清缓冲区需要调用display()才能刷新到屏幕。4.3 Loop()函数数据采集、计算与显示这是程序循环执行的核心。void loop() { float adc0; adc0 ads1.readADC_SingleEnded(0);在循环开始定义一个局部浮点变量adc0用于存储从ADC读取的原始计数值。ads1.readADC_SingleEnded(0)调用ADS1X15库的函数从ads1对象地址0x48的通道0对应硬件上的A0输入端子以单端输入模式读取一次ADC转换结果。这个返回值是一个整数范围取决于ADC的位宽16位ADS1115是-32768到32767对于单端正值输入通常是0到正数。Voltage (adc0 * 0.1875) / 1000;这是电压计算的核心公式需要彻底理解。adc0是原始ADC读数。0.1875是ADS1115在默认增益FSR±6.144V下的每计数对应的电压值LSB大小单位是微伏μV。这个值来源于芯片数据手册当增益设置为1时量程为±6.144V其分辨率为 6.144V / 32767 counts ≈ 0.1875 mV/count。注意单位是毫伏mV。因此adc0 * 0.1875得到的是以**毫伏mV**为单位的电压值即ADC引脚上测得的电压。除以1000是将毫伏转换为伏特V。所以Voltage变量此时存储的是ADS1115输入引脚上的实际电压单位是V范围在0~4.096V左右受内部分压电路限制。Serial.print(AIN0: ); Serial.print(adc0); Serial.print(\tVoltage: ); Serial.println(Voltage * 2.5, 3); delay(1000);通过串口打印调试信息。先打印原始ADC值adc0。关键点Serial.println(Voltage * 2.5, 3)。这里将ADC引脚电压Voltage乘以2.5以还原外部输入的真实电压0-10V。参数3表示打印浮点数时保留3位小数。delay(1000)等待1秒控制采样和打印的频率。在工业应用中这个延时可能需要根据实际需求调整或使用非阻塞的定时器来实现精确采样周期。display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(15, 0); display.println(Voltage Value); display.setCursor(45, 15); display.println(Voltage * 2.5); display.display(); delay(1000); display.clearDisplay(); }这部分负责在OLED上显示。setTextSize(1)设置字体大小1是标准大小。setTextColor(WHITE)在OLED单色屏上设置显示颜色为白色点亮像素。setCursor(x, y)设置文本起始位置的坐标像素单位。原点(0,0)在屏幕左上角。println(...)在当前位置打印字符串或数值。同样这里显示的是Voltage * 2.5即真实的外部输入电压。display.display()至关重要所有println、draw等操作只是在内存的缓冲区中绘制。必须调用display.display()才会将整个缓冲区的内容一次性发送到OLED屏幕使其更新显示。delay(1000)和display.clearDisplay()显示保持1秒后清空缓冲区为下一次循环的显示做准备。这种“显示-清屏-再显示”的方式会造成屏幕闪烁。更好的做法是只更新数值变化的区域或者采用双缓冲技术但当前简单应用可以接受。5. 电路连接、校准与功能验证5.1 搭建测试电路为了验证代码我们需要一个0-10V的可变电压源。使用一个电位器如10kΩ是最简单的方法准备元件一个Norvi控制器、一个USB数据线供电兼编程、一个10kΩ多圈电位器、一个0-10V或更高的直流电源如12V适配器、若干杜邦线。连接电路将电源的正极如12V接到电位器的一端。将电源的负极GND接到电位器的另一端同时连接到控制器的GND端子。将电位器的中间滑动抽头连接到控制器的A0模拟输入端子。这样旋转电位器滑动抽头相对于GND的电压就会在0V到电源电压之间变化。注意确保你的电源电压不超过10V否则可能损坏输入电路尽管有分压保护但超出设计范围仍不安全。供电与连接用USB线将控制器连接到电脑为其供电并准备上传程序。5.2 上传代码与串口监视在Arduino IDE中完成代码编写或粘贴示例代码后点击“上传”按钮。上传成功后打开“工具”-“串口监视器”确保右下角波特率设置为115200。旋转电位器你应该能在串口监视器中看到类似以下的输出不断刷新AIN0: 17542 Voltage: 8.223这里的AIN0是原始ADC读数Voltage是计算出的外部真实电压单位V。旋转电位器观察数值是否在0-10V范围内平滑变化。5.3 OLED显示验证同时观察控制器上的OLED屏幕。它应该每秒刷新一次显示“Voltage Value”标题和当前的电压数值。如果屏幕没有显示请检查代码中I2C引脚定义Wire.begin(16,17)是否正确。屏幕初始化地址0x3C是否正确。屏幕本身是否完好连接是否牢固。5.4 测量精度校准与优化示例代码提供了基本功能但要用于实际测量可能需要校准以提高精度。理解误差来源分压电阻误差内部分压电阻R1 R2存在阻值公差如1%这会导致2.5这个换算系数不准确。ADC增益误差与偏移ADS1115本身存在增益误差和零点偏移。参考电压误差ADC的参考电压VDD的微小波动会影响其测量基准。两点校准法 这是提升线性系统精度的有效方法。你需要一个相对精确的电压表作为参考。第一步施加零点信号。将A0输入端短路到GND输入0V。读取此时串口输出的电压值假设为V_read_zero它可能不是0.000而是一个很小的数如0.012V。这就是零点偏移。第二步施加满量程信号。使用一个精确的电压源或用电位器调整并用万用表测量给A0输入一个精确的10.000V电压。读取此时串口输出的电压值假设为V_read_full它可能不是10.000如10.15V。第三步计算校准系数。在代码中将原来的Voltage * 2.5替换为校准公式float calibrated_voltage (Voltage * 2.5 - V_read_zero) * (10.000 / (V_read_full - V_read_zero));这个公式首先减去零点偏移然后根据实际测量范围与理想范围10V的比例进行缩放。第四步更新代码。将计算出的V_read_zero和V_read_full作为常量代入公式并用calibrated_voltage作为最终显示和输出的值。软件滤波 工业现场可能存在噪声导致读数跳动。可以在软件中加入简单的滤波算法如移动平均滤波#define FILTER_SIZE 10 float voltage_buffer[FILTER_SIZE]; int buffer_index 0; float filtered_voltage 0; // 在loop()中采集计算后 voltage_buffer[buffer_index] Voltage * 2.5; // 使用原始或校准后的值 buffer_index (buffer_index 1) % FILTER_SIZE; filtered_voltage 0; for(int i0; iFILTER_SIZE; i) { filtered_voltage voltage_buffer[i]; } filtered_voltage / FILTER_SIZE; // 显示和输出 filtered_voltage这样能有效平滑数据但会引入一定的响应延迟。FILTER_SIZE可根据需要调整。6. 扩展应用与高级功能探讨掌握了基础的单通道测量后这个平台还能做很多事。6.1 多通道巡回检测控制器有6个模拟输入A0-A5。我们可以轻松扩展代码循环读取所有通道。void loop() { for (int ch 0; ch 6; ch) { float adcValue; float inputVoltage; // 判断通道属于哪个ADS1115 if (ch 4) { adcValue ads1.readADC_SingleEnded(ch); // A0-A3 } else { adcValue ads2.readADC_SingleEnded(ch - 4); // A4, A5 对应第二个ADC的通道0,1 } inputVoltage (adcValue * 0.1875) / 1000 * 2.5; // 换算为真实输入电压 // 可以存储到数组或通过串口/网络发送 Serial.print(A); Serial.print(ch); Serial.print(: ); Serial.print(inputVoltage, 3); Serial.print(V\t); } Serial.println(); // 换行 delay(500); // 每500ms扫描一轮所有通道 }在OLED显示上可以采用分页或滚动的方式轮流显示多个通道的电压值。6.2 阈值报警与晶体管输出控制控制器的两个晶体管输出T.0和T.1可以派上用场。我们可以编程实现当A0通道电压超过某个设定阈值如8V时自动打开一个输出例如点亮一个指示灯或启动一个继电器当电压低于另一个阈值如2V时关闭输出或打开另一个输出。#define HIGH_THRESHOLD 8.0 #define LOW_THRESHOLD 2.0 const int transistorPin 26; // T.0 对应的GPIO26 void setup() { // ... 其他初始化 pinMode(transistorPin, OUTPUT); digitalWrite(transistorPin, LOW); // 初始关闭 } void loop() { // ... 读取A0电压计算为realVoltage float realVoltage (adc0 * 0.1875) / 1000 * 2.5; if (realVoltage HIGH_THRESHOLD) { digitalWrite(transistorPin, HIGH); // 电压过高触发动作 // 可以在OLED上显示报警信息 } else if (realVoltage LOW_THRESHOLD) { digitalWrite(transistorPin, LOW); // 电压过低关闭动作 } // ... 显示和延迟 }6.3 数据上传与物联网集成ESP32的Wi-Fi功能让这个本地测量节点轻松变身物联网设备。你可以将测量到的电压数据通过MQTT协议发布到云平台如阿里云IoT、ThingsBoard、Home Assistant或者通过HTTP POST发送到自定义的服务器。#include WiFi.h #include PubSubClient.h // 用于MQTT const char* ssid 你的Wi-Fi; const char* password 你的密码; const char* mqtt_server broker地址; WiFiClient espClient; PubSubClient client(espClient); void setup() { // ... 原有的硬件初始化 WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } client.setServer(mqtt_server, 1883); } void loop() { // ... 读取电压 float realVoltage (adc0 * 0.1875) / 1000 * 2.5; if (!client.connected()) { reconnect(); // 自定义的重连函数 } client.loop(); // 将电压值转换为字符串发布到主题 char voltageString[8]; dtostrf(realVoltage, 1, 3, voltageString); // 转换为保留3位小数的字符串 client.publish(norvi/ae02/voltage/a0, voltageString); delay(5000); // 每5秒上报一次 }这样你就可以在手机或电脑上远程监控现场的电压情况了。6.4 利用数字输入进行联动控制器的8路24V数字输入可以接入开关、接近传感器等。代码可以检测这些输入的状态并与模拟量测量联动。例如只有当某个“启动”按钮接入数字输入被按下时系统才开始记录模拟电压数据或者用数字输入的状态来切换测量通道。7. 常见问题排查与实战心得在实际部署和调试中你可能会遇到以下问题问题现象可能原因排查步骤与解决方案上传代码失败1. 端口选择错误。2. 开发板型号选择错误。3. USB驱动问题。4. 控制器未进入下载模式。1. 检查设备管理器Windows或ls /dev/tty*Mac/Linux确认端口。2. 在Arduino IDE中确认选择的是ESP32系列开发板。3. 安装正确的CP210x或CH340驱动。4. 尝试按住控制器上的“BOOT”或“FLASH”按钮再点击上传待上传开始后松开。OLED屏幕不显示1. I2C引脚定义错误。2. 屏幕地址错误。3. 屏幕损坏或接触不良。4. 库未正确安装或版本冲突。1. 确认代码中Wire.begin(16,17)与硬件匹配。2. 使用I2C扫描程序Arduino IDE示例中有扫描地址确认屏幕地址是否为0x3C。3. 检查排线连接尝试更换屏幕测试。4. 尝试重新安装Adafruit SSD1306和GFX库。串口监视器无数据或乱码1. 波特率不匹配。2. 代码中Serial.begin()波特率与监视器设置不一致。3. 串口被其他软件占用。1. 确保串口监视器右下角波特率设置为代码中定义的115200。2. 检查代码Serial.begin(115200)。3. 关闭可能占用串口的其他软件如其他串口工具、平台IO等。测量电压值不准或跳变1. 信号源噪声大。2. 电源不稳定。3. 未进行校准。4. 分压电阻精度不足。1. 在信号线靠近ADC输入端并联一个0.1uF的瓷片电容到地进行滤波。2. 为控制器提供稳定、干净的电源模拟部分对电源噪声敏感。3. 执行上文所述的“两点校准法”。4. 这是硬件固有误差校准可在软件端大幅修正。读取多个ADC通道时相互干扰1. ADS1115多路复用器切换时的电荷注入效应。2. 通道间存在串扰。1. 在读取通道后增加短暂延时delay(1)让多路复用器稳定。2. 检查布线确保模拟信号线远离数字信号线如GPIO、时钟线。Wi-Fi连接不稳定影响测量ESP32的Wi-Fi射频工作时会产生噪声可能干扰敏感的模拟测量电路。1. 在软件上将ADC采样安排在Wi-Fi通信的间隙进行。2. 在硬件上确保模拟电源和数字电源之间有良好的隔离或滤波。一体化控制器通常已做此考虑。3. 如果对精度要求极高可考虑在测量时暂时关闭Wi-Fi。个人实战心得先调试后集成在编写复杂逻辑如网络上传、多任务之前务必先确保最基本的模拟量读取和显示功能是稳定可靠的。使用串口打印原始ADC值和计算后的电压是验证硬件连接和换算公式是否正确的最快方法。电源是王道工业现场的电源噪声是测量误差的主要来源之一。如果条件允许为模拟测量部分使用独立的线性稳压电源或者至少在控制器电源入口处增加大的电解电容如100uF和小的高频瓷片电容0.1uF进行退耦。理解数据手册ADS1115的性能量程、分辨率、数据速率可以通过库函数进行配置。例如ads1.setGain(GAIN_ONE);设置增益为1±6.144V。如果你的输入信号很小如0-2.5V可以设置更高的增益如GAIN_TWO对应±2.048V来提高分辨率减少量化误差。务必查阅Adafruit库的文档和ADS1115的数据手册。抗干扰布线如果自己外接传感器尽量使用双绞线或屏蔽线传输模拟信号屏蔽层单端接地接控制器端GND。信号线应远离交流电源线、电机驱动线等强干扰源。这个基于Norvi-IIOT-AE02-V和ESP32的0-10V测量方案将一个完整的工业数据采集前端浓缩到了一个手掌大小的设备中。从硬件分压原理、I2C通信、ADC驱动到OLED显示和物联网扩展它涵盖了嵌入式开发中多个核心知识点。通过动手实践和深入调试你不仅能得到一个可用的工具更能透彻理解工业信号采集的完整链条。无论是用于设备监控、实验数据记录还是作为学习嵌入式物联网的标杆项目它都提供了一个极佳的起点。