李泽豪
(华南师范大学,广东广州,510006)
当今快节奏的生活方式,使得人们在忙于各类事工作事物时,常常忘记了按时饮用杯中的水来给自己身体补充水分,而当人们想起要饮用时,杯中的水的水温早已不适宜饮用了。在这种背景下,许多保温杯垫应时而生。但是目前的保温杯垫,功能较为单一,不具备手机端APP远程控制功能,还存在着以下的不足:没有定时提醒用户饮水的功能;不具备饮水量监测功能;不能依据个人喜好设定自己的饮水习惯等。而本文设计的智能杯垫,在改进了以上问题的基础上,还加入了物联网功能,使得用户可以在手机端APP查看每日的饮水量和设定补水提醒的时间间隔,大大提升了使用的便捷性和用户的体验感。
基于物联网的智能杯垫由STC15F2系列微控制器和各类传感器及外围电路构成,其构成框图如图1所示。
图1 基于物联网的智能杯垫的构成框图
为了最大化降低生产成本和提高产品落地的可行性,本智能杯垫采用了晶宏STC15F2K60S2系列MCU作为控制器。它的内部集成了RC振荡电路,因此无需外接晶振,有利于减少产品的体积和生产成本。不仅如此,它在集成了38个I/O口、2路UART和2K字节的大容量SRAM的同时,还具有超低价位、超低功耗和高可靠性的特点[1],能够满足智能杯垫的数据采集和控制的要求。
为了监测用户的饮水量,该杯垫使用了精度达24bits的 HX711模数转换模块来采集压力传感器的数据[2]。由于水的密度是不变的,所以可以从水杯重量的变化值,推导出饮水量的多少。具体计算如下:
式中:Vi为第i次饮用后水杯中剩余的水的体积,mi为第i次饮用后水杯和水的总重量,VΔ为本次的饮水量。并为了计算方便,取ρ水=1.0g/cm3。
温度检测功能使用了DS18B20数字温度传感器[3],其测量范围为-55℃~125℃,分辨率达±0.5℃,能够满足水杯温度的精确采集要求,使得控制器能够根据水杯底部的温度值与设定的阈值作对比,完成自动加热保温功能。
为实现高质量地、稳定地与服务器无线通信,该杯垫选用了安可信公司的ESP-01模块。该WiFi模块的传输距离可达400米左右[4],同时它采用AT指令与单片机进行通信[5],通信时只需要1路UART口即可完成,减少了不必要的连接线,有利于集成化设计,减小产品的体积。
为确保能够安全地、较快地加热杯中的水,该杯垫选直径为48 mm、最大功率可达12 W的MCH氧化铝陶瓷加热片。但因为氧化铝陶瓷加热片的温度特性曲线不够平滑,且加热过程中容易受到外界的干扰,存在测量传送的滞后问题,所以该杯垫使用了PID控制的思想对加热过程进行调控,使得陶瓷加热片的功率可随水温的高低而动态调整,防止因为某些因素导致过度加热的情况发生[6]。PID模型的具体参数计算方法如下:将温度传感器作为PID控制系统的闭环反馈回路,求出当前的温度值与设定的温度值之间的偏差,代入PID的计算公式即可求出相应的参数[7]。
本文选择的机智云平台是广州杰升信息科技有限公司开发的一款物联网服务平台,它具有友好的开发环境,能帮助开发者在短时间内完成产品的开发[8]。在机智云开发者中心创建好“智能杯垫”的工程后,需要根据自己的需求创建相关的数据点,以便实现从平台到手机端数据类型和功能的匹配。在本文中,共设定了5个数据点,具体如表1所示。
表1 机智云平台设定的数据点
当设定好数据点后,便可在机智云平台自动生成SCT15F2K60S2系列MCU的Keil C51底层代码,减少产品开发的时间和工作量,降低开发成本。为了使智能杯垫能够被机智云平台唯一识别,需要将机智云平台的产品号(Product Key)和产品密钥(Product Secret)添加到Keil C51工程下的gizwits_product.h头文件中,并在主循环中添加以下的语句,以便实现饮水量数据的上传。
currentDataPoint.valueToday_Water = Water;
//将本地测量的饮水量上传到机智云服务器
完成上述操作后,智能杯垫才能通过WiFi网络接入到机智云服务器中,并将数据点的数据发送到服务器。
在温度测量方面,使用DS18B20进行水杯底部的温度采集时,为了尽可能的减少其他不确定因素对温度数据的影响,采用了多次测量取平均值的方法,即:连续对水杯底部的温度测量3次,然后用3次的平均值作为本次测量的结果,再进行相关处理分析。温度数据处理的代码如下:
在测量饮水量方面,由于是根据水杯的重量变化量来间接获取用户的饮水量大小,因此需要MCU不断扫描压力传感器的重量值,以确保能够及时捕捉到重量发生变化的事件。而当压力传感器读取到一个变化的压力值后,会将上一次测量的重量值减去当前的重量值,以便得到本次变化量的大小。由于饮水后,水杯的重量会减少,因此只有这个变化量为正值时,才能判定为用户进行了一次饮水行为,否则判定为用户往杯中加入了水的行为。当判定为饮水行为后,根据重量的变化量,代入(1)、(2)式中便可求出本次用户的饮水量,并将其记录到机智云服务器,即可实现饮水量的监测功能。若判定为往水杯中加水的行为后,则将本次的重量值更新为下一次重量差值计算的被减数,以便下次监测到用户饮水时能正确求得饮水量。具体的采集流程如图2所示。
图2 温度与饮水量的采集流程图
为实现定时提醒用户饮水功能,本文选用了MCU内部集成定时器0(T0)来完成定时计时功能。当用户在手机端APP设定好提醒间隔并开启定时提醒功能后,将会使能MCU的计时标志位counter_flag,使得计时值在定时器0的作用下从0开始每隔一秒钟便加1。
当计时值与用户设定的提醒时长相等时,将通过杯垫内置的蜂鸣器提醒用户按时饮水,同时也会在手机端APP发出相应的提示,确保用户不会错过任何一次补水提醒。如果在计时途中,计时值未到提醒时长便监测到用户进行了一次饮水行为时,将会自动重置计时值,使计时器能从用户饮水后的时刻开始,重新计时,避免了一个提醒周期内重复提醒用户饮水的情况发生。
恒温功能主要由快速加热控制和PID控制构成。为了使较低的水温能够迅速地达到设定的保温温度值,此处采用了分段控制的思想,即:温度低时不采用PID控制,而是采用快速加热控制使加热片处于最大功率状态。只有当水温高于15℃时,PID控制才会介入,从而改变PWM的占空比使得陶瓷加热片的加热功率随着水温的改变而变化。这样做的好处是,使得对水杯中的水快速加热之外,也能使得水温最终维持在一个固定的值。
当水温高于15℃后,PID控制介入,此时温度传感器采集到的当前温度值将作为PID控制的反馈量,PID控制函数会反复地将其与目标温度值进行比较,每次比较后都会返回一个PID控制量。PID控制量与上次的定时器计数值共同决定本次的PWM占空比,进而实现动态控制陶瓷加热片的加热功率,达到恒温控制的目标。PID算法的部分代码如下所示:
主程序包含以下几个部分,首先是对内部资源(定时器T0和T1)、外部设备(按键、DS18B20温度传感器、HX711模数转换模块等)进行初始化,然后才开始执行主循环中的各个子函数。其中主循环中的按键扫描用于识别智能杯垫上的各个按键状态,机智云数据点的传输函数负责MCU与服务器之间的数据点交互,定时饮水提醒函数则会按照设定的饮水提醒间隔自动提醒用户饮水,恒温控制函数现实PID恒温控制。
每执行一次主循环,就会采集一次温度数据和压力传感器的数据,避免遗漏任何一次数据的变化。采集完后,再根据温度和饮水量的相关计算方法,对采集到的数据进行处理分析。主程序的具体流程如图3所示。
图3 主程序流程图
为了检验所设计的智能杯垫能否按照设想的功能正常执行,评估智能杯垫恒温控制和饮水量监测功能的误差大小,以方便后期对智能杯垫加以优化与改进,本文对智能杯垫的各个功能分别作了测试。测试时的环境温度为17℃,水杯中的水温为20℃,具体测试方法与结果如下:
打开手机端的机智云APP并绑定该智能杯垫,然后在手机上观察“今日的饮水量”,同时调节各个参数的值,观察智能杯垫能否正确按照所设定的参数值给予相应的反馈。由图4可以看到,智能杯垫能按照各个参数值,正确执行相应的功能。
图4 手机端APP实测图
在玻璃杯中加入100mL、20℃的温水,打开恒温功能,并设定恒温温度为30℃。等待10分钟,再用温度计测量杯中的水温,测得水温在29°附近。虽然有些许偏差,但是总体上实现了PID恒温控制功能,误差在用户能够接受的范围内。
设定定时提醒的时间间隔为30分钟。当放下水杯后,用秒表开始计时,静待杯垫的蜂鸣器报警提醒。经过多次测试,杯垫均能在30分钟后,精确地发出提醒信号,定时饮水提醒功能可达到预期的设想。
将盛有500mL水的水杯放置在智能杯垫上,每次倒去100mL的水再放回杯垫上,观察并记录杯垫测量的饮水量大小,测试结果如表2所示。从表中可以看到,该智能杯垫能够较好地测量饮水量,虽然存在一定的误差,但误差均比较小,不影响用户的体验。
表2 饮水量监测结果
本文设计的基于机智云物联网平台的智能杯垫,通过温度传感器来获取水温并作为PID控制的反馈参数,达到恒温功能;通过HX711采集压力传感器的重量变化,实现饮水量监测功能;通过机智云物联网平台的接入,实现了手机端APP控制和定时补水提醒功能。以上功能的增加,既解决了现有的加热保温杯垫存在的不足,又提升了产品的智能程度和使用的便捷性。此外,该智能杯垫还兼具生产成本低,制造简单,可靠性高的特点,使得它具有较好的市场前景。若后期对手机端APP的界面加以优化,令整体界面更加整洁高效,同时改进饮水量测量算法和PID控制算法,还能进一步提高产品的竞争力。