去年春天,我给某农业基地交付过一套大棚有机蔬菜基地环境温湿度测控系统。动工之前有人跟我说这东西没什么技术含量,某宝买一个现成的温控器回来接上继电器就能用,可真到现场待了两天之后我才发现,事情远没有那么简单。有机蔬菜大棚对温湿度的要求比普通大棚苛刻得多,不是“别冻死、别热死”就行,而是要在一个合适的区间里稳定运行,白天晚上还不一样,不同生长阶段又不一样。这种需求直接决定了传感器选型、控制逻辑、执行机构配置都不太可能照搬通用货。这篇博文我就把整套系统的设计思路、器件选型、硬件电路、软件控制逻辑和现场调试经验都摊开来讲,希望能给准备做类似项目的人一些参考。
1. 项目目标与系统架构拆解
1.1 大棚环境到底复杂在哪
先说这个基地的情况。基地以茄果类蔬菜为主,种了不少番茄和黄瓜,另外有几垄叶菜。这些作物对温湿度其实有比较明确的偏好,不是我们想象中“常温就行”那么随意。番茄坐果期白天需要22到28℃,夜间15到18℃;空气湿度白天最好控制在60%到70%,夜间因为薄膜结露的原因湿度经常冲到90%以上,这就容易诱发灰霉病。黄瓜叶子多、蒸腾量大,湿度要求又不一样,白天75%到85%更合适。所以项目目标不是“把温度控制在25℃”这种一句话需求,而是要按作物种类、生长阶段、昼夜差异分别设定不同的目标区间,并且保持在整个生长周期里不失控。
除了目标复杂,大棚本身的环境扰动也很厉害。太阳一出来,棚内温度可以在半个小时内从15℃冲到40℃;傍晚盖上保温被之后热量慢慢散失,湿度又开始上升。整个过程是非线性的,还伴有滞后——开加热器之后,离热风出口近的地方先热,远处后热。控制器如果反应太快,执行机构会来回折腾;反应太慢,作物已经受了伤害。这也是为什么我坚持不用最简单的“上下限开关控制”直接交付,而是把回滞区间、动作延时、报警判定都在软件里做了细化。
我把需求总结成了一张表,作为整个设计的需求基线:
| 控制对象 | 工作区间 | 控制方式 | 优先级 |
|---|---|---|---|
| 棚内温度 | 白天22~28℃,夜间15~18℃ | 加热器、排风扇、湿帘、卷膜 | 高 |
| 棚内湿度 | 白天60%~80%,夜间不超过90% | 排风扇、喷雾、湿帘 | 中 |
| 极端环境 | 温度>35℃或<5℃、湿度>95% | 高温报警、低温报警、强制动作 | 最高 |
这套需求基线不是拍脑袋定的,是结合作物资料和基地原来种植记录反推出来的。做系统之前,我在大棚里用普通温湿度计人工记录了三天三夜的数据,从这里面看到了真实的温度波动规律,才知道有多大的余量要留。
1.2 通盘架构设计
明确了需求,接下来就是架构。整个系统我分成了四个层次:
- 感知层:温湿度传感器负责采集棚内环境数据。我在大棚东西两个位置各装了一套探头,取平均值参与控制,避免单一探头挂掉或局部温度失真的问题。
- 控制层:一块基于ARM Cortex-M3内核的单片机作为主控,负责读取传感器、运行控制算法、驱动继电器、显示数据、响应按键,同时把数据通过串口发到上位机。
- 执行层:根据控制指令动作的设备,包括热风加热器、侧排风机、湿帘循环水泵、卷膜电机,还有声光报警装置。
- 信息层:一台现场工控机或普通PC记录温湿度历史数据,生成曲线和报表。这部分对有机蔬菜生产很重要,因为认证和追溯都需要环境数据留痕。
分层的好处是职责清晰,哪一层出了问题可以马上定位。感知层坏了,控制层只报警但不误动作;控制层死机了,执行层还保留手动开关可以兜底。我在设计里特意保留了手动/自动切换功能,这一点在后面现场交付时被证明非常关键,种植户半夜发现控制器出问题时能靠手动开关保住一棚作物。
1.3 方案选型时我考虑的几件事
整个系统最核心的决策有三个:用哪种主控、用什么传感器、用什么样的控制策略。
主控方面我没有选择最常见的51单片机,而是用了STM32F103系列。原因很简单:51单片机资源太紧张。系统要求同时驱动I2C显示屏、读取单总线温湿度传感器、扫描按键、跑定时器中断,还要留串口做通信。如果全部塞进一个51里,程序架构会被迫写得非常别扭,升级和排错都很麻烦。STM32F103虽然成本比51贵十几块钱,但换来的是充足的内存、多个定时器、硬件I2C和USART,调试效率高很多。
传感器方面,我在DHT22和SHT30之间权衡过。DHT22便宜、接口简单,但稳定性和一致性一般;SHT30精度好、漂移小,价格略高。考虑到有机蔬菜的生产记录要求,我最终选择在主控板上预留两种接口,实际交付时用了SHT30,因为长期可靠性对这类项目太重要了。
控制策略方面,经典PID在这里其实并不完全适用。大棚环境惯性大、执行机构非线性强,纯PID调不好会抖动。我采用的是阈值控制加回滞加延时保持的组合方案,简单、可靠、种植户也容易理解。后面软件章节我会详细讲这个策略为什么比单纯上下限控制高明。
2. 关键器件选型与核心参数
2.1 温湿度传感器:精度就是生命线
传感器是整个系统的眼睛,选型这件事我不建议省钱。市面上最常见的DHT11湿度精度只有±5%,温度精度±2℃,而且长期放在大棚里受潮后数据漂移很明显。这个精度用来做玩具可以,用来控制有机蔬菜生产环境就太粗糙了——如果传感器显示75%湿度实际已经到85%,就可能造成作物发病,损失远超省下的那几十块传感器钱。
我在项目里最终主用SHT30,参数是:温度精度±0.3℃,湿度精度±2%RH,测量范围温度-40到125℃、湿度0到100%RH,带I2C数字接口。SHT30还有一个很实用的特性,就是内部自带加热功能,可以用来在凝露环境下除湿传感器,避免探头结露之后读数一直卡在99.9%。大棚夜间湿度经常饱和,这个功能对稳定运行帮助很大。
实际部署时,每个采集点我用的传感器模块都是成品封装,探头外面套了一个百叶窗式防护罩。这个罩子不是智商税,它的作用是挡掉太阳辐射和雨水,同时保证空气自然流通。我第一版把传感器直接挂在大棚立柱上,中午太阳晒到的时候温度读数高出实际温度三四度,系统会误开风机,后来加装防护罩才解决。
2.2 主控、显示与交互
主控选择的是STM32F103C8T6,72MHz主频,64KB Flash,20KB RAM,足够装下整个软件栈。这个芯片在工业环境里使用量巨大,参考资料多,出问题也好排查。考虑到大棚里温度高、灰尘大,我选的是工业级型号,工作温度范围宽一些,避免夏天正午控制箱内温度过高导致芯片工作不稳定。
显示部分用了一块0.96寸OLED屏,I2C接口,四根线连到主控。OLED的好处是自发光,大棚里光线变化很大,强光下LCD1602根本看不清,OLED显示对比度高,远一点也能读。屏幕上轮换显示两个采集点的温度湿度、当前时间、设备状态和报警提示信息。按键做了三个:“模式选择”“加”“减”,用来切换手动/自动模式、设定温湿度上下限、查看历史报警记录。
蜂鸣器报警也不能省,但我特意要求不使用那种“嘀嘀嘀”连续响的方式,而是设计成不同故障类别不同响应节奏:温度超限短响三声停一下再响,传感器故障长响不停。晚上值守人员睡觉时听到声音节奏就能判断是什么问题,不用爬起来跑到控制器跟前看屏幕。
2.3 执行机构与保护电路
执行机构包括加热、通风、湿帘、卷膜和报警五类。加热用的是两台风幕式热风炉,每台额定功率3kW;通风用了两个1.1kW轴流风机;湿帘水泵是0.75kW;卷膜电机0.37kW。这些设备的功率都不小,直接驱动肯定不行,我全部通过继电器模块隔离控制。
继电器模块我在测试阶段踩过坑。一开始用了那种裸继电器加三极管驱动的散装小板,结果电机启停瞬间产生的反电动势直接把单片机复位了几次。后来换成带光耦隔离的8路继电器模块,模块内部自带续流二极管,控制板和功率设备之间完全电气隔离,问题才彻底消失。这里强烈建议:凡是控制电机、加热器这类感性负载,一定要用光耦隔离继电器模块,不要为了省几块钱把主控板的稳定性搭进去。
我还给每个执行回路加了手动拨动开关和保险丝。手动拨动开关用于故障时强制开合设备,保险丝用于保护线路和设备本身。控制箱里每路都有指示灯,方便现场判断是哪一路在动作。
2.4 成本与备件清单
这套系统做下来,单套物料成本大约在1400元左右,大头是控制板、传感器和继电器模块,执行机构不算在内。相比市面上动辄几千上万一台的农业物联网控制柜,自己做的主要是时间和人力成本。不过我还准备了备件清单,包括两个SHT30传感器、一块继电器模块、一个备用主控最小系统板、几个保险丝。农业项目最怕就是出故障了没东西换,供应商发货又要等两三天,棚里可等不起。
3. 硬件电路设计与安装保护
3.1 引脚分配与接线
硬件电路我画了原理图,但这里不展开全部细节,只给出一份实际项目的引脚分配表,供参考。使用STM32F103C8T6,接口分配如下:
| 功能 | 引脚 | 接口 | 备注 |
|---|---|---|---|
| SHT30传感器1 | PB8/PB9 | I2C1 | 东侧采集点 |
| SHT30传感器2 | PB10/PB11 | I2C2 | 西侧采集点 |
| OLED显示屏 | PB6/PB7 | I2C1复用 | 轮换显示 |
| 按键模式 | PA0 | GPIO输入 | 按键切换 |
| 按键加 | PA1 | GPIO输入 | 参数增加 |
| 按键减 | PA2 | GPIO输入 | 参数减少 |
| 继电器通道1 | PB0 | GPIO输出 | 加热器A |
| 继电器通道2 | PB1 | GPIO输出 | 加热器B |
| 继电器通道3 | PB2 | GPIO输出 | 排风扇A |
| 继电器通道4 | PB3 | GPIO输出 | 排风扇B |
| 继电器通道5 | PB4 | GPIO输出 | 湿帘水泵 |
| 继电器通道6 | PB5 | GPIO输出 | 卷膜电机 |
| 蜂鸣器 | PA7 | PWM输出 | 分级报警 |
注意一个细节:虽然OLED和SHT30都挂在I2C1总线上,但SHT30是跑在400kHz快速模式下,OLED是跑在100kHz标准模式下,两者共用总线时要把总线速率按低速设备来设置。实际我为了省事,把两个传感器分别放在两个I2C总线上,避免传感器读取过程中的时序竞争。
3.2 电源与地线的处理
这套系统的电源部分是整个项目里最容易出问题的地方,很多人做类似项目失败就失败在这里。我的方案是:220V市电进控制箱后,经一个漏电保护开关,再送到两个独立开关电源,一个是24V/6A给继电器和卷膜电机供电,一个是5V/3A给主控板、传感器、显示屏供电。两组电源的0V不共地,输出到继电器模块的部分用光耦隔离,把功率地和逻辑地彻底分开。
这里面有个非常关键的细节:传感器供电的5V线上,在每个传感器接口旁边都并联了一颗100nF的高频去耦电容和一颗470µF的电解电容。大棚里的电源线经常因为加热器、风机启停产生电压跌落和毛刺,没有这组电容,传感器I2C通讯就可能出错,显示出来的数据会偶尔蹦出一个离谱的值。加了电容之后,我实测读数稳定性明显改善。
控制箱内走线也做了强弱电分离:220V电路全部走箱体左侧线槽,5V/24V信号线走右侧线槽,交叉位置用扎带固定并保持距离。继电器输出到电机的线使用1.5平方毫米三芯护套线,传感器信号线使用屏蔽双绞线,屏蔽层在控制箱一侧单端接地,防止感应电压干扰。
3.3 传感器防护罩与现场定位
传感器安装的位置和防护措施直接决定数据有没有参考价值。我见过太多项目把传感器随意挂在大棚门口,门口一开一股冷风灌进来,传感器直接误报低温。正确做法是:传感器放在大棚中部偏靠里一点,离地面1.5米左右,位于作物冠层上方,不能正对风机出风口,不能正对湿帘,不能暴露在直射阳光下。
防护罩我用了两种:买的成品防辐射罩和自己用PVC管改的百叶窗罩。成品罩效果好,但价格高;PVC管改的罩子通风面积大、成本很低,效果也能接受。要注意的是,不管用什么罩子,都必须保证探头周围空气可以自由流动,不能把传感器完全闷在盒子里,否则测出来的是盒内微气候而不是棚里真实环境。
4. 软件逻辑与核心代码实现
4.1 主流程与任务调度
软件我用的是裸机前后台架构,没有上实时操作系统,因为任务规模不大,前后台足够。后台是一个超级循环,依次执行传感器采集、显示刷新、控制决策、按键处理;前台是定时器中断,用来产生1秒时基和控制周期。整个系统的时间基准由定时器中断里的一个计数变量提供,后台循环只读这个计数,不修改。
核心主循环逻辑如下:
int main(void) { SystemInit(); GPIO_Config(); I2C_Config(); OLED_Init(); SHT30_Init(); TIM_Config(); printf("System Start\r\n"); while (1) { if (timer_flag_1s) { Read_SHT30(&temp1, &humi1, SENSOR1); Read_SHT30(&temp2, &humi2, SENSOR2); temp = (temp1 + temp2) / 2.0; humi = (humi1 + humi2) / 2.0; OLED_ShowData(temp, humi, device_state); UART_SendData(temp, humi, device_state); } if (timer_flag_10s) { Control_Decision(temp, humi); } Key_Scan(); Alarm_Handle(); } }1秒任务负责采集和显示,10秒任务负责控制决策。为什么控制周期要10秒而不是1秒?因为大棚环境变化惯性大,执行机构动作后至少需要几十秒甚至几分钟才能看到明显变化,1秒控制一次只会让继电器在临界点附近反复吸合。10秒的周期足够稳定。
4.2 SHT30读取与数据滤波
SHT30的I2C读取本身不复杂,但要注意它有两种读取模式:轮询模式和时钟拉伸模式。我使用的是轮询模式,即发完测量命令后延时一段时间再读数据。代码如下:
uint8_t SHT30_ReadData(float *temperature, float *humidity, I2C_TypeDef *I2Cx, uint8_t addr) { uint8_t buf[6]; // 发送测量命令 0x2C 0x06,高重复性测量 buf[0] = 0x2C; buf[1] = 0x06; HAL_I2C_Master_Transmit(I2Cx, addr, buf, 2, 100); HAL_Delay(15); // 等待测量完成 // 读取6字节数据:温度MSB LSB CRC,湿度MSB LSB CRC HAL_I2C_Master_Receive(I2Cx, addr, buf, 6, 100); // 校验可省略,但建议实现CRC8 uint16_t raw_temp = (buf[0] << 8) | buf[1]; uint16_t raw_humi = (buf[3] << 8) | buf[4]; *temperature = 45.0f + (175.0f * raw_temp / 65535.0f); *humidity = 100.0f * raw_humi / 65535.0f; }数据滤波方面,我没有直接在代码里做复杂的卡尔曼滤波,而是先做一个简单的中值滤波:每个采集周期连续读三次,取中间值。这个策略在实测中效果很好,能滤掉绝大多数单次偶发的跳变。如果读回来的数值和上次相比变化超过5℃或10%RH,就判定为可疑数据,不写入控制算法,只在显示器上提示“读数异常”。
4.3 阈值加回滞控制策略
接下来是控制策略的核心。纯阈值控制的逻辑是:
- 温度大于28℃就开风机
- 温度小于22℃就关风机
- 温度小于15℃就开加热
- 温度大于18℃就关加热
这个逻辑最大的问题是执行机构会在阈值附近频繁启停。比如加热器把温度从14.9℃加热到18.1℃,关掉;过两分钟温度掉到14.9℃,又开。一个晚上可能开关几百次,继电器和接触器很容易烧毁。
解决办法就是加回滞。回滞的含义是:启动阈值和停止阈值之间留一个差值带,动作方向和之前的状态有关。以加热为例:温度降到15℃以下才启动加热,加热到18℃以上才停止;在这个区间内保持原状态不变。15℃到18℃这3℃的区间就是回滞带,它把频繁启动问题自然消除了。
控制代码如下:
void Control_Decision(float temp, float humi) { // 加热控制,回滞 15℃启动,18℃停止 if (heater_state == OFF && temp < 15.0f) { heater_state = ON; } else if (heater_state == ON && temp > 18.0f) { heater_state = OFF; } // 风机通风控制,回滞 28℃启动,25℃停止 if (fan_state == OFF && temp > 28.0f) { fan_state = ON; } else if (fan_state == ON && temp < 25.0f) { fan_state = OFF; } // 湿帘控制,与风机联动,温度高于32℃才允许启动 if (temp > 32.0f && fan_state == ON) { pad_state = ON; } else if (temp < 28.0f) { pad_state = OFF; } // 湿度控制,夜间高湿优先通风 if (humi > 90.0f && temp > 5.0f) { fan_state = ON; } }这个策略还有一个细节:湿帘不单独动作,必须风机已经开启才允许启动湿帘。因为湿帘是通过蒸发吸热来降温的,如果风机不开,湿帘开着只会让棚内湿度飙升而不降温,反而会给作物带来病害风险。代码里把这个联动关系写死了,种植户不用自己判断。
4.4 数据记录与上报
数据记录这块,我没有在单片机内部存数据,因为单片机的存储空间有限,频繁写Flash会缩短寿命。我的方案是:单片机通过串口以文本行方式发送数据,格式是“时间戳,温度,湿度,设备状态”,上位机软件负责接收、解析、存储。
上位机我用Python写了一个很小的采集程序,使用pyserial读串口,pandas保存CSV文件,matplotlib画实时曲线。这个程序不复杂,但很实用,成本低,种植户可以直接在电脑上看历史曲线。有机蔬菜认证时,把这半年的CSV文件导出来就是现成的环境记录凭证。
Python采集段核心逻辑如下:
import serial import csv import time from datetime import datetime ser = serial.Serial('COM4', 115200, timeout=1) csv_file = open('greenhouse_data.csv', 'a', newline='') writer = csv.writer(csv_file) while True: line = ser.readline().decode('utf-8', errors='ignore').strip() if line: parts = line.split(',') if len(parts) >= 3: temp = float(parts[0]) humi = float(parts[1]) state = int(parts[2]) timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') writer.writerow([timestamp, temp, humi, state]) csv_file.flush() print(f'{timestamp} | 温度:{temp:.1f}℃ | 湿度:{humi:.1f}% | 状态:{state}')上位机如果断线重连,程序会自动续写CSV文件,不会丢数据。深夜大棚断电时,单片机掉电,上位机程序因为检测不到串口数据就一直待机,来电后自动恢复接收,不干扰记录连续性。
5. 现场调试与问题排查实录
5.1 读数跳变:排查三步走
第一个在调试阶段碰到的问题是传感器读数偶尔跳变。现象是温度正常在25℃左右,突然一下跳到38℃,几秒后又跳回正常。一开始我怀疑传感器坏了,换了新的问题依旧。后来按三步排查才找到根因。
第一步查供电。我用示波器看了传感器电源脚,发现在加热器启动瞬间有大约0.8V的跌落。这个电压跌落对5V供电的传感器来说已经接近极限了,可能会导致I2C通讯失败,读回错误数据。我在传感器电源端加了100nF加470µF电容后,电压跌落降到了0.2V以内。
第二步查线路。传感器信号线长度超过3米后,I2C通讯的可靠性就会下降。我把I2C信号线改成了短而粗的双绞屏蔽线,同时把I2C的上拉电阻从常见的4.7kΩ改成了2.2kΩ,提升信号边沿的驱动强度。
第三步是软件容错。即使硬件做了这么多优化,我仍然保留了软件滤波和异常数据剔除逻辑。读数连续多次超出合理范围时才判定为传感器故障,否则只显示但不参与控制。这三步走完之后,读数稳定很多,运行半年没有再出现过跳变。
5.2 继电器一动作系统就重启
这个问题在第一版样机里非常头疼。现象是只要加热器或风机一启动,整个控制板就复位,屏幕闪一下又恢复正常。排查发现是两个原因叠加导致的。
第一个原因是电源容量不够。加热器和风机启动瞬间电流很大,5V开关电源被拉垮,电压跌到单片机复位阈值以下。我把5V电源从3A换成了5A,同时把控制板单独用一路小功率稳压模块供电,问题基本缓解。
第二个原因是感性负载反电动势。电机断电瞬间会产生一个反向高压脉冲,通过共用地线串到单片机侧面。之前我用的是普通继电器模块,没有隔离,后来换成光耦隔离继电器模块才彻底解决。这也是我在前面硬件章节反复强调使用隔离模块的原因。
调试这种问题的时候心态很重要,别一上来就怪单片机不稳定。把负载断开、单独测试逻辑板,确认逻辑板本身没问题,再逐步加上负载,就能很快锁定问题范围。
5.3 加热和通风打架
系统运行一段时间后我发现一个能源浪费的情况:夜间温度15℃加热器启动后,因为棚内密闭,湿度快速上升,湿度超过90%后通风逻辑又把风机打开了。结果就是一边加热一边通风,热量全散出去了,加热器还不停机,电费蹭蹭涨。
这个问题的根源在于湿度和温度的独立控制逻辑之间缺少联动。我调整后的策略是:夜间湿度控制有优先级,但不是无限开风机,而是加入了温度门槛。当温度低于12℃时,即使湿度超标也不强制通风,改为报警提示人工处理,因为低温下通风会冻伤作物,损失更大。当温度在12℃到15℃之间时,风机以间歇方式运行,比如开3分钟停6分钟,兼顾排湿和保温。
这个逻辑经历了一周的现场运行验证,过程中我不断根据实时数据调整参数,最后确定了12℃这个温度门槛。这个值不是所有大棚通用的,北方冬天大棚和南方冬天大棚差别很大,需要根据当地气候现场标定。
5.4 常见问题速查表
根据这半年的现场维护记录,我整理了一份问题速查表,分享给大家:
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 温度读数跳变 | 传感器供电跌落、线路干扰 | 电源端加大电容、换双绞屏蔽线 |
| 湿度一直99.9% | 探头结露、传感器进水 | 开启SHT30内部加热、检查防护罩 |
| 继电器动作频繁 | 回滞带设置太窄 | 扩大回滞区间到3℃以上 |
| 继电器吸合时系统复位 | 电源容量不足、无光耦隔离 | 换大电源、换光耦继电器模块 |
| 加热通风同时运行 | 湿度控制和温度控制逻辑冲突 | 加入温度门槛和间歇通风策略 |
| 电机不动作 | 保险丝断、继电器坏、手动开关未复位 | 逐级查保险丝、手动开关、继电器 |
| 上位机收不到数据 | 串口号变了、波特率不对 | 检查设备管理器串口号、确认115200 |
| 屏幕显示乱码 | 屏幕排线松动、I2C总线被占用 | 重新上电、检查排线、降低I2C速率 |
这张表在我后期维护时帮了大忙,基地的人拿着手册就能处理大部分简单故障,不需要每次出问题都打电话找我。
6. 运行半年的几点个人体会
项目交付之后我跟踪了半年,中间做过三次例行巡检,总体运行还是比较稳定的。要说最让我有感触的,是“传感器安装”这件事远比想象中重要。很多人在设计时把精力都放在单片机和代码上,结果传感器装得不讲究,采集的数据没有代表性,后面所有控制逻辑都是基于错误数据在跑。传感器装好、防护到位,系统就成功了一半。
另外一点是在设计这类农业控制系统时,一定要给用户留手动操作的余地。种植户有自己几十年的经验积累,他们不完全信任自动化设备,这是很正常的事。我提供的控制面板上有手动/自动切换,最开始一个月他们基本都是手动操作,慢慢观察系统判断得准了,才开始切到自动模式。如果你的系统完全不给人干预的机会,那这个系统大概率会在某次误动作之后被永久打入冷宫。
还有个小技巧跟大家分享:继电器控制加热器这类大功率设备时,我给每路控制都加了“最小动作时间”,规定设备一旦开启至少运行3分钟,一旦关闭至少停1分钟。这个机制有效避免了在临界点来回抖动,延长了接触器寿命。如果后续有人想在这个基础上做升级,可以考虑把数据上报从串口改用局域网传输,再去对接手机端查看,农场主在外地也能实时掌握大棚情况。硬件平台和采集逻辑基本不用改动,主要工作在上位机通信这一层。这个行业还有很大的空间,希望大家都能做出真正能在泥土里用得住的东西,而不是只能停留在实验室演示阶段。