# UCAS-China-2022-Meal-replacement-Machine **Repository Path**: seannaes/ucas-china-2022-meal-replacement-machine ## Basic Information - **Project Name**: UCAS-China-2022-Meal-replacement-Machine - **Description**: The source code of NodeMCU and webpage control panel by UCAS-China Hardware for iGEM 2022. - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2022-07-09 - **Last Updated**: 2022-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # iGEM2022 UCAS-China (实验用)代餐机原型说明 v0.3 2022年10月9日 ## 使用方法 ### 连接代餐机 开启代餐机电源,用手机或者电脑搜索WiFi,找到UCAS-China-MRM,连接。输入密码 iloveyou 并点击连接。 打开连上此WiFi的设备上的浏览器,输入对应的IP地址(一般是192.168.4.1),然后回车。会进入控制界面。 ### 控制代餐机 当前版本已经支持多人共同使用。每隔一定时间,用户界面会自动更新最新的代餐机状态。 #### 控制功能部件 控制界面中可以点击按钮,分别将对应的部件开启或关闭。对应部件的状态在下方用ON、OFF表示。ON表示对应部件已经开启,OFF表示当前部件已经关闭。 加热片是根据当前温度和设定温度自动控制的,因此不需要点击。 搅拌器是脉冲控制的,因此开启Stirrer后不会立刻持续转动,而是间歇转动和停止。 #### 控制温度 当前的温度显示在界面上。而当前设定的目标温度在下方用current set temp 表示。 在`send the target temperature` 按钮之前的文本框中输入以摄氏度为单位的数字,然后点击按钮发送到代餐机。 温度数据大约5秒更新一次。以'target'表示设定的目标温度。温度控制的实现方法是:当温度低于target-0.15℃时,开启加热片;当温度高于target+0.15℃时,关闭加热片。加热片是PTC恒温加热片。由于加热片非开即关,温度会在设定目标的一定范围内波动。 #### 为建模组设计的数据记录功能 为了方便建模组记录数据,设定温度的下方还有一个以秒为单位的时间,记录从上一次重新设定温度到现在所经过的时间。大约5秒更新一次数据。 网页具有自动记录数据的功能。 进入页面,`Auto record`默认开启。在界面打开且设备持续连接到代餐机后,网页上会自动记录目标温度、从上一次重设温度到现在的时间、当前温度数据。若不想记录数据,可以取消勾选`Auto record`。建模组同学可以直接复制数据,而不需要手工记录。测试得到的数据会和本项目源代码共同存放在仓库中,建模组同学可以直接下载使用。 点击`clear data`,会清空表格。 ## 源代码文件结构说明 ### 交互式控制网页 data文件夹内为交互的网页,主要功能为显示用户界面,根据用户操作向代餐机发送http请求,并接收代餐机回传的数据;ajax 方式刷新网页数据。 ### 单片机程序 根目录下MRM_MCU.ino为主控代码,定时调用各个功能函数。 #### 总体架构 文件系统为LittleFS。NodeMCU配置为接入点模式。 主函数中,定时读取温度传感器数据,响应用户请求,控制脉冲搅拌过程。 ```C++ void loop() { // read temperature every period if((millis() % TEMP_REFRESH_PERIOD) < (TEMP_REFRESH_PERIOD / 2) && !refreshed) { current_temp = read_temp_signal(); refreshed = true; } else if((millis() % TEMP_REFRESH_PERIOD) > (TEMP_REFRESH_PERIOD / 2)) { refreshed = false; } esp8266_server.handleClient(); // handle the request // motor spin control_spin(); } ``` 而温度控制功能由定时器定时开启 ```C++ // the temperature control task will be invoked every 3 seconds ticker.attach(3,control_temperature); ``` 以上述方式,实现了代餐机各个功能的同步进行。 #### 子功能模块 大致可分为两种子功能函数。 ##### 需要响应用户请求的功能函数 以温度获取功能为例。 在初始化阶段,将函数与用户请求绑定起来。 ```C++ esp8266_server.on("/get_temperature",get_temperature); ``` 具体函数如下,在按照协议构建字符串后,发送给用户。 ```C++ // get the current temperature, target temperature and time as String in the form of "A:B:C" void get_temperature() { String temp_str = String(current_temp); String set_temp_str = String(temp_set); String time_in_sec = String((millis()-starting_time) / 1000); esp8266_server.send(200,"text/plain",temp_str + ":" + set_temp_str + ":" + time_in_sec); } ``` ##### 定时控制功能函数 以温度控制为例。 在初始化阶段设定定时执行或者在loop阶段判断是否到达执行时间,然后按情况执行。 ```C++ ticker.attach(3,control_temperature); ``` ```C++ // automatically control the temperature by setting the heater on or off void control_temperature() { if(current_temp > temp_set + TEMP_BOUND) digitalWrite(PIN_HEAT,LOW); else if (current_temp < temp_set - TEMP_BOUND) digitalWrite(PIN_HEAT,HIGH); } ``` ## 硬件模块连线说明 应该避免使用特殊引脚,引脚之间需要对应。 NodeMCU-12F with ESP8266 ### 继电器和NodeMCU引脚 12V继电器 S1: 加热(D0) 5V继电器 S1: Air pump (D1) S2: Blue light (D2) S3: Stirring (D5) S4: Fluid pump (D6) S5: resv S6: resv Not availible (D3 always high-z, D4 start-up cannot be low) Available: (D7) D4: ds18b20 温度传感器数据引脚