以下方案将演示如何使用 ESP32 搭配 TDS 传感器(以及可选的温度传感器)来测量咖啡溶液的浓度(TDS 值),并给出相对完整的示例代码。此方案可用于制作简易的咖啡浓度仪,实时显示或上传咖啡 TDS 数据,帮助监测萃取效果或保证咖啡品质。
一、整体方案设计
-
硬件组成
- ESP32 开发板(ESP32-WROOM-32 等常见版本)。
- TDS 传感器模块(如常见的 “Gravity: Analog TDS Sensor” 或其它同类模块)。
- 一般包含电极探头和电路板,可将电极插入咖啡液中,通过电导率换算成 TDS 值。
- 模块输出模拟电压(0 ~ 2.0/3.3V),与溶液的电导率成正比。
- 温度传感器(可选):如 DS18B20 或其它温度模块,用于做温度补偿(咖啡温度会影响电导率)。
- 显示设备(可选):如 0.96" OLED 屏,TFT 屏,或仅串口输出/网络传输。
- 电源:若使用 USB 供电,确保 5V 转 3.3V 稳定。TDS 模块通常需 5V 或 3.3V 供电,具体看传感器规格。
-
工作原理
- **TDS(Total Dissolved Solids,总溶解固形物)**主要衡量溶液中溶解离子总浓度。咖啡的 TDS 值能反映萃取浓度,如常见手冲咖啡 TDS 大约在 1.2% ~ 1.5% 左右(换算成 ppm 则约 12000 ~ 15000 ppm,实际上 TDS 传感器多测量低 ppm 区域,所以需要视传感器量程是否合适)。
- 传感器测量电导率,输出一个模拟电压值;再根据校准公式转换为 TDS(ppm)。
- 如果考虑温度补偿:TDS 与温度有关,需要额外读取温度,根据校准公式修正测量结果。
-
系统流程
- 初始化
- 配置 ESP32 的 ADC 引脚,用于读取 TDS 传感器模拟输出。
- 如果使用温度传感器,也初始化温度读数逻辑(如 OneWire + DS18B20)。
- 采样与计算
- 周期性读取 ADC 值。
- 将 ADC 原始值转换为电压值。
- 应用 TDS 传感器官方(或自定义)校准公式,结合温度补偿得到最终 TDS 值。
- 显示/输出
- 在串口打印或屏幕上显示当前 TDS(单位 ppm)。
- 若需要网络上传,可通过 Wi-Fi 连接至服务器或 MQTT 中转。
- 校准
- 建议使用已知 TDS 的标准溶液(或不同浓度的盐水)进行校准,记录对应的 ADC 值和真实 ppm 数据,拟合出校准曲线或使用传感器自带校准电路。
- 实测咖啡 TDS 一般比纯水 TDS 高许多,需要在测试前先确定传感器的量程够不够,必要时需更换适合的电极或调节增益。
- 初始化
-
硬件连接(示例)
- TDS 传感器模块:
Vcc
→ ESP325V
或3.3V
(根据传感器推荐电压)GND
→ ESP32GND
Analog Out
→ ESP32GPIO 36
(ADC_CH0) 等任意一个支持 ADC 的引脚
- 温度传感器(DS18B20)可选:
DQ
→ ESP32 上任意 GPIO(例如 GPIO 4),并通过 4.7k 上拉电阻拉到 3.3VVDD
→ 3.3VGND
→ GND
- TDS 传感器模块:
二、示例代码(Arduino 风格)
以下示例代码默认使用 Arduino IDE 或 PlatformIO 环境编译,ESP32 核心版本 ≥ 2.0.0。
- 仅演示TDS 电压读取与基本公式转换;
- 温度补偿部分示意性写法,如需精确补偿,需要查看 TDS 模块官方资料或结合实际测试数据。
/************************************************************
* 示例:ESP32 + TDS 传感器实现咖啡浓度 (TDS) 测量
* 说明:
* 1. 默认 TDS 模块模拟输出接 ESP32 GPIO 36 (ADC1_CH0)
* 2. 温度传感器 DS18B20 为可选,实现了一个简要读取示例
* 3. 在串口输出当前 TDS(ppm) 和温度
************************************************************/
#include <Arduino.h>
// ========== 可选:DS18B20 温度部分头文件 ==========
#include <OneWire.h>
#include <DallasTemperature.h>
// --------------- 配置部分 ---------------
static const int TDS_PIN = 36; // TDS 模拟输出接 ESP32 GPIO36
static const int ADC_MAX = 4095; // ESP32 ADC 分辨率(12位 = 0~4095)
static const float ADC_REF_VOLTAGE = 3.3; // ESP32 ADC参考电压
// 若 TDS 模块输出最高为 2.0V,需要考虑实际电路。此处按 3.3V 满量程计算
static const float TDS_FACTOR = 680.0; // 传感器转换因子(示例值),需根据实际校准
// 该示例简化: 设 TDS(ppm) = 电压 * 1000 * (校准系数)
// ========== 温度传感器(可选) ==========
static const int ONE_WIRE_PIN = 4; // DS18B20 数据线连接到 GPIO4
OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(115200);
pinMode(TDS_PIN, INPUT);
// 可选:初始化温度传感器
sensors.begin();
Serial.println("ESP32 + TDS sensor test start.");
}
float readTemperature() {
// 读取 DS18B20 温度
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0); // 仅读一个传感器
return tempC;
}
/**
* 简单温度补偿示例:
*
* 原理:溶液温度越高,电导率越高,TDS 会受到影响。
* 一般经验公式: TDS_corrected = TDS_measured / (1 + α*(temp - 25))
* α 通常在 0.02 ~ 0.05 之间(视传感器或溶液), 这里取 0.02 作为示例.
*/
float temperatureCompensation(float tds, float tempC) {
float alpha = 0.02;
float factor = 1.0 + alpha * (tempC - 25.0);
if(factor < 0.1) factor = 0.1; // 防止极端情况
return tds / factor;
}
float readTDS() {
// 1. 读取ADC
int adcValue = analogRead(TDS_PIN);
// 2. 将adcValue 转为电压
float voltage = ((float)adcValue / ADC_MAX) * ADC_REF_VOLTAGE;
// 3. 按照简单的线性关系计算 TDS(ppm)
// 注意: TDS_factor 需根据实际传感器特性或校准结果而定
float tdsVal = voltage * 1000.0 * (TDS_FACTOR / 1000.0);
// 以上仅示例: TDS(ppm) = voltage(V)* 1000 * factor
// 假设 factor = 680 => TDS(ppm) = voltage * 680
// 实际校准公式可与传感器文档或实际测量匹配
return tdsVal;
}
void loop() {
// 1. 读取温度
float tempC = readTemperature();
// 若无温度传感器,可使用固定温度假设
// float tempC = 25.0; // 假设 25°C
// 2. 读取 TDS
float tdsRaw = readTDS();
// 3. 温度补偿
float tdsCompensated = temperatureCompensation(tdsRaw, tempC);
// 串口打印
Serial.print("Temp: ");
Serial.print(tempC);
Serial.print(" C, TDS(Raw): ");
Serial.print(tdsRaw);
Serial.print(" ppm, TDS(Compensated): ");
Serial.print(tdsCompensated);
Serial.println(" ppm");
// 延时1秒
delay(1000);
}
代码说明
- TDS 计算公式
- 此处仅给出示例计算方法,实际需要查看 TDS 模块文档。
- 不同厂商的 TDS 探头、增益和电路设计都有差异,需要配合官方推荐的计算公式或通过标准溶液自行标定。
- 温度补偿
- 在
temperatureCompensation()
函数中使用了一个简单的经验公式。 - 在实际应用中,最好结合更多实测数据对温度补偿进行优化。
- 在
- ADC 输入范围
- ESP32 默认ADC最大输入电压为 3.3V。若 TDS 模块输出电压 >3.3V,需要分压或选择更低满量程的 TDS 模块,以免损坏 ESP32。
- 数据精度
- ESP32 的 ADC 存在一定线性误差,若需高精度,可做多点校准或使用内置参考校准方法。
三、扩展与改进
-
显示/网络
- 使用 OLED/TFT 显示屏实时显示 TDS 和温度值。
- 或者通过 Wi-Fi/MQTT 上传数据到服务器、手机 App 等。
-
多点校准
- 在不同已知 TDS 的标准溶液里测量 ADC,并记录下对应的 ppm 值,用最小二乘等方法拟合校准曲线,提高准确度。
-
机械设计
- 将 TDS 探头固定在合适位置,保证测量时咖啡能够覆盖电极。
- 注意易清洗、防水以及咖啡渍可能造成的传感器污垢问题。
-
长时间在线检测
- 若要放置在咖啡机出口等场景,需要定期清洁探头并注意高温液体对电极寿命的影响。
- 可以增加自动冲洗结构,或实现定时清洗/更换传感器的流程。
-
整合摄像头(若对咖啡颜色感兴趣)
- 在某些情况下,可通过摄像头分析咖啡色度,与 TDS 信息结合,实现更智能的品质评估。
- 但对 TDS 精度需求更高时,建议专门的电化学传感器方案更为稳定。
总结
通过上述方案,使用 ESP32 + TDS 传感器即可实现对咖啡浓度(TDS)的基本检测。示例代码演示了如何读取模拟电压并转换为 ppm,同时示范了一个简易温度补偿逻辑。在实际量产或深入研究时,需要结合硬件特性进行完整的标定和校准,并且可配合显示屏或网络传输功能打造更完善的咖啡浓度检测系统。