
2.2 模块介绍
本项目主要包括饮水机智能出水模块、预约制冷、加热模块和手机APP模块。下面分别给出各模块的功能介绍及相关代码。
2.2.1 饮水机智能出水模块
本部分内容包括智能出水模块的功能介绍及相关代码。
1. 功能介绍
本部分的主要功能是检测杯子是否正确放置、测量杯高、装入适量的水(大约为杯子高度的80%),另外,通过蓝牙接收手机APP的指令,从而装入使用者的需求水量,电路如图2-5所示。

图2-5 水杯检测模块
杯高测量部分由超声波传感器HC-SR04、直流电机和丝杆套装组成,当感应到水杯后,程序控制直流电机转动,转轴带动丝杆转动,从而带动固定于丝杆平台上的超声波传感器垂直向上移动,一旦检测到与杯子的距离大于10cm,就代表着超声波模块刚好与杯子上沿水平。因为超声波模块的初始位置与杯底的垂直高度差一定,所以可以得到:
杯高=初始垂直高度差+超声波模块垂直移动高度垂直移动高度=超声波模块移动速度*移动时间
当完成杯子高度的测量后,直流电机反转相同的时间使超声波模块复位,杯高测量部分如图2-6所示。

图2-6 杯高测量部分
出水部分选用了HC-SR04超声波模块,将其固定于支架顶部用来测量水面高度,小型水泵用于抽水。在出水之前会检查串口是否收到指定水量的指令,若未收到,则最终水面高度为杯子高度的80%;若收到,则根据指令(数据为float类型,含义为杯容量的几分之几)改为指定高度。因为超声波模块到杯子底部的垂直距离一定,所以可以得到:
实时的水面高度=超声波模块到杯底的垂直高度-超声波模块到水面的距离
一旦水面高度到达指定水量对应的水位,就停止出水。至此一次出水过程完成,水面测量部分如图2-7所示。

图2-7 水面测量部分
2. 相关代码





2.2.2 预约制冷、加热模块
本部分内容包括预约制冷、加热模块的功能介绍及相关代码。
1. 功能介绍
本模块主要实现实时上传水温、预约制冷加热功能。每一秒上传一次温度到手机APP,然后实时检测串口是否接收到预约制冷或者加热的指令(指令内容为一段时间,单位为秒(s),表示从此时算起,经过该时间长度后开始加热或者制冷)。制冷指令表示为char类型‘C’,加热指令为char类型‘H’。读取到指令中延迟时间的数值,经过该时间后点亮相应的LED(制冷为红灯,加热为绿灯),表示进入加热或者制冷状态,当达到要求的温度后,相应的LED熄灭,表示加热或者制冷完成。元件包括HC-05温度模块、DS18B20温度测量模块、Arduino开发板和导线若干,电路如图2-8所示。

图2-8 预约制冷加热部分连线图
2. 相关代码



2.2.3 手机APP模块
本部分内容包括手机APP模块的功能介绍、开发方式及相关代码。
1. 功能介绍
手机APP的主要功能是实时显示水温和发送预约制冷、加热的指令,数据传输由蓝牙完成,操作界面如图2-9所示。启动APP后,点击配对蓝牙,调出手机蓝牙配对界面,选择要配对的蓝牙设备。点击已配对蓝牙列表,选择要连接的蓝牙设备。此时,标签文本会显示为实时的水温。点击预约制冷按钮后,会发送一段字符:‘C’+输入框字符(输入框规定字符为正整数,含义为时间,单位为秒(s)),点击预约加热按钮后;会发送一段字符:‘H’+输入框字符(输入框规定字符为正整数,含义为时间,单位为秒(s));点击取水量按钮,会发送一段字符:‘Q’+输入框字符(输入框规定字符为0~1的小数,含义为杯高的倍数)。

图2-9 手机APP操作界面图
2. 开发方式
APP Inventor组件设计界面如图2-10所示,左侧是各种组件,中间为APP操作界面。首先要创建一个项目,可以有多个屏幕。设计外观和功能时,只需把组件拖到该区域。左侧区域是本项目所用到的各种组件,单击组件可以进行参数设置,例如外观、背景等。

图2-10 APP Inventor组件设计界面
APP Inventor逻辑设计界面如图2-11所示,左侧是封装好可以调用的各种逻辑块,以积木的形式设计。每个组件有十几甚至几十种逻辑块可调用。本项目采用了蓝牙块,命名为蓝牙客户端1,蓝牙客户端可调用逻辑块表(原本共有几十个)如图2-12所示。在进行逻辑设计时,需要把各组件以正确的逻辑拼接在一起完成程序,最后打包成apk在手机上下载使用,完整项目逻辑设计如图2-13所示。

图2-11 APP Inventor逻辑设计界面

图2-12 蓝牙客户端可调用逻辑块

图2-13 项目整体逻辑设计图
3. 相关代码








