基于树莓派的智能花盆DIY:物联网环境监测与自动灌溉系统
2026/6/2 17:20:01 网站建设 项目流程

1. 项目概述与核心思路

作为一个喜欢在家里摆弄点花花草草,但又经常因为工作忙或者单纯“手残”而把植物养死的“植物杀手”,我一直在寻找一个一劳永逸的解决方案。浇水这件事,说起来简单,做起来却总是过犹不及——要么干得叶子都蔫了,要么浇得根都烂了。直到我开始接触Raspberry Pi和物联网,一个想法逐渐成型:为什么不做一个能自己“思考”什么时候该浇水、浇多少水的智能花盆呢?

这个项目的核心,就是利用Raspberry Pi这个微型电脑作为大脑,搭配土壤湿度、温度、光照等传感器作为它的“眼睛”和“皮肤”,去感知植物的真实需求。当土壤变干时,系统能自动启动水泵补水;当环境温度过低时,能通过Web界面给你发送提醒。整个过程的数据还能通过一个简单的网页仪表盘实时查看,让你即便不在家,也能对植物的状态了如指掌。这不仅仅是一个自动浇水装置,更是一个小型的植物生长环境监测与控制系统,非常适合对嵌入式开发、物联网(IoT)应用或者Python编程感兴趣的爱好者,以及所有想拯救自家绿植的朋友。

2. 硬件选型与电路设计解析

2.1 核心控制器:为什么是Raspberry Pi 4?

在众多微控制器和开发板中,我选择了Raspberry Pi 4 Model B作为本项目的主控。这个选择背后有几个关键的考量。首先,Raspberry Pi运行的是完整的Linux操作系统(如Raspbian/Raspberry Pi OS),这意味着我可以直接使用Python、Node.js等高级语言进行开发,调用丰富的库来处理传感器数据和网络通信,开发效率远高于在Arduino上使用C/C++。其次,Pi 4拥有千兆以太网、双频Wi-Fi和蓝牙5.0,网络连接能力强大且稳定,为搭建本地Web服务器和可能的远程访问打下了坚实基础。最后,其充足的GPIO(通用输入输出)引脚和对I²C、SPI、1-Wire等通信协议的原生支持,使得连接多种传感器和外设变得非常方便。

当然,用Pi做这种“小事”有点“杀鸡用牛刀”的感觉,功耗和成本也比ESP32这类物联网模组高。但它的优势在于“全能”和“易扩展”。未来如果你想增加一个摄像头做植物生长延时摄影,或者接入更复杂的机器学习模型来识别病虫害,Pi都能轻松胜任。对于学习和原型开发阶段,这种灵活性和强大的生态支持是无价的。

注意:Raspberry Pi对电源要求比较苛刻,务必使用官方推荐或质量可靠的5V/3A电源适配器。供电不足会导致Pi运行不稳定、频繁重启,甚至损坏SD卡。

2.2 传感器阵列:环境数据的采集者

一个智能的花盆需要感知多个维度的环境参数,我为此组建了一个小型的传感器网络:

  1. 土壤湿度传感器:这是系统的“味觉”,用于判断是否需要浇水的核心传感器。我选用的是最常见的电阻式土壤湿度传感器。它的原理是通过两个探针测量土壤的导电性,干燥的土壤导电性差(电阻大),湿润的土壤导电性好(电阻小)。Pi的GPIO无法直接读取模拟电阻值,因此这类传感器通常附带一个比较器模块(如LM393),将模拟信号转换为数字信号(干/湿)或通过ADC(模数转换器)芯片输出模拟电压值供Pi读取。

  2. DALLAS DS18B20温度传感器:这是系统的“触觉”,用于监测土壤或环境温度。我选择了DS18B20,原因在于它采用独特的1-Wire总线协议。这意味着只需要一根数据线(加上电源和地线)就可以连接多个传感器,每个传感器有全球唯一的64位ID,Pi通过一根GPIO引脚就能管理挂在同一条总线上的所有温度传感器,极大地节省了GPIO资源,布线也简洁很多。

  3. 光照传感器:这是系统的“视觉”,用于了解植物接收的光照强度。我使用了基于光敏电阻的模块,同样通过LM393比较器或ADC转换为Pi可读的信号。了解光照情况有助于更智能地决策,例如在夜间即使土壤稍干也暂缓浇水,避免低温高湿引发烂根。

2.3 执行器与驱动:系统的“手脚”

感知之后是执行,系统的“手脚”由以下部件构成:

  1. 微型潜水泵:负责抽水灌溉。这种水泵工作电压通常是3-12V直流电。关键点在于,Raspberry Pi的GPIO引脚只能输出3.3V电压和很小的电流(约16mA),绝对不足以直接驱动水泵。强行连接会烧毁Pi的GPIO芯片。

  2. MOSFET(IRF520):为了解决驱动问题,我使用了MOSFET管作为电子开关。GPIO输出一个3.3V的“开”信号给MOSFET的栅极(Gate),这个微弱的信号就能控制MOSFET在漏极(Drain)和源极(Source)之间导通,从而让一条独立的、来自外部电源(如12V电池或适配器)的大电流电路连通,驱动水泵工作。MOSFET在这里起到了隔离和放大的作用,保护了脆弱的Pi。

  3. LED灯带:我额外添加了一组RGB LED灯带,并非为了装饰。它可以作为补光灯,在连续阴雨天为喜光植物补充光照;也可以作为状态指示灯,例如用不同颜色表示系统正常、缺水警告、浇水中等状态。

2.4 电路搭建与供电方案

电路连接遵循“传感器输入,执行器输出”的原则。所有传感器的VCC和GND分别连接到Pi的5V/3.3V和GND引脚,数据线连接到指定的GPIO引脚。特别要注意1-Wire总线上的DS18B20,需要在数据线上加一个4.7kΩ的上拉电阻到3.3V,以保证信号稳定。

水泵和LED灯带这类大功率设备,必须使用独立的外接电源供电(如一个12V 2A的直流电源适配器)。它们的负极(GND)需要与Pi的GND相连,以形成共同的参考地。正极则通过MOSFET控制。具体接线是:外接电源正极 -> 水泵正极 -> 水泵负极 -> MOSFET的漏极(D);MOSFET的源极(S) -> 外接电源负极。MOSFET的栅极(G)通过一个约220Ω的限流电阻连接到Pi的GPIO引脚。LED灯带的控制类似,如果灯带可寻址(如WS2812),则数据线接GPIO;如果是普通灯带,可能需要多个MOSFET来控制RGB通道。

实操心得:在面包板上搭建原型电路时,务必为每个外接电源的负载(水泵、灯带)并联一个续流二极管(如1N4007),正极接MOSFET的漏极,负极接电源正极。这是因为电机、电感类负载在断电瞬间会产生很高的反向电动势,这个二极管可以为其提供泄放回路,保护MOSFET不被击穿。这是很多初学者容易忽略却至关重要的保护措施。

3. 软件系统架构与核心代码实现

3.1 操作系统准备与基础配置

我选择Raspberry Pi OS Lite版本作为基础,它没有图形界面,资源占用更少,更适合作为长期运行的服务器。使用Raspberry Pi Imager工具刷写系统到SD卡是最稳妥的方式。在刷写前,Imager工具允许你预先配置Wi-Fi、开启SSH、设置主机名等,这比刷写后再修改配置文件方便得多。

如果手动配置,关键两步是:第一,在boot分区根目录创建一个名为ssh的空文件(无后缀),以启用SSH服务;第二,修改cmdline.txt文件,在末尾添加ip=192.168.1.200这样的静态IP设置(假设你的路由器网段是192.168.1.x),这样每次启动Pi都会获得固定IP,方便后续用电脑连接。当然,更通用的方法是在路由器后台为Pi的MAC地址分配固定IP(DHCP保留)。

系统首次启动后,通过SSH连接(Windows用户可使用PuTTY或Windows Terminal)。首要任务是运行sudo raspi-config进行基础设置:扩展文件系统以使用整个SD卡、修改密码、设置时区。最重要的是在“Interfacing Options”中,依次开启I2CSPI1-Wire接口。这些是传感器与Pi通信的“桥梁”,必须开启。

接着进行软件包更新和安装基础依赖:

sudo apt update && sudo apt full-upgrade -y sudo apt install python3-pip python3-venv git -y

我强烈建议为项目创建一个独立的Python虚拟环境,避免污染系统级的Python包。

mkdir ~/smart_pot && cd ~/smart_pot python3 -m venv venv source venv/bin/activate

3.2 后端服务:Flask应用与数据逻辑

后端采用Flask框架,它是一个轻量级的Python Web框架,非常适合快速构建这种物联网设备的控制API和简单的Web页面。

首先安装必要的Python包:

pip install flask flask-cors flask-socketio gevent gevent-websocket pip install RPi.GPIO adafruit-circuitpython-dht adafruit-blinka # 对于DS18B20,需要启用1-Wire内核模块并读取文件系统接口

后端核心代码结构如下:

  1. 传感器数据读取模块(sensors.py

    • 土壤湿度:对于模拟传感器,需要使用MCP3008这类ADC芯片,通过SPI接口读取。代码需要将读取的原始值(0-1023)映射到一个易于理解的湿度百分比(0-100%)。这个映射需要校准:将传感器完全干燥时和插入水中的读数作为两个端点。
    import busio import digitalio import board import adafruit_mcp3xxx.mcp3008 as MCP from adafruit_mcp3xxx.analog_in import AnalogIn spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI) cs = digitalio.DigitalInOut(board.D5) # 片选引脚 mcp = MCP.MCP3008(spi, cs) moisture_channel = AnalogIn(mcp, MCP.P0) # 连接至CH0 def read_moisture(): # 假设校准值:空气中读数为650,水中读数为300 air_value = 650 water_value = 300 raw = moisture_channel.value # 将读数反向映射并限制在0-100% moisture_percent = max(0, min(100, (air_value - raw) / (air_value - water_value) * 100)) return moisture_percent
    • DS18B20温度:1-Wire设备在系统中被映射为文件。读取时,需要遍历/sys/bus/w1/devices/目录下以28-开头的文件夹,读取其中的w1_slave文件并解析。
    import os import glob import time base_dir = '/sys/bus/w1/devices/' device_folders = glob.glob(base_dir + '28*') def read_temp_raw(device_file): with open(device_file, 'r') as f: lines = f.readlines() return lines def read_temp(device_index=0): if device_index >= len(device_folders): return None device_file = device_folders[device_index] + '/w1_slave' lines = read_temp_raw(device_file) while lines[0].strip()[-3:] != 'YES': time.sleep(0.2) lines = read_temp_raw(device_file) equals_pos = lines[1].find('t=') if equals_pos != -1: temp_string = lines[1][equals_pos+2:] temp_c = float(temp_string) / 1000.0 return temp_c
  2. 执行器控制模块(actuators.py

    • 使用RPi.GPIO库控制GPIO引脚输出高低电平,进而控制MOSFET的开关。
    import RPi.GPIO as GPIO import time PUMP_PIN = 17 GPIO.setmode(GPIO.BCM) GPIO.setup(PUMP_PIN, GPIO.OUT, initial=GPIO.LOW) def water_plant(duration_seconds=5): """启动水泵浇水""" try: GPIO.output(PUMP_PIN, GPIO.HIGH) time.sleep(duration_seconds) finally: GPIO.output(PUMP_PIN, GPIO.LOW)
  3. Flask主应用与API(app.py

    • 创建Flask应用,定义路由(API端点),将传感器读取和执行器控制功能封装成HTTP接口。
    from flask import Flask, jsonify, render_template, request from flask_socketio import SocketIO, emit from sensors import read_moisture, read_temp from actuators import water_plant import threading import time app = Flask(__name__) socketio = SocketIO(app, cors_allowed_origins="*") # 全局变量存储状态 current_status = {'moisture': 0, 'temperature': 0, 'pump_status': 'off'} @app.route('/') def index(): return render_template('index.html') @app.route('/api/status') def get_status(): current_status['moisture'] = read_moisture() current_status['temperature'] = read_temp() return jsonify(current_status) @app.route('/api/water', methods=['POST']) def water(): duration = request.json.get('duration', 5) water_plant(duration) current_status['pump_status'] = 'on' socketio.emit('pump_update', {'status': 'on'}) time.sleep(duration) current_status['pump_status'] = 'off' socketio.emit('pump_update', {'status': 'off'}) return jsonify({'success': True}) # 后台线程,定时读取传感器并通过WebSocket推送 def background_thread(): while True: socketio.sleep(2) moisture = read_moisture() temp = read_temp() socketio.emit('sensor_update', {'moisture': moisture, 'temperature': temp}) @socketio.on('connect') def handle_connect(): emit('sensor_update', current_status) global thread if not thread.is_alive(): thread = threading.Thread(target=background_thread) thread.start() if __name__ == '__main__': thread = threading.Thread(target=background_thread) thread.start() socketio.run(app, host='0.0.0.0', port=5000, debug=False)

    这里我使用了Flask-SocketIO来实现WebSocket通信。相比传统的HTTP轮询(每隔几秒请求一次数据),WebSocket能在服务器数据更新时主动、实时地推送到网页前端,用户体验更好,也减少了不必要的网络请求。

3.3 前端界面:实时监控仪表盘

前端使用简单的HTML、CSS和JavaScript,配合Chart.js图表库和Socket.IO客户端库,构建一个实时监控页面。

  1. HTML结构(templates/index.html:包含用于显示湿度、温度数值的区域,一个控制浇水按钮,以及一个用于绘制历史数据趋势图的Canvas元素。
  2. JavaScript逻辑(static/js/app.js
    • 使用Socket.IO客户端连接后端服务器。
    • 监听sensor_update事件,实时更新页面上的数值和图表。
    • 监听pump_update事件,更新水泵状态指示。
    • 为浇水按钮绑定点击事件,向/api/water发送POST请求。
    • 使用Chart.js创建一个折线图,将接收到的传感器数据动态添加到图表中,形成历史曲线。

3.4 数据库与自动化逻辑(进阶)

对于简单的阈值控制(如湿度低于30%就浇水),可以直接在后端代码里写一个if判断。但为了更灵活的管理(例如设置不同植物有不同的浇水阈值、记录每次浇水日志),可以引入数据库。

我选择了轻量级的SQLite,它无需单独安装服务器,一个文件就是一个数据库。

pip install flask-sqlalchemy

在Flask应用中定义数据模型和自动化任务:

from flask_sqlalchemy import SQLAlchemy import schedule import time app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///smart_pot.db' db = SQLAlchemy(app) class WateringLog(db.Model): id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.DateTime, default=datetime.utcnow) duration = db.Column(db.Integer) triggered_by = db.Column(db.String(50)) # 'manual' or 'auto' class PlantProfile(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80)) moisture_threshold = db.Column(db.Float) # 浇水阈值 def check_and_water(): moisture = read_moisture() profile = PlantProfile.query.first() if profile and moisture < profile.moisture_threshold: water_plant(3) # 自动浇水3秒 log = WateringLog(duration=3, triggered_by='auto') db.session.add(log) db.session.commit() socketio.emit('notification', {'msg': f'自动浇水已触发,当前湿度{moisture:.1f}%'}) # 在后台线程中运行定时任务检查 def automation_thread(): while True: schedule.run_pending() time.sleep(1) schedule.every(10).minutes.do(check_and_water) # 每10分钟检查一次

4. 机械结构与外壳组装要点

电路和代码是大脑,外壳和结构则是身体的骨架,它需要保护电子部件,并合理布局水管、传感器和花盆。

4.1 材料选择与加工

我使用了MDF板(中密度纤维板)制作主箱体。MDF易于切割、打磨和上漆,成本也低,非常适合DIY项目。你需要准备:

  • 主要板材:用于制作箱体的六个面。
  • 隔板:在箱体内部增加一层,将上部电子仓和下部储水仓/设备仓物理隔离,这是至关重要的安全措施,防止漏水损坏电路。
  • 工具:手锯或电圆锯用于切割,手电钻用于开孔和预钻螺丝孔,螺丝刀,砂纸,以及喷漆(选择防水漆更好)。

加工步骤:

  1. 设计草图:在纸上或使用Fusion 360等软件简单绘制箱体三视图,确定所有面板尺寸、螺丝孔位、穿线孔、传感器安装孔的位置。
  2. 切割板材:根据尺寸仔细切割MDF板。务必佩戴护目镜和口罩。
  3. 预钻孔:在所有需要螺丝连接的地方,用比螺丝直径稍细的钻头预钻孔。这可以防止MDF板在拧螺丝时开裂。
  4. 组装箱体:使用直角夹辅助,将箱体的五个面(底板、两侧板、背板、顶板)用螺丝固定。前盖板可以做成可开启的,用合页连接,方便维护。
  5. 安装隔板:在箱体内部约三分之二高度处,安装隔板,将其牢固固定。
  6. 开孔
    • 在顶板或侧板开孔,用于固定花盆。花盆底部也需要钻一个排水孔,但要用硅胶密封圈和螺母将其与箱体密封连接,使多余的水能流回储水仓。
    • 在隔板上开多个穿线孔,让传感器线缆和水管能从下部设备仓通到上部电子仓。
    • 在箱体侧面开散热孔(如果Pi负载高的话)。
  7. 表面处理:用砂纸打磨所有边角和表面,然后喷涂底漆和面漆。喷漆能有效防止MDF受潮变形。我选择了哑光白色,看起来比较简洁。

4.2 水路与传感器布置

  1. 储水与水泵:在箱体底部放置一个大小合适的塑料容器作为储水箱。微型潜水泵用扎带或胶垫固定在水箱底部,吸水口套上滤网防止杂质吸入。水泵的出水口通过软管连接到上部花盆的灌溉系统。
  2. 灌溉系统:对于单个花盆,最简单的灌溉就是一根软管将水引到土壤表面。如果想更均匀,可以使用滴箭或微喷头。将水管从隔板穿线孔引上,固定在花盆边缘。
  3. 传感器安装
    • 土壤湿度传感器:将其探针部分深深插入花盆的土壤中,尽量靠近植物根部,但避免直接接触根茎。线缆从花盆底部的孔引出。
    • DS18B20温度传感器:可以用热缩管或防水胶做好绝缘,然后埋入土壤中,或者用支架固定在花盆上方测量环境温度。
    • 光照传感器:安装在箱体外部或透过透明窗格,确保能感知真实环境光。
  4. 电子设备安装:将Raspberry Pi、面包板(或焊接好的PCB)、电源模块等,用尼龙柱或螺丝固定在箱体上部的隔板上。所有线缆用扎带整理整齐,通过穿线孔连接到下部的传感器和水泵。

注意事项:所有穿过隔板的线缆孔,最好使用橡胶护线套或打上硅胶密封胶,防止水汽沿缝隙上升。储水箱的水位需要定期观察和补充,可以在箱体侧面开一个透明观察窗,或者设计一个简单的浮子水位传感器连接到Pi进行低水位报警。

5. 系统集成、调试与问题排查

5.1 上电前最后检查

在接通电源前,花十分钟做一次彻底的检查,能避免大部分“冒烟”悲剧:

  1. 电源隔离:确保为水泵/灯带供电的大功率电源与为Pi供电的5V电源是独立的,仅共地
  2. 极性确认:再次确认所有有极性的元件(电解电容、二极管、LED、水泵)正负极连接正确。
  3. 短路检查:用肉眼检查面包板或PCB上是否有焊锡搭桥、裸露线头相碰。可以用万用表的蜂鸣档,在断电情况下,测量5V/3.3V与GND之间是否短路。
  4. GPIO复查:对照接线图,确认每个传感器和执行器连接的GPIO引脚编号与代码中的定义完全一致。RPi.GPIO库有GPIO.BCMGPIO.BOARD两种引脚编号模式,务必统一。

5.2 分模块调试

不要一次性启动所有功能,采用分步调试策略:

  1. 基础系统:只连接Pi电源,通过SSH登录,运行vcgencmd measure_temp查看CPU温度,运行gpio readall(需安装wiringpi包)查看GPIO状态,确认Pi本身工作正常。
  2. 传感器逐一测试
    • DS18B20:运行sudo modprobe w1-gpiosudo modprobe w1-therm加载内核模块。然后cd /sys/bus/w1/devicesls,看是否能列出28-开头的文件夹。进入文件夹cat w1_slave,看是否能读出温度值。
    • 土壤湿度传感器:编写一个简单的Python脚本,循环读取其连接的GPIO(数字式)或ADC通道(模拟式)的值,分别将传感器置于空气和水中,观察数值变化是否合理。
    • 光照传感器:同土壤湿度传感器测试方法,用手电筒照射和遮盖,观察读数变化。
  3. 执行器测试:编写一个测试脚本,单独控制连接水泵的GPIO引脚输出1秒高电平,听水泵是否短促启动。测试时,确保水泵出水口通畅,不要堵转
  4. 网络服务测试:在虚拟环境中运行Flask应用(python app.py)。在电脑浏览器访问http://<你的树莓派IP>:5000,看是否能打开网页。调用/api/status接口,看返回的JSON数据是否正确。

5.3 常见问题与解决方案实录

在实际搭建过程中,我遇到了不少坑,这里记录下最典型的几个:

问题一:土壤湿度传感器读数不稳定或快速腐蚀。

  • 现象:数值跳动大,或者使用几周后传感器探针表面出现绿色锈蚀,读数完全不准。
  • 原因:电阻式传感器通过直流电测量导电性,会导致探针电解,加速腐蚀。
  • 解决方案
    1. 不要一直供电:在代码中,仅在需要读数前才给传感器的VCC引脚供电,读数后立即断电。可以通过一个GPIO引脚连接一个三极管或MOSFET来控制传感器电源。
    2. 使用交流激励(高级):设计一个简单电路,用Pi的PWM产生一个低频方波来驱动传感器,再通过整流滤波读取,但这比较复杂。
    3. 更换传感器类型:考虑使用电容式土壤湿度传感器。它测量土壤的介电常数,不与土壤直接发生电化学反应,寿命更长,精度更高,但价格也稍贵。

问题二:Web页面能打开,但传感器数据不更新或显示为0。

  • 排查步骤
    1. 打开浏览器的开发者工具(F12),切换到“网络”(Network)标签页,查看WebSocket连接状态是否为“101 Switching Protocols”或“200 OK”。如果连接失败,检查后端SocketIO服务是否正常运行,防火墙是否开放了5000端口(sudo ufw allow 5000)。
    2. 查看浏览器控制台(Console)是否有JavaScript错误。
    3. 在Pi上运行sudo lsof -i:5000查看5000端口是否被正确监听。
    4. 检查后端读取传感器的代码是否有异常。可以在SSH中直接运行sensors.py里的读取函数进行测试。

问题三:水泵不工作,但GPIO有输出信号。

  • 排查步骤
    1. 测量电压:用万用表测量MOSFET栅极(G)对地电压,当GPIO输出高电平时,是否接近3.3V。如果远低于此值,可能是限流电阻过大或GPIO引脚损坏。
    2. 测量通路:在GPIO输出高电平时,测量MOSFET漏极(D)和源极(S)之间的电阻,应该接近0欧姆(导通)。如果不导通,检查MOSFET型号是否正确(IRF520是N沟道增强型),接线是否正确(D接负载,S接电源负)。
    3. 检查电源:测量外接电源空载电压是否正常(如12V)。接上水泵后,电压是否大幅跌落?如果跌落严重,说明电源功率不足,需要换用电流更大的适配器。
    4. 听声音/摸震动:将水泵单独接到电池上,看是否工作,排除水泵本身故障。

问题四:系统运行一段时间后,Flask应用无响应或Pi死机。

  • 可能原因及解决
    1. 电源问题:这是最常见的原因。使用万用表测量Pi的5V引脚(如GPIO的2或4脚)在实际运行时的电压,如果低于4.8V,就可能引发各种不稳定。务必更换为足额5V/3A的优质电源。
    2. 散热问题:运行vcgencmd measure_temp查看CPU温度。如果长期高于80°C,需要增加散热片或小风扇。我的做法是在外壳上开对流孔,并在Pi的CPU上贴一个散热片。
    3. SD卡损坏:不正确的关机(直接拔电)极易损坏SD卡文件系统。建议在代码中实现一个安全的关机按钮(通过GPIO触发sudo shutdown -h now),或者购买带有读写指示灯的SD卡,确保不在写入时断电。
    4. 内存泄漏:检查Python代码,尤其是循环和定时任务,是否有未正确释放的资源。可以考虑使用systemd服务来管理Flask应用,并设置看门狗,在应用崩溃时自动重启。

问题五:如何让系统在树莓派开机后自动启动?

  • 解决方案:使用systemd创建后台服务。
    1. 创建服务文件:sudo nano /etc/systemd/system/smartpot.service
    2. 写入以下内容(根据你的实际路径修改):
      [Unit] Description=Smart Flowerpot Flask App After=network.target [Service] User=pi WorkingDirectory=/home/pi/smart_pot Environment="PATH=/home/pi/smart_pot/venv/bin" ExecStart=/home/pi/smart_pot/venv/bin/python /home/pi/smart_pot/app.py Restart=on-failure RestartSec=10s [Install] WantedBy=multi-user.target
    3. 启用并启动服务:
      sudo systemctl daemon-reload sudo systemctl enable smartpot.service sudo systemctl start smartpot.service
    4. 检查状态:sudo systemctl status smartpot.service

完成以上所有步骤,你的智能花盆就应该能够稳定运行了。它不仅能帮你照顾好植物,更是一个充满成就感的、融合了硬件、软件和机械的完整物联网项目。你可以在此基础上继续扩展,比如增加摄像头、接入天气预报API实现智能联动、或者开发手机App进行控制,乐趣无穷。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询