嫌弃网上卖的甲醛测量仪太坑 (贵) (其实几个DIY的性价比还不错) ,夸下海口说要自己做个甲醛测量仪,没想到母上信以为真,日夜催促。可恶,没办法了,只能动手了! 传感器:DART WZ-S
板子:stm32f103c8t6 最小系统版
显示:I2C OLED屏

总价约80+10+10,只要100啊朋友们,做到就是赚到(我不信)

【传感器】

使用的传感器是号称最好的甲醛传感器,英国DART公司的WZ-S。淘宝80RMB左右可得到,有白色和黑色款,似乎差别不大。直接串口通信,非常方便,就是官方给的资料说得太不清楚了,尤其是最终数据的单位(现在可能也没搞清楚(不是))。 其串口通信可选主动上传和问答式,因为懒,直接用了默认的主动上传式。波特率为9600,1s传输9个十六进制数。

其中第一位为初始位0xFF,最后一位为校验值。
校验方法为:将图中[1,7]号数据相加后取反加一 (~sum+0x01)
所需要的数值为4、5号数据。
公式如图中所示,计算得到的数值*1000单位为ppb。
(如果不是, PLLLLLLLZ let me know!!)

【IDE】

用的IDE是Aduino,只需下载stmduino库+stlink即可直接用Arduino的语法写stm32,非常方便(懒惰 )。

【stm32f103c8t6】

用的板子是stm32f103c8t6最小系统板,正好身边有,就拿来用了,针脚如下。 使用该板子的注意事项是:在连接stlink下程序时,务必将boot0跳针移到1处(否则下不进去),下完若需断电移回0处(否则不会保存)。 (该属性令我和我的小伙伴们练就了惊人的插拔跳线手速(不是))。
这次用到了一组I2C接口(SCL: PB6 , SDA: PB7)和一组串口 (TX: PA9, RX: PA10)。(好浪费)

【I2C OLED】

直接用u8g2lib库,非常好用的,网上有很多教程。 但是由于是用Arduino的IDE写stm32,会提示上传失败,有一个小坑
(小伙伴在github找到的解决办法) 需在文档开头添加如下代码:

#ifdef strlen_P
#undef strlcpy_P
#endif
#define strlcpy_P(s1, s2, n) strlcpy((s1), (s2), (n))#ifdef strlen_P
#undef strlen_P
#endif
#define strlen_P(a) strlen((a))#define strnlen_P(s, n) strnlen((s), (n))
#define strncmp_P(s1, s2, n) strncmp((s1), (s2), (n))
#define strncasecmp_P(s1, s2, n) strncasecmp((s1), (s2), (n))
#define strncat_P(s1, s2, n) strncat((s1), (s2), (n))
#define strncpy_P(s1, s2, n) strncpy((s1), (s2), (n))
#define strpbrk_P(s, accept) strpbrk((s), (accept))
#define strrchr_P(s, c) strrchr((s), (c))
#define strsep_P(sp, delim) strsep((sp), (delim))
#define strspn_P(s, accept) strspn((s), (accept))
#define strstr_P(a, b) strstr((a), (b))
#define strtok_P(s, delim) strtok((s), (delim))
#define strtok_rP(s, delim, last) strtok((s), (delim), (last))

【接线】

随便接(不是)
OLED和WZ-S的VCC和GND分别接stm32的5V、GND(啊你这不是废话吗(少废话))

OLED : SCL—>PB6, SCA—>PB7 (细心的朋友可能会问,I2C不是要上拉电阻吗,但实测只挂一个OLED没问题(懒))
WZ-S: TX—>PA10,RX—>PA9 (诸位,串口要Rx接Tx,Tx接Rx(语重心长(你废话怎么这么多))

直接拿充电宝接MicroUSB口5V供电了,所以没有别的接线了,真的没有了。

【代码】

全部代码如下:

#ifdef strlen_P
#undef strlcpy_P
#endif
#define strlcpy_P(s1, s2, n) strlcpy((s1), (s2), (n))#ifdef strlen_P
#undef strlen_P
#endif
#define strlen_P(a) strlen((a))#define strnlen_P(s, n) strnlen((s), (n))
#define strncmp_P(s1, s2, n) strncmp((s1), (s2), (n))
#define strncasecmp_P(s1, s2, n) strncasecmp((s1), (s2), (n))
#define strncat_P(s1, s2, n) strncat((s1), (s2), (n))
#define strncpy_P(s1, s2, n) strncpy((s1), (s2), (n))
#define strpbrk_P(s, accept) strpbrk((s), (accept))
#define strrchr_P(s, c) strrchr((s), (c))
#define strsep_P(sp, delim) strsep((sp), (delim))
#define strspn_P(s, accept) strspn((s), (accept))
#define strstr_P(a, b) strstr((a), (b))
#define strtok_P(s, delim) strtok((s), (delim))
#define strtok_rP(s, delim, last) strtok((s), (delim), (last))//以上是上述u8g2库在stmduino下需要加的内容#include <U8g2lib.h>
#include "Wire.h"
#include "String.h"U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/ PB6, /* data=*/ PB7, /* reset=*/ U8X8_PIN_NONE);
//此处接线可更改,需找有I2C功能的口void setup() {pinMode(PC13,OUTPUT);//初始化指示灯digitalWrite(PC13, HIGH);//初始化指示灯Serial1.begin(9600);//TX=PA9,RX=PA10,这两个口是stm32f103c的Serial1(共有3个)u8g2.begin();u8g2.enableUTF8Print();//初始化oled}unsigned char DEC1,DEC2;      //用于记录第4、5位数据
char CheckSum;                //用于和校验位比对
float Val;                    //最终结果
int val;                      //未除1000
String comdata = "";          //用于记录完整数据
int sig_s = 0;                //记录是否开始记录完整数据
char temp;                    //用以存储每个十六进制数
int temp_i = 0;               //用以记录是第几个数据void loop() {u8g2.setFont(u8g2_font_10x20_tf);u8g2.setFontDirection(0);u8g2.clearBuffer();//设置OLED字体、方向while(Serial1.available()>0){delay(2);if(sig_s == 0){temp = (Serial1.read());if(temp != 0xFF){continue;}else{sig_s = 1;comdata = "";comdata+=temp;temp_i = 1;}}//当串口缓冲区有数据,持续读指到读到起始位0xFFelse if(sig_s == 1){temp = (Serial1.read());comdata+=temp;temp_i ++;if(temp_i == 9){sig_s = 0;break;}}//读到0xFF后持续记录接下来的8位数据}if( temp_i == 9 ){temp_i = 0;CheckSum=0x00;for(int x=1;x<8;x++){CheckSum+=comdata[x];   //计算校验和}CheckSum=~(CheckSum)+1;  //取反加一if(comdata[8]==CheckSum){digitalWrite(PC13,LOW);  DEC1=comdata[4];DEC2=comdata[5];int val=DEC1*256+DEC2;Val=val/1000.0;}delay(10);digitalWrite(PC13,HIGH); u8g2.clearBuffer();u8g2.setCursor(5, 20);u8g2.print("HCHO:");u8g2.setCursor(40, 43);u8g2.print(Val,3);u8g2.setCursor(92, 56);u8g2.setFont(u8g2_font_6x13_tf);u8g2.print("ppb");u8g2.sendBuffer();}
}

【使用注意事项】

1、WZ-S传感器需要启动时间,需等度数稳定,时间约为20~30s(说明书说小于3min)。
2、不要连接STLINK时接5V充电宝电源。
3、不要在连接220V笔记本电源时下板子,容易被电。(可恶啊!)
4、若下程序后没反应或接充电宝OLED不亮,请检查Boot0跳线位置。(可恶!!!)
5、若需重启,需在Boot1跳线在0位置下按RESET
6、用Arduino IDE时,看清所选的板子(stm32f103c)、下载方式(STLINK)、所用USB口
7、【重要!!】如果试了,告诉我单位究竟是什么

甲醛测量仪 DART WZ-S + stm32f103c + stmDuino IDE + I2C OLED相关推荐

  1. C语言 | 基于卡尔曼滤波器的角度测量仪(MPU6050)

    ========================================== 博主github:https://github.com/MichaelBeechan 博主CSDN:https:/ ...

  2. 测量仪图片_南昌高度仪价格,大行程非标影像测量仪组装

    精点测量技术(东莞)有限公司为您详细解读AErRAj南昌高度仪价格的相关知识与详情,二次元影像丈量仪(别名影像式测绘仪)是成立正在CCD数位影像的根底上,依托于计较机屏幕丈量技术和空间几何运算的强大软 ...

  3. c语言excel转pdf,基于C语言和Excel软件下光速测量仪测量玻璃折射率.pdf

    基于C语言和Excel软件下光速测量仪测量玻璃折射率.pdf 基于语言和 软件下光速测量仪测量玻璃折射率 朱承君 王奇峰 芦立娟 张艳春 ( 浙江海洋学院机电学院 浙江 舟山 ) ( 收稿日期 ) 摘 ...

  4. 什么是激光扫描测量仪

    检测是保证产品质量的最重要的手段.几何尺寸往往是产品中最主要的测量参数,特别是机械加工零件,用挤压.冷热轧.拔丝等工艺加工的型材等的几何尺寸更要加以检测.按传统的接触式测量方法对精密加工零件或细小零件 ...

  5. android测距传感器,测距测量仪(专业测量软件)

    测距测量仪(专业测量软件)是一款手机精准测量仪器,能够随时测量物体的高度和距离,实用工具,一键即可测量,使用方法简单,拥有相机测距.实景测量和实景量角器等功能,功能多样化,可以选择不同工具使用,操作方 ...

  6. 测试地图长度和高度软件,‎App Store 上的“海拔测量仪-集指南针和GPS实时高度测距仪二合一”...

    海拔测量仪是一款外出旅游.户外达人必备的APP,拥有非常强大和准确的GPS定位功能,让你以最快的速度准确实时的获取到当前位置的的海拔.GPS位置.气压.经纬度坐标等信息,并且还内置指南针功能,这将是您 ...

  7. 北斗系统海拔高度测试软件,GPS海拔测量仪手机版

    GPS海拔测量仪,GPS海拔测量仪手机版,手机上的GPS测量仪工具,需要手机具备相关的定位功能,获取定位权限后,会根据用户的当前位置来识别海拔高度,进行地图导航,同时还有指南针和天气预报服务,全方位保 ...

  8. 工业相机测量仪毛管测量直径与长度值

    图像法测量仪采用工业相机远距离拍照和图像处理的测量方式在穿孔机出口测量直径和长度,并根据输入重量和测量尺寸计算钢管壁厚尺寸. 直径相机的布置形式 本方案中,被测毛管外径范围为φ220-450mm,测量 ...

  9. 多功能无线测量仪的设计与制作

    目录 第一章 绪论 1 1.1设计目的及意义 1 1.2课题的概述 1 1.3设计的主要内容介绍 1 第二章 多功能无线测量工作原理的介绍 2 2.1 AT89C51单片机介绍 2 2.2 多功能无线 ...

  10. CASAIM全自动3d测量仪自动检测差速器差壳全尺寸测量装配检测

    随着汽车行业的新变化,汽车零部件行业也呈现出新的发展趋势.汽车零部件产品作为汽车制造业的配套产业,发展也十分迅速. 差速器作为汽车关键零部件,由差速器差壳.行星齿轮.半轴齿轮.半轴和行星齿轮轴组装而成 ...

最新文章

  1. ASPXspy 2.0
  2. 在Eclipse中写第一个hibernate小例子
  3. 十三、写了两年多Python文章的我,带你走进Python数据分析
  4. 【栈】【20. 有效的括号】【简单】
  5. 应用深度学习使用 Tensorflow 对音频进行分类
  6. BootLoader与Linux内核的参数传递
  7. Bootstrap-分页插件Paginator
  8. Android Design 1: Back键和Up键在App导航中的表现
  9. Hyper-V 之04 SCVMM 2012 R2安装
  10. 学习笔记_Java_day12_Cookie
  11. Matlab-Simulink文件类型总结
  12. PostgreSQL 修改数据库用户的密码
  13. 金融行业数据仓库分层
  14. KATEX公式编辑器符号大全-CSDN的Mardown公式支持
  15. 计算机进去bios方式,各种电脑进入BIOS方法汇总|进入bios的方法大全
  16. java int过长_java - 为什么长,不是int否则限制时间超过 - SO中文参考 - www.soinside.com...
  17. RC低通滤波器截止频率公式推导
  18. 上传文件到到大数据平台
  19. python opencv手势识别_OpenCV+Python3.5 简易手势识别的实现
  20. 微信公众平台 微接口 接口100 API100 接口大全(转) 开发微信功能简便了

热门文章

  1. 电脑计算机 回收站隐藏文件,怎么隐藏电脑桌面回收站
  2. 【UE4】 自定义编辑器的放置Actor窗口
  3. KVM虚拟化进阶--KVM设备高级管理
  4. LU分解解线性方程组python实现
  5. Beamer中数学符号字体
  6. 最适合晚上睡不着看的 7 个网站,建议收藏哦
  7. 短网址防封的原理是什么?
  8. 统计学复习笔记(三)—— 置信区间(总体均值/比例/方差,总体均值之差/比例之差/方差之比)
  9. Virtual KD 出现 Still cannot find RPC dispatcher table 无法连接
  10. android的sd卡分区,超强Android系统SD卡分区教程!