【2024 DigiKey 创意大赛】基于Raspberry Pi 5的植物生长监管系统—1、介绍&搭建环境
本帖最后由 Wenyou 于 2024-8-25 21:15 编辑<p>此次创意大赛我的项目是基于Raspberry Pi 5的植物生长监管系统,其实这个项目并不复杂,想必之前也有不少前辈做过类似的项目。我想做这个是因为前段时间心血来潮想养养盆栽,于是选择了听说比较好养的迷迭香入门,结果没过多久它就变成下面这样了。可能是浇水或光照不足导致的,既然我自己靠人力养不好,我就想做一套可以自动浇水补光的植物监管系统,让我可以享受养好盆栽的感觉,同时因为这套系统是自己做的,所以也会有参与感(大概)。不过就算养盆栽的参与感不强,制作嵌入式项目的参与感肯定会爆棚。可能这就是失之东隅,收之桑榆吧。别的不说,起码能提升自己的编程与实践经验。</p>
<div style="text-align: center;"></div>
<p>本系统计划采用软硬件结合的方式实现,可以进行人机交互,提高种植参与感。</p>
<p>本系统分为三个模块:Web管理模块(Flask、Dash)、数据收集模块(传感器)、植物监管模块(摄像头、电磁阀、补光灯)</p>
<p>首先我来介绍一下此项目需要用到的硬件部分,主要是单片机和各种传感器,还有摄像头、水电磁阀、补光灯等。</p>
<div style="text-align: center;"></div>
<div>树莓派5 4G版本,它将作为此系统的上位机,负责发送指令调度各个模块,协调各模块之间的数据流转,同时它将作为Web管理界面的服务器,实现人机交互。</div>
<div>
<div style="text-align: center;"></div>
<div>ESP32-C6-DevKitC-1 v1.2 作为此系统的下位机,它负责收集数据传输给上位机,同时负责执行上位机下发的指令。</div>
<div>
<div style="text-align: center;"></div>
<div>从左向右依次是:欧姆龙非接触式温度传感器D6T-1A-01、土壤湿度传感器、光照强度传感器、水位传感器,它们负责收集数据。</div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<div style="text-align: left;">从左向右依次是:摄像头、水电磁阀(常闭)、补光灯,它们负责具体的植物监管操作。</div>
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;"></div>
</div>
</div>
</div>
</div>
</div>
<p style="text-align: left;">从左向右依次是:5v电源、4路继电器,它们负责传感器与监管模块硬件的独立供电。</p>
<p style="text-align: left;">接下来是软件部分,Web管理界面将基于Python Flask框架实现,它可以显示各传感器收集到的数据,通过摄像头对植物进行实时监控,打开、关闭水电磁阀或补光灯等操作。同时使用Dash进行图表绘制,显示历史数据以及变化过程,方便进行数据分析。</p>
<p style="text-align: left;">最后进行环境搭建,树莓派采用官方最新的Raspberry pi系统,Esp32采用CircuitPython进行开发。</p>
<p style="text-align: left;">对于像树莓派系统的安装这种流程,网上有非常多详细的教程,我将只进行大概记录,主要记录与此项目相关的部分和解决问题的过程。</p>
<div style="text-align: center;"></div>
<div style="text-align: left;">首先通过官方烧录工具烧录最新系统,这里选择第一个。</div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<div style="text-align: left;">点击NEXT后弹出弹窗,点击编辑设置。</div>
<div style="text-align: center;"></div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
</div>
<p style="text-align: left;">配置账号密码、WiFi、时区并开启SSH。这样烧录成功后树莓派会自动尝试连接WiFi,并且可以通过SSH连接,不需要显示器。</p>
<div style="text-align: center;"></div>
<p style="text-align: left;">烧录会清空SD卡中的数据,注意不要选错卡了。</p>
<div style="text-align: center;"></div>
<div style="text-align: center;"></div>
<p style="text-align: left;">等待烧录成功。</p>
<div style="text-align: center;"></div>
</div>
<p style="text-align: left;">烧录成功后,插卡上电,等待自动连接WiFi。</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
</div>
<p style="text-align: left;">此时即可通过SSH连接到树莓派。</p>
<div style="text-align: center;"></div>
<div style="text-align: left;">我选择FinalShell作为SSH连接工具。</div>
<div style="text-align: left;">
<div style="text-align: center;"></div>
<div>连接成功后说明系统安装已经没有问题,这里我为了操作方便继续安装xrdp以支持远程桌面连接,sudo apt-get install xrdp。</div>
<div>
<div style="text-align: center;"></div>
<div>安装成功后即可通过Windows自带的远程桌面连接工具进行连接。</div>
<div style="text-align: center;"></div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<div style="text-align: left;">至此系统安装完成,下面安装Web管理模块需要用到的Flask和Dash库,先安装pipenv库用于创建虚拟环境方便进行项目管理。</div>
<div style="text-align: left;">
<div style="text-align: center;"></div>
<div>首先创建项目文件夹,然后通过点击上方图标或按ctrl+alt+t打开命令行窗口。</div>
<div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
</div>
</div>
<div>尝试从豆瓣源安装pipenv,发现报错。原来是Python担心直接安装在系统中会破坏系统本身的环境,推荐安装在虚拟环境中。</div>
<div>pipenv就是用来创建虚拟环境的,我这里直接安装在系统中。可以看到报错提示中给出了无视此风险的方法,也就是加上:--break-system-packages</div>
<div>
<div style="text-align: center;"></div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p style="text-align: left;">加上--break-system-packages后看起来安装成功了,但是依然有许多警告,第一张图中的警告意思是从不信任的源中安装,加上--trusted-host 源地址 表示信任。第二张图提示/home/pi/.local/bin不在环境变量中。所以将提示中的/home/pi/.local/bin添加到环境变量中。</p>
<div style="text-align: center;"></div>
<div style="text-align: left;">编辑~/.bashrc,在最后加上export PATH=/home/pi/.local/bin:$PATH。保存退出。
<div style="text-align: center;"></div>
<div>
<p>执行source .bashrc使配置生效。然后卸载pip uninstall pipenv --break-system-packages,</p>
<p>重新安装pip install pipenv -i http://pypi.douban.com/simple --break-system-packages --trusted-host pypi.douban.com。</p>
<div style="text-align: center;"></div>
</div>
<div>
<div style="text-align: center;"></div>
<div>这次安装就不会报错了,最上面的警告是连接失败的警告,说明网络不佳。</div>
<div>编辑时我才注意到,为什么加了-i http://pypi.douban.com/simple 还是从默认的源去下载,怪不得会报连接失败的警告。原来是豆瓣源的地址换了,换成了https://pypi.doubanio.com/simple</div>
<div>网上老教程中的源已经不能用了,我用了那么久的豆瓣源原来是在掩耳盗铃。新源是https,也不用加--trusted-host了,所以应该使用这条命令pip install pipenv -i https://pypi.doubanio.com/simple --break-system-packages。</div>
<div>
<div style="text-align: center;"></div>
<div>安装成功后进入项目文件夹中,使用pipenv shell在本文件夹创建虚拟环境并进入。可以注意到命令行开头出现了括号和文件夹名称表示此时在虚拟环境中。</div>
<div>在虚拟环境中使用pip安装的库都会安装在此虚拟环境中。</div>
<div>
<div style="text-align: center;"></div>
<div>安装flask。</div>
<div>
<div style="text-align: center;"></div>
</div>
<div>安装dash。</div>
<div style="text-align: center;"></div>
<div>编写一个测试页面,名称为app.py。</div>
<div>
<div style="text-align: center;"></div>
<div>在目录下使用flask run运行flask程序,它会默认寻找app.py作为主程序。--host=0.0.0.0表示允许所有ip访问。</div>
<div>
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p style="text-align: left;">在电脑上通过浏览器访问树莓派IP地址的5000端口即可看到刚刚编写的测试页面。</p>
<p style="text-align: left;">至此树莓派环境部分搭建完成,下面开始搭建ESP32-C6的环境。</p>
<p style="text-align: left;">这部分颇费周章,我本来想装CircuitPython,没装成;又装了ESP-IDF,不会用;最后还是选择了Arduino。(编辑时补充:这次烧录CircuitPython成功了,还是选CircuitPython)</p>
<p style="text-align: left;">记录一下踩坑过程吧。</p>
<p style="text-align: left;">先下载bin文件<a href="https://circuitpython.org/board/espressif_esp32c6_devkitc_1_n8/" target="_blank">https://circuitpython.org/board/espressif_esp32c6_devkitc_1_n8/</a>。</p>
<p style="text-align: left;">1、首先尝试通过Thonny安装CircuitPython,选择固件后提示Unkown,似乎不支持esp32c6。</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p style="text-align: left;">点开下拉框,其中也没有ESP32-C6。</p>
</div>
<p style="text-align: left;">2、尝试通过浏览器进行CircuitPython烧录(教程:<a href="https://learn.adafruit.com/circuitpython-with-esp32-quick-start/web-serial-esptool" target="_blank">https://learn.adafruit.com/circuitpython-with-esp32-quick-start/web-serial-esptool</a>)</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p style="text-align: left;">报错,连接失败。</p>
<p style="text-align: left;">3、尝试通过命令行工具ESPTool烧录。(教程:<a href="https://learn.adafruit.com/circuitpython-with-esp32-quick-start/command-line-esptool" target="_blank">https://learn.adafruit.com/circuitpython-with-esp32-quick-start/command-line-esptool</a>)</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
</div>
<p style="text-align: left;">成功读取到了板子的信息。</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
</div>
<p style="text-align: left;">成功擦除闪存信息。</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
</div>
<div style="text-align: left;">烧录成功。</div>
<div style="text-align: left;">这部分内容是我在编辑此贴时跟着教程重新走了一遍,之前尝试时即便烧录成功也无法使用Thonny连接,会报下面的错误。</div>
<div style="text-align: left;">
<div style="text-align: center;"></div>
<p>因此我打算尝试一个新的编辑器Mu,也是教程中推荐的。</p>
<div style="text-align: center;"></div>
<div>在Screen Configuration中搜索mu,勾选后面的install,点击Apply按钮即可开始安装。</div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<div style="text-align: center;"></div>
<div style="text-align: left;">安装成功后会出现在菜单栏中。</div>
<div style="text-align: left;">
<div style="text-align: center;"></div>
<div>结果找不到设备,无法连接。</div>
<div>正当我心灰意冷,以为这次要无功而返时,我打开了Thonny。
<div style="text-align: center;"></div>
<div>Thonny连接成功!</div>
<div>那么是什么原因导致之前尝试烧录CircuitPython无法成功呢?之前是在Windows中烧录,固件版本为9.1.1,这次是使用树莓派烧录,固件版本为9.1.2,esptool版本都为4.7.0。</div>
<div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
</div>
</div>
<div>尝试在Windows上复现一下刚才的操作,先烧录9.1.1版本固件。
<div style="text-align: center;"></div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p style="text-align: left;">尴尬了,直接连接成功。那么我知道问题出在哪里了,上次烧录时我看到教程中关于偏移值的提示,加了偏移值和引导程序(bootloader.bin和partition-table.bin),烧录失败后在修改偏移值和引导程序的路上一去不返了,看来CircuitPython是自带引导的,果然大道至简啊。</p>
<p style="text-align: left;">既然CircuitPython安装成功了,那么剩下的两个方法大概贴下教程地址好了。</p>
<p style="text-align: left;">4、安装ESP-IDF(教程:<a href="https://github.com/espressif/vscode-esp-idf-extension/blob/master/docs/tutorial/install.md" target="_blank">https://github.com/espressif/vscode-esp-idf-extension/blob/master/docs/tutorial/install.md</a>)</p>
<div style="text-align: center;"></div>
<div style="text-align: left;">5、通过Arduino开发(教程:<a href="https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html" target="_blank">https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html</a>)</div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p style="text-align: left;">那么树莓派和ESP32-C6的环境都搭建成功,本帖也告一段落,下次计划分享数据采集过程。感谢大家的观看。</p>
</div>
<p style="text-align: left;"> </p>
</div>
<p> </p>
</div>
<div> </div>
<div> </div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<div style="text-align: left;"> </div>
<p> </p>
</div>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
</div>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p style="text-align: left;"> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<p> </p>
</div>
<div> </div>
<div> </div>
<p> </p>
</div>
<div style="text-align: center;"> </div>
<p> </p>
<p>谢谢分享</p>
页:
[1]