电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
开源高精度亚硝酸盐、磷酸盐检测仪——方案成本低得超出你想象
分 享
扫描二维码分享
开源高精度亚硝酸盐、磷酸盐检测仪——方案成本低得超出你想象
水质
光度计
开源
xukejing
关注
发布时间: 2022-06-23
丨
阅读: 15039
大家好,我是大家的老朋友[xukejing](https://www.icxbk.com/expert/detail/25.html),传说中的芯吧客社区金牌达人,芯吧客社区首席开发板评测师(自封的),两年前那个个[“懒人鱼缸”](https://www.icxbk.com/article/detail/1228.html)的作者。最近有小伙伴咨询我鱼缸水混的问题,发现很多都是水体营养盐超标导致的,比如亚硝酸盐超标导致鱼类中毒,磷酸盐超标导致水体爆发蓝藻。有热心网友已经做了[N合一试纸评测](https://www.bilibili.com/video/BV1UY4y1g7Mi?spm_id_from=333.999.0.0&vd_source=159fa7f22a58ef3034d9292af61ad20f),发现水族试纸的亚硝酸盐最小检测数值为1mg/L,比鱼类安全限度的0.05mg/L高了20倍,等这试纸有颜色,鱼儿早就死了。所以,今天我们先来聊聊怎么精确测量水中的亚硝酸盐浓度。 ## 1 项目背景 ### 1.1 计量单位的约定 在淡水里,由于一升水接近1kg,因此mg/L与ppm是个近似等效的单位。但是当测量含盐水体,比如海水(比重1.020~1.026)时,与纯水具有2%以上的偏差,mg/L和ppm就不能等效了。又因为亚硝酸盐浓度的mg/L可以以氮计,也可以以亚硝酸跟离子计,更或者以亚硝酸钠来计,由于以上元素和化合物的摩尔质量不同,导致即使是以mg/L,同一个样本在不同的标准体系下会有不同的值。还好化学领域里还是有个更通用的定量单位的,叫mol/L(摩尔每升),比如亚硝酸钠浓度为1mol/L的溶液,不管以亚硝酸钠计、以亚硝酸根计,还是以氮计,都是1mol/L,这样便实现了数值的统一。本项目如果没有特别说明,将尽量用摩尔为单位剂量,如摩尔、毫摩尔、微摩尔。 ### 1.2 低浓度测量的难点 鱼类安全限度0.05mg/L的亚硝酸盐,如果以氮计,其浓度约为3.57umol/L。更低的浓度,比如0.01mg/L,就低至零点几umol/L。大家注意我这里用的单位,是umol/L,1000000umol等于1mol,中间有6个0,可见umol是个多小的量。按照海水化学要素调查的国标规范GB/T 12763.4-2007,亚硝酸盐检测使用磺胺和盐酸萘乙二胺的亚硝酸重氮偶合显色反应,磷酸盐检测使用酒石酸锑钾、钼酸铵和维生素C的磷酸盐磷钼蓝显色反应,对应的营养盐浓度越高,显色反应后的颜色越深。然而,对于几umol/L或零点几umol/L显色反应后的溶液,看上去都是透明的,人眼是很难辨认颜色读数,于是需要特别的仪器来测量具体的吸光度或透光度。国标规范里推荐的就是光度计方法,具有仲裁级别的精度。 ### 1.3 光度计市场分析 目前市面上已有国内外各个厂商的各种基于光度计测定方法的商品化仪器,各国的仪器的性能指标均比较相似。根据所检测目标物及数量,这些仪器的价格大多在1000~3000元之间,比如哈希的实验室级分光光度计。某些超小型的低精度仪器价格稍低,比如意大利哈纳蛋机,但也要近600元。 有小伙伴表示太坑爹了,600块钱都能换个联发科处理器的国产手机了,那个哈纳蛋一看就那种没什么科技含量,外壳是9块包邮般的塑料质感,屏幕是改革开放初期风格的廉价黑白小液晶,且无Type-C锂电充电接口,电子元件仿佛上个世纪洋垃圾,定价600块简直是抢钱。 ![img](https://cf04.ickimg.com/bbsimages/202003/704a730230e1e83dddd52d646cde075c.jpg) ### 1.4 本项目目标 其实,我这恬不知耻的吹牛大王,除了会吹牛,也是个隐藏的高级玩家。既然市面上的产品溢价那么高,那我们不妨自己DIY一个。既然你看不惯这个市场,那你就改造它啊,用最新的技术大幅度缩减成本,把光度计的价格定位拉下神坛,记得三联么么哒。 意大利哈纳蛋机600元一台是吧,看我不给它做出来,测量功能比它多一个,小数点后几位解析度和传感器方案还比它领先30年。让国际友人看看我们制造大国有多内卷,又要马儿跑得快,又要马儿少吃草,硬件方案超过100块钱算我输。我们王者遇到挑战的时候,一贯的风格都是像压路机一样直接碾压过去的。本宝宝决定接受这个挑战! ![img](https://cf04.ickimg.com/bbsimages/202003/fae632710a26e01b95842b641b217a2b.jpg) ## 2 项目简介 本项目开发了ESP32/Arduino兼容的开源高精度水质测试仪器,基于国标光度计原理,可精确测量0.1微摩尔每升以下的浓度。仪器能够执行涉及磺胺和盐酸萘乙二胺的亚硝酸重氮偶合显色反应,用于测试水中的亚硝酸盐;能够执行涉及酒石酸锑钾、钼酸铵和维生素C的磷酸盐磷钼蓝显色反应。目前,亚硝酸重氮偶合显色反应的吸光度曲线已校准,检测代码在gitte上公开;磷钼蓝反应曲线还未校准,但磷酸盐传感模块数据实时上传Matlab的代码已编写,磷酸盐检测校准曲线会在未来完善。项目涉及的用于3D打印的CAD文件在Thingiverse上公开。 ### 2.1 物料清单(总采购成本小于55元) 硬件方案对成本做了优化。单台检测仪造价的物料采购成本小于55元。如果工程批量采购,预计能低至50元以内。具体物料如下: 电子设备方面,GY-2561模块11元,微雪TSL25911模块19元,ESP32开发板15元,1颗绿光520nm 3mm LED和1颗红外850nm 3mmLED忽略不计,2个250欧电阻忽略不计,杜邦线若干忽略不计;结构方面,外壳及传感器支架全部使用3D打印,材料用量约58克,按50元每公斤计,约3元;标准件方面,两个10mm玻璃比色皿5元,M3x4x3 注塑预埋螺母4颗忽略不计,M3x8螺丝4颗忽略不计。 更多改进建议:如果抠门不追求最低成本,作者强烈建议使用540nm的LED代替520nm LED,测量亚硝酸盐时可以获得更高的灵敏度;用880nm LED代替850nm LED,测量磷酸盐时可以获得更高灵敏度。非标准波长的LED的采购成本略高,但也不超过1杯可乐。 ### 2.2 电子硬件方案介绍 #### 2.2.1 GY-2561模块 采用TSL2561,可测量红外光及人类可见光 16位ADC输出,积分时间可调(本项目使用403ms积分时间),放大倍数可调(本项目使用16X) 动态范围0.1-40000Lux 内置红外光敏二极管,即使在红外噪声干扰大的环境中也能较精确的测量 ![GY2561](https://cf04.ickimg.com/bbsimages/202206/b1a7b3508900494dc69aebc51ec56027.jpg) #### 2.2.2 微雪TSL25911模块 采用TSL25911FN,可测量红外光及人类可见光 (最高量程80000Lux) 16位ADC输出,积分时间可调(本项目使用600ms积分时间),放大倍数可调(本项目使用25X) 灵敏度高达188uLux,动态范围宽达600M:1 内置红外光敏二极管,即使在红外噪声干扰大的环境中也能较精确的测量 ![Light-Sensor](https://www.waveshare.net/w/upload/thumb/1/1e/TSL25911-Light-Sensor-1.jpg/360px-TSL25911-Light-Sensor-1.jpg) #### 2.2.3 ESP32开发板 本项目使用的ESP32开发板型号为WEMOS LOLIN32 Lite,32位双核240MHz,4MB Flash 支持锂电池充放电(本项目为了最小化成本,把10块钱锂电池去掉了,但功能保留可随时加上) 支持WIFI和蓝牙(本项目使用WIFI UDP与Matlab交互) 两个255级DAC(本项目两个LED光源的输出功率可调) 两个I2C接口(本项目只使用一个I2C接口,把两个传感器并在同一个I2C接口上) ![WEMOS LOLIN32 Lite](https://cdn.shopify.com/s/files/1/1595/0669/products/lolin32_lite_v1.0.0_2_16x9_c9f0fa5b-e37a-421f-b047-6a8308b8cbd0_1024x1024.jpg?v=1512107584) ### 2.3 需要3D打印的零件包括: 1)外壳上半部分。用于固定ESP32开发板和两个比色皿架。 2)外壳下半部分。 3)比色皿架(型号A),用于10mm比色皿。一端固定520nm 3mm LED,另一端固定GY-2561光传感器模块。 4)比色皿架(型号B),用于10mm比色皿。一端固定850nm 3mm LED,另一端固定微雪TSL25911光传感器模块。 5)遮光保护罩,用于遮挡环境光(实测比色皿架的光路设计很合理,已经规避大部分环境光干扰,电脑屏幕照亮的夜晚可以不加遮光罩) ![](https://cf04.ickimg.com/bbsimages/202206/4580f72cc6a229e18b40e0795fce02f0.png) 全部一起打印需要一个半小时以上,为了避免尺寸出错而做无用功,建议先打印比色皿架,校准3D打印机尺寸缩放系数。10mm比色皿的外轮廓为12.5mmx12.5mm,模型已预留0.5mm余量。 技术细节参考国标规范:GB/T 12763.4-2007 本项目的3D打印零件开源地址:[Thing files for Open-Source Photometer for Nitrite-Nitrogen Testing by xukejing - Thingiverse](https://www.thingiverse.com/thing:5417172/files) ![](https://cf04.ickimg.com/bbsimages/202206/39439edc530d1835ac4f1cb6b7dc8dd1.png) ### 2.4 原理图 原理图 ![](https://cf04.ickimg.com/bbsimages/202206/9ad4728c3d8f46cbcd1e04522cd3406d.png) ### 2.5硬件组装 两个比色皿架预需要先粘上LED和光传感器模块(520nm绿LED对应GY-2561光传感器模块,850nm红外LED对应微雪TSL25911光传感器模块),根据原理图接上线路,再把ESP32开发板和两个比色皿架粘接到外壳上半部分(使用热熔胶) ![](https://cf04.ickimg.com/bbsimages/202206/847e68755efbe5c24a0b515e7fb43f13.jpg) 趁热熔胶还未完全凝固,把比色皿放入外壳上半部分,确认比色皿架的孔位与外壳对齐 ![](https://cf04.ickimg.com/bbsimages/202206/10b5e8b6288e0f236a3f14bcc8f01685.jpg) 外壳下半部分嵌上4颗M3x4x3 注塑预埋螺母,其中螺母需要使用电烙铁一边加热一边推入,建议电烙铁温度300摄氏度。 ![](https://cf04.ickimg.com/bbsimages/202206/ed13a863e2653d7b9e52cf9cd8639954.jpg) 盖上上盖板,拧上4颗M3x8螺丝 ![](https://cf04.ickimg.com/bbsimages/202206/4f19dc9f5ce9916dce1c16f1d3683a3c.jpg) 比色皿内放入待测液体,下图为4umol/L亚硝酸钠标准溶液显色反应后的产物,粉红色透明 ![](https://cf04.ickimg.com/bbsimages/202206/1bc9e56f5111f479398d3f4d2792e886.png) 比色皿放入传感器对应的520nm波长的比色皿架(520nm是绿光) ![](https://cf04.ickimg.com/bbsimages/202206/707dc32cab1c441b53d913eabb533959.png) 盖上遮光保护盖,可以测量了。 ![](https://cf04.ickimg.com/bbsimages/202206/94c6e5f954b21c0799555d40b372e779.jpg) ## 3 软件开源 ### 3.1 仪器固件代码和上位机代码开源 Arduino与ESP32的开发环境搭建参考:[arduino-esp32开发环境搭建](https://gitee.com/EspressifSystems/arduino-esp32) 本项目软件代码在gitee上的开源地址:[ 开源高精度水质测试仪器 ](https://gitee.com/xukejing/open-source-photometer-for-nitrite-nitrogen-and-phosphate-phosphorus-testing) Arduino的库文件需要从gitee上安装后放到文档Arduino的libraries目录里。为了提高对ESP32的兼容性,我对TSL2561的库做了适当的修改,在函数变量里增加了Wire地址指针的输入,方便ESP32设置不同的I2C端口。一方面是为了方便分享,一方面因为GPL协议,因此我对函数库的修改部分也开源了。 ![](https://cf04.ickimg.com/bbsimages/202206/a1b6fe49a7071a1acaa5ec325ce33311.png) 注意photometer_esp32.ino文件,需要把以下信息填入,分别为无线路由名、无线路由密码、仪器IP、上位机IP等。其中仪器IP需要与上位机IP在同网段。建议先登录无线路由后台,查看路由器局域网网关、掩网、DNS、上位机IP后,选一个还未占用的IP作为仪器IP。 ![](https://cf04.ickimg.com/bbsimages/202206/a370eadb55f29a9280b2917c8e8b72c7.jpg) matlab代码部分见gitee分享里的matlab目录,其中udp_callback.m是回调函数,上位机接收到仪器发来的数据时候就会回调。实际使用时只需要修改udptest.m里的仪器IP便可,点击运行便开始采集。数据变量在Cj1、Cj2、Cj3和Cj4,分别对应两个传感器共4个通道。 ![](https://cf04.ickimg.com/bbsimages/202206/fe7ac96fafd1e24b7b63668300e18cf4.png) 数据采集后,你可以用matlab的各种现成的函数做处理了,比如mean求平均、filterDesigner设计滤波器、polyfit做曲线拟合。小伙伴们看到Matlab不要慌,真正的程序员,应该像武器大师一样灵活使用各种工具,千万不要因为拘泥于某个特定工具而束缚了思维。 ![](https://cf04.ickimg.com/bbsimages/202206/fa609ee1c60fc9ef52194cae1c6f94f3.jpg) ## 4 测试实例 测量具体的水质前,需要调配各个浓度的亚硝酸钠标准溶液。先测量各标准浓度下显色反应的吸光度,将吸光度曲线校准。本人测试了4umol/L、2umol/L、1umol/L、0.8umol/L、0.4umol/L、0.2umol/L、0.1umol/L、0.0umol/L,共8个浓度标准溶液显色反应的标准吸光度,然后进行了曲线拟合。Matlab的拟合结果如下图: ![](https://cf04.ickimg.com/bbsimages/202206/82d4832d7215e0b22d075bafce93aa0d.jpg) 从图中的校准曲线可以看出,亚硝酸浓度与吸光度之间有非常好的线性关系。一方面表明测试方法原理的可靠,另一方面也表明测试仪器的精度达到设计预期,因为校准数据是仪器现场对4umol/L、2umol/L、1umol/L、0.8umol/L、0.4umol/L、0.2umol/L、0.1umol/L、0.0umol/L,共8个浓度标准溶液测试获得的。 把待测液体显色反应前后的吸收光强代入后,依次计算待测液体透光度、待测液体吸光度,然后待测液体吸光度代入入校准曲线,便得到待测液体的亚硝酸盐浓度为0.947umol/L。测量值在上图红色点中标出。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
xukejing
擅长:其他应用
关注
评论
(3)
登录后可评论,请
登录
或
注册
xukejing
25
天前...
磷酸盐检测校准曲线已更新。2022年7月2日更新了磷酸盐检测代码。并调配了各个浓度标准溶液测试了曲线。磷酸盐检测标准浓度曲线的线性回归系数R2为0.9950,略低于实验室专业仪器。 因为没有移液枪精确控制微量液体,在调标准溶液时按每3滴0.1mL稀释,稍微引入了一些实验误差。但总的来说,线性回归系数R2还是可以的。 磷酸盐标准浓度-吸光度校准曲线、磷酸盐检测代码都已更新到gitee项目中
1
回复
发布
xukejing
25
天前...
磷酸盐检测校准曲线已更新。2022年7月2日更新了磷酸盐检测代码。并调配了各个浓度标准溶液测试了曲线。磷酸盐检测标准浓度曲线的线性回归系数R2为0.9950,略低于实验室专业仪器。 因为没有移液枪精确控制微量液体,在调标准溶液时按每3滴0.1mL稀释,稍微引入了一些实验误差。但总的来说,线性回归系数R2还是可以的。 磷酸盐标准浓度-吸光度校准曲线、磷酸盐检测代码都已更新到gitee项目中
0
回复
发布
xukejing
25
天前...
2022年7月2日更新了磷酸盐检测代码,代码已上传gitee。
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交