# 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 温度传感器数据引脚