物联网  >   传感器  >  正文

用氧传感器DIY废物氧分析仪

  红牛按:该文为“豆腐和她的朋友们”系列的第四篇文章。作者“cysoft”利用CCR使用中最“昂贵”的消耗品做了一个氧气分析仪。随本文一同回顾了豆腐的《潜水是一门科学之氧气》系列文章。

  我最早对于潜水气体的认知来自于豆腐的几篇对于气体的科普文章。最为让我受益的就是那篇深入浅出讲解M值的文章。和豆腐熟络以后,更是可以放开去问各种想不明白的问题,她总是能用大白话把那些晦涩难懂的问题讲的明白透彻。

  碰巧,海军给我了几个JJCCR更换下来的氧传感器,于是决定自己动手做一个氧分析仪,一来是废物利用,二来是希望通过这个实验性的项目解决潜水方面的一些“小问题”。于我而言,发表在豆腐专栏更是希望让豆腐的分享精神延续下去。

  

 

  

 

  氧分析仪大概是学了高氧气以后,潜水用的最多的一个小物件。在售氧分析仪基本上都是当作耗材使用,一次更换的成本动辄上千元。

  由于氧分析仪的核心部件是氧气传感器,这种脆弱而敏感的器件本质上就是一个化学电池,因此无论你买回来的氧分析仪用或者不用,一般一段时间后就就会出现性能衰减以及测量不准的问题。有些厂家的产品设计是一体的,用户不能更换氧传感器,当传感器衰减或者失效的时候,也就意味着整台机器就报废了。

  

  (JJ-CCR)

  氧传感器的问题同样也困扰着CCR潜水员。一台CCR至少需要3个氧气传感器,对于这部分传感器而言,除了实际的元件特性,厂家和组织还有一些硬性的要求,例如一次需要3个同时更换,而更换的时间则是从传感器出厂后一年算起(并非从你安装到CCR上算起)。

  从元器件的特性上而言,尽管已经到使用年限,未必代表已经不能使用(如何验证氧气传感器的依旧能够工作,我在后面会介绍)。因此从这个角度出发,我决定利用这些淘汰下来的JJCCR的氧传感器做一个方便使用的氧分析仪。

  设计目标

  1.因为是废物利用,因此基础设计必须支持自行更换氧传感器。

  2.基于传感器是化学电池的特性,这类原件时常发生读数的漂移,而传统产品为了解决这个问题设计了一个旋钮来调整偏移量。我的设想是让这个过程尽可能简单,因此我在系统启动的时候自己校准的当前的读数,当发生读数偏移的时候,只需要静置再开机就完成校准。

  3.在机器启动阶段,可以直观的显示传感器电压读数。这样做可以帮助JJCCR用户在不需要连接CCR控制器的情况下得到电压值,同时提供更为精确读数。(小数点后4位)

  4.自动计算MOD,这个算是一个创新,省了数学不好的同学想不起来公式(尽管记不住公式很不应该)也省了大家测好气以后到处借手机算。目前的设计是直接显示PPO2:1.2/1.4/1.6分别对应的MOD,适合休闲高氧潜水员和技术潜水员。

  5.为了方便的取电,设计成一个使用Micro USB的接口,用充电宝就能供电。

  

 

  准备工作及所需材料

  项目用到的代码,原理图,以及PCB设计都,我都发布到了在GitHub:github点com/mscy/O2Reader这里简单介绍一下元器件的选择和使用。

  1.当然首先你需要能搞到废弃的JJCCR使用氧传感器,或者土豪去买一个新的。

  2.MCU使用了ATmega328,这种基于AVR构架的系统被广泛的应用到了Arduino体系。综合考虑了整体应用的周边,实现后的体积以及功耗,直接选择使用最小系统板Arduino NANO开发板。

  3.ADC的的精度直接决定了采样的解析读,同时氧传感器的输出一般再10mV。因此比较合适的是Texas Instruments ADS1115,这款ADC有16bit的解析力,I2C接口以及参考电压可以直接从MCU拿到(3.3v).设置合适的PGA后量程刚好合适JJCCR使用的氧气传感器。同时为了方便焊接,我也选择了半成品转接板。

  4.JJCCR氧传感器的接口是标准的接插件,AD上的封装尺寸就是SMC标准的尺寸。

  5.转接板的PCB已经分享到了GitHub上。

  6.一块I2C接口的OLED屏幕。

  

 

  开发环境准备

  1.你需要一个最小量程在0.01mV的万用表。用来测量传感器的读数和验证ADC的读数。

  2.安装Arduino Studio,或者使用Visual Studio Code配合Arduino extension。个人觉得VSCode的开发体验是好过Arduino Studio几条街,但是对于有些开发板而言upload的兼容性有些差。折衷的方法是在VSCode里面编程,在Arduino Studio里面编译烧写。

  3.在验证阶段,包括程序和硬件的调试,你需要一个面包板和一些跳线连接各个组件。

  有关JJ-CCR氧气传感器

  如果说CCR技术需要有长足的进步,那么首先仰仗的就是氧传感器技术的发展。这话一点都不过分,现在广泛使用的化学电池形式的氧传感器,不但元器件寿命直接和它暴露再氧环境的浓度有关,而且它的输出和温度等环境因素也有直接的关系。

  尽管传感器内部使用了补偿电路去修正,但是输出的漂移依然非常明显,这就是为什么现很多氧分析仪都专门设计一个电位器去人为的修正读数。

  

 

  因为要深入的解读和换算最终的氧含量,所以我们必须把这个传感器的参数搞明白,下面我们列出一些主要的信息:

  基准电压说明:由下表可知,新的氧传感器再出场测试的时候在0.96ata的大气压下,输出电压是11.52mV。但是实际情况是我们拿到的传感器都是使用了一年以上的器件,因此对比过5个不同年份的替换下来的传感器后发现,这些“退役”的传感器大多也能具有8mV-11mV的输出。

  

 

  限流系数:限流系数等于100%(纯氧)/21%(空气中氧气浓度)=4.76。假设在一个大气压下的空气中测的氧气传感器的读数乘以4.76,得到的这个电压值就是在一个大气压纯氧中测得得电压值。有了个系数我们就可以计算出一个“斜率”,使用这个数值就可以得到当前测量值对应得氧含量。

  程序设计

  这部分的内容对于从未写过code的朋友有点门槛,但是作为完整的DIY手册我还是应该把这个事儿说明白,至于如果您真的想用这里的材料去实现一个氧分析仪,私信和我讨论。另外,亲测可用的code已经发布在了Github上,如果电路部分ok,编译烧写到MCU里就能用。

  

 

  整体的程序结构,主要就是上图描述的三个部分,下面我分别介绍一下我的思路。

  初始化

  初始化部分主要是针对MCU所连接的I2C设备经行设置。因为I2C在建立link的时候需要声明地址因此需要确认你实际的电路是不是对应到程序里的地址。本例中ADC和OLED使用了同一个I2C控制器。

  为了简化OLED的操作我使用了U8g2lib,如果你也使用这个类库处理显示,但是使用了别的型号的OLED,那么需要根据他们的官方文档调正定义。

  此外,由于我们选用的ADS1115是具有多段量程的ADC,因此我们需要在这个阶段设置PGA的参数,从而可以获得正确的量程:

  ads.setGain(GAIN_SIXTEEN) ; //PGA set here

  同时在读取ADC的读数以后,需要根据PGA的设置值换算成测量值:

  float getScenorReading()

  {

  int adc0 = ads.getLastConversionResults();

  float intData = adc0 * 1; //Covert PGA ratio

  return intData;

  }

  稳定阶段

  这个过程主要是用来初始化传感器的基准读数以及顺手先显示一下当前的传感器的电压。(记得我在文章一开始的设计嘛??)。这里通过使用系数4.76去计算期望纯氧的读数,同时计算斜率。

  //Slope is calculated

  float getKVal()

  {

  float fKval = 0;

  fKval = (100- 21) / (fMaxExptectedVal - fInitReading);

  returnfKval;

  }

  有了斜率,将来就可以以这个为基准去测试读数对应的氧含量了。另外,记得我之前说过这个设计是不需要校准读数的嘛?意思是如果发现读数不准或者偏差比较大,那么只要断开电源,在空气中静置一下氧传感器,再次启动程序的时候这段代码会重新计算斜率,这就代替了摆弄那个小旋钮的过程,省时省力:)

  前面我讲过,氧探头是一个非常敏感而且不稳定的组件,在实际测量过程中,你会发现在相同的环境下两次通过ADC得到数值会有一个比较大的差别。因此我们需要在这里使用程序经行滤波处理从而平滑读数。有关滤波的方法有很多,常用的是使用几次读数取加权平均或者取一个奇数的序列,对这个序列排序,取中间值。无论那种方法,代码中的滤波逻辑可以给你带来更稳定的读数。

  测量阶段

  完成前面的两个阶段以后,程序就进入了Main Loop,这里主要做的工作就是读出电压值,使用之前计算的斜率计算出当前电压对应的氧含量:当前电压值*斜率。

  接下来就是计算各个分压下的MOD,并且把这些信息显示在OLED上。

  

 

  硬件实现以及BOM

  整个电路的实现就是按照下面的原理图搭建,你可以用面包板测试。如果测试没有问题,可以参考我的PCB再做一个转接板。

  

 

  本应用所需要的全部材料,我列在这里。方便各位看官买买买:

  

名称

描述

数量

MCU

Arduino Nano,主控板

1

ADS1115

模数转换模块。推荐使用成品模块

1

OLED

1.3英寸OLED I2C接口,控制器是SH1106

1

PCB

PCB线路板,可以去Github上下载

1

排线

4pin的排线,用于连接OLEDPCB

1

SMB接口

SMB接口用来连接传感器的接插件

1

O2 Sensor

JJCCR的氧气传感器

1

USB线

Micro USB。供电和烧写程序

1

壳子

我也不在行,你可以自己看着办。我的是请朋友3d打印的,大致设计放在了Github上。

1 

  壳子我也不在行,你可以自己看着办。我的是请朋友3d打印的,大致设计放在了Github上。1

  如果你觉得这个小东西好玩又能帮到你,欢迎分享给有用的朋友。人生在于折腾,不试试谁知道行不行呢?

  

上一篇:MASIMO传感器连接杆基本构造、清洗方法及注意事项

下一篇:美的电饭煲烧水加热显示E-故障之温度传感器维修