一、任务
设计制作一个简易多功能液体容器。该容器为容量不小于 0.5 升、高于 20cm、 带有(或自制)液位标记的透明塑料容器;可以自动测量给定液体的液位、重量 等参数;可判别给定液体的种类(如纯净水、白糖水、盐水、牛奶、白醋等); 可显示测量数据。所有测试项目均要求使用同一启动键启动,并且每次启动只允 许按一次启动键,否则不予测试。
二、要求
1. 基本要求
(1) 能检测液体液位、重量等参数,可显示检测结果。
(2) 分别装载一定量(200~500mL)的不同液体进行测量,要求液位测量绝对误差的绝对值小于等于2mm;重量测量绝对误差的绝对值小于等于1g。
(3) 在(2)的测量基础上,能够区分不同浓度的盐水。要求显示第二次测量液体的名称(根据两次测量盐水的浓度,相对显示是浓盐水或淡盐水)。
2. 发挥部分
(1) 根据液体特征可分辨纯净水、盐水、牛奶、白醋四种液体种类(限定采用电子测量技术,传感器与测量方法不限,可同时采用多种测量方法)。
(2) 根据液体特征可分辨出纯净水和白糖水的种类。(限定采用电子测量技术,传感器与测量方法不限)。
(3) 其他。
三、说明
(1) 溶液的浓度以其质量百分比浓度(以下简称“浓度”)为准,定义为:质量百分比浓度=(溶质质量/溶液质量)×100%
(2) 实验用盐水的浓度取值范围为 0%~30%。
(3) 实验用白醋采用酸度为 9°的市售白醋。
(4) 测量液体重量时应先完成去皮操作。测试中,以待测液体样品的净重作为待测液体样品的实际值:以作品容器自带液位标记的读数作为液位高度实际值。液体参数的实际值与测量值之差为测量绝对误差。
(5) 实验用牛奶采用市售纯牛奶。
(6) 实验用白糖水的浓度取值为 10%,溶质为白砂糖。
(7) 液体特征测试限定采用电子测量技术,采用的传感器和测试方法不限定,容许同时采用多种测量方法。
(8) 作品结构设计应考虑承装液体的容器方便液体更换操作(包括清洗容器、加装液体,移除液体和去除残留液体)。
专家解析:
天津大学 刘开华老师—多功能液体容器(K题)解析与交流
GPT-4o给出的设计方案:
设计并制作一个简易多功能液体容器,容量不少于0.5升,高度20 cm,带自动测量液位标记的透明塑料容器。能够自动测量并展示液体的液位和重量等参数,自动识别给定液体的种类(如纯净水、牛奶等)并显示浓度信息。所有测试项目通过一个启动键启动且保证测试过程中一次只允许启动键起效,避免误操作。
机械结构
传感器系统
控制系统
电源模块
机械结构设计
电路设计
软件编程
装配与调试
针对实现液体识别和测量的关键代码部分,我会详细介绍主要功能,包括如何读取传感器数据、计算液体参数,以及依据电导率判断液体类型等。
使用液位传感器来读取液体的高度,该传感器可以是超声波传感器或者电容式液位传感器,这里以模拟输入为例。
const int levelSensorPin = A0;
float readLiquidLevel() {
int sensorValue = analogRead(levelSensorPin);
考虑到你的要求,这里详细介绍一下该项目中如何通过编写代码实现液体识别和测量。我们将使用Arduino编程语言实现液体的识别和测量功能。
### 系统概述
1. **传感器系统**:
// 将传感器值转换为实际液位,以 cm 为单位
float liquidLevel = sensorValue * (5.0 / 1023.0) * 20.0; // 假设最大20cm
return liquidLevel;
}
使用重量传感器(如HX711模块)来测量液体的重量,这里假设使用模拟输入得到简化的重量值。
const int weightSensorPin = A1;
float readLiquidWeight() {
int sensorValue = analogRead(weightSensorPin);
// 将传感器值转换为实际重量,以 g 为单位
float liquidWeight = sensorValue * (5.0 / 1023.0) * 500.0; // 假设最大500g
return liquidWeight;
}
const int conductivitySensorPin = A2;
float readConductivity() {
int sensorValue = analogRead(conductivitySensorPin);
// 将传感器值转换为电导率值,假设最大300uS/cm
float conductivity = sensorValue * (5.0 / 1023.0) * 300.0;
return conductivity;
}
根据电导率值判断液体的类型,比如纯净水、牛奶、盐水等。
String identifyLiquid(float conductivity) {
if (conductivity < 100) {
return "Water";
} else if (conductivity < 200) {
return "Milk";
} else if (conductivity < 300) {
return "Salt Water";
} else {
return "Unknown";
}
}
将上述功能综合到一个完整流程中,包含读取数据、计算和显示。
#include <LiquidCrystal.h>
// 定义LCD引脚**:
- **微控制器**:例如Arduino,用于控制传感器读取和数据处理。
3. **显示系统**:
- **液晶显示屏(LCD)**:用于显示测量结果。
### 关键代码实现
#### 1. 引脚定义与初始化
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int buttonPin = 7;
void setup() {
pinMode(buttonPin, INPUT);
lcd.begin(16, 2);
lcd.print("Ready");
}
void loop() {
if (digitalRead(buttonPin) == HIGH) {
measureAndDisplay();
}
}
void measureAndDisplay() {
float level = readLiquidLevel();
float weight = readLiquidWeight();
float conductivity = readConductivity();
String liquidType = identifyLiquid(conductivity);
lcd.clear();
首先,定义液位传感器、重量传感器、电导率传感器和按钮的引脚,并初始化LCD。
```cpp
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define levelSensorPin A0
#define weightSensorPin A1
#define conductivitySensorPin lcd.print("Lvl: ");
lcd.print(level, 1);
lcd.print(" cm");
lcd.setCursor(0, 1);
lcd.print("Wgt: ");
lcd.print(weight, 1);
lcd.print(" g");
lcd.setCursor(0, 2);
lcd.print(liquidType);
delay(5000); // 显示5秒钟
lcd.clear();
lcd.print("Ready");
}
float readLiquidLevel() {
int sensorValue = analogRead(levelSensorPin);
float liquidLevel = sensorValue * (5.0 / 1023.0) * 20.0;
return liquidLevel;
}
float readLiquidWeight() {
int sensorValue = analogRead(weightSensorPin);
float liquidWeight = sensorValue * (5.0 / 1023.0) * 500.0;
return liquidWeight;
}
float readConduct A2
#define buttonPin 7
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD地址和尺寸
void setup() {
pinMode(buttonPin, INPUT);
lcd.init();
lcd.backlight();
lcd.print("Ready");
}
该设计中关键代码实现了液位、重量及电导率的测量,并根据电导率识别液体类型并显示相关数据。通过这些代码片段,可以有效进行液体识别和测量,达到项目要求,以上代码均由chat GPT生成仅供参考。
本题考察的知识点
此次设计项目主要考察以下几个关键知识点: