[第3期 空气质量分析仪]第二周作业

发表在 实战入门学习营2019-10-23 21:24 [复制链接] 5 91

目标:1.完成温湿度应用给模块;2。完成PM2.5驱动
$ i8 A( o  `" D% H; x+ i9 D" ^2 v1 v7 }% e4 R0 x1 C& k5 n3 W. Q
1. SHT31
) n& g& T% F9 ~8 K: d' ^9 B    创建线程定时采集温湿度,同时每隔1秒钟左右打印到串口。/ y. L* \4 a: m- M) E/ ?; E
    temp_humi_th.c:这里包含了标准输入输出库的头文件“stdio.h”,因为用到了格式化浮点输出,rtt自带的sprintf函数没有添加格式化浮点输出的支持。
" J" d5 Y" s: m) [4 o
  1. #include "temp_humi_th.h"
    - Y5 g& N9 }3 {: O" s3 o& y# D
  2. #include <stdio.h>9 W2 R" N: l& K
  3. & _2 o1 S8 Y; N) k
  4. sht3x_device_t sht31_dev ;
    ! E2 ~: R; v! Y- p$ A. T8 V+ t5 S
  5. rt_thread_t thread_sht31 ;$ j( d* y! `4 a0 ^! ^
  6. float temperature, humidity ;2 `+ r5 a% h; Y$ ?" q
  7.   t8 c- h1 F0 J$ D( b
  8. void temp_humi_entry(void * parameter)  [' x3 o  P2 K9 W! p+ Z
  9. {
    ' A. A  _* k: r# W* P
  10.    
    * R$ p5 J: `, x% i1 e2 a/ [: A- O
  11.     char buffer[128] ;9 m; B: F0 P4 p5 `9 _
  12.     while(1)
      M4 O5 I. E4 q; X# L: X# J
  13.     {$ ]3 v) _- ^6 B% |7 c3 M
  14.         sht3x_read_singleshot_temperature_and_humidity(sht31_dev, &temperature, &humidity);
    7 \2 D7 n9 O; @
  15.         sprintf(buffer, "T:%0.2f H:%0.2f \n", temperature, humidity);
    ) P) w& M' S1 s9 }  A) v
  16.         // rt_snprintf(buffer, 128, "T:%0.2f H:%0.2f \n", temperature, humidity);
    4 D) j) ~0 X. m+ _2 R; s( z
  17.         rt_kprintf(buffer);
    5 I! \! I: a' t9 j$ M1 K# r* g
  18.         rt_thread_mdelay(5000);: h/ M, ?# N+ J/ ]
  19.     }& G4 C- a$ a+ |% K
  20. }
    4 O* a( j- V4 r' M" p4 g

  21. # ~3 s+ r6 P/ E+ K6 Z, r
  22. void temp_humi_init(void)
    / C) l' \9 I8 u
  23. {8 ~; P% M- r: n+ f# X" p
  24.     sht31_dev = sht3x_init("i2c1", SHT3X_ADDR_PD, SHT3X_REPETABILITY_MEDIUM);" {* O' W7 @- D% u8 U
  25.     thread_sht31 = rt_thread_create("SHT31", temp_humi_entry, RT_NULL, 1024, RT_THREAD_PRIORITY_MAX/2 - 2, 100);9 J9 @7 l4 P/ m
  26.     if(sht31_dev != RT_NULL && thread_sht31 != RT_NULL){
    * C+ G* {# Z. S/ T
  27.         rt_thread_startup(thread_sht31);6 r/ O! L6 c" x' ^; n
  28.     }
    5 c; B( H+ L! Q2 r! a
  29. }
复制代码
   temp_humi_th.h:包含了sht3x驱动,基于sht20的代码修改。
3 e9 }# P8 v/ [9 r# w& M
  1. #ifndef TEMP_HUMI_TH_H; @% u& }; H0 j  k3 l5 ^
  2. #define TEMP_HUMI_TH_H
    % l" @$ N& O7 h* b

  3. 0 z. t( l3 D  l+ P6 Y! H0 g& ]: f
  4. #include "sht3x.h". a; [/ U8 F1 _5 `' P2 r
  5. - u/ J; M# g4 s. Z
  6. void temp_humi_entry(void * parameter);3 Q  v% }6 c2 c- N9 }
  7. void temp_humi_init(void);
    , ?' Q- ~& K' ]

  8. & p3 t; m9 E# K1 J
  9. #endif
复制代码
2. PM25 颗粒传感器7 ^# Y. p( e1 h  K* l' x! Q
    严格来说,GP2Y这个模块不能算是PM2.5传感器,但是就这么用吧。这里需要提一下线程优先级,温湿度采集线程要比PM25采集线程优先级要高一点,不然会发生温湿度线程无法启动的问题。$ ?: r5 _* w& g6 E# N1 O
    我这边接线和标准的接线方式差了一个三极管,我这边寝室没有三极管,输出电压只有0.5V上下波动,也不知道是不是GP2Y传感器被我烧坏了,明天淘宝买点小电子零件包再试试看。1 r7 N: q! Z/ }( a& g$ f1 A
, X3 k+ ?) L% `2 N+ E4 a
  pm25_th.c
% b" s( ~0 G; P$ A
  1. #include "pm25_th.h"2 T! J0 U3 I# m# ?/ h* _$ d+ t
  2. #include "stdio.h"4 R( v$ F$ a* ^& [, d6 Z

  3. : y2 @; x2 `% H, ?
  4. rt_thread_t thread_pm25 ;: O; z: q. d' |6 [) q% _
  5. float pm25_voltage = 0.0f ;
    " ?; S# r6 R! v2 c5 E' F
  6. float pm25_density =0.0f ;7 K3 y0 O* ]$ W& C/ o- K2 Z
  7. , x% J% n0 p3 S; R; ^+ }
  8. void pm25_entry(void * parameters)" t3 `% {8 O0 O' I- ]: M
  9. {5 X0 ~; _0 s, H* y9 l2 H0 z: u' D) C
  10.     char buffer[128] ;8 X) @9 L# Q- J3 s& j
  11.     rt_uint16_t pm25_cnt ;" g3 w0 i) g8 b- y) ~/ R; _5 o! i+ ~
  12.     while(1)
    . O, F$ I8 h% R. T
  13.     {
    6 s+ a. L7 p2 Y/ |- f
  14.         pm25_density = gp2y_read_pm25(&pm25_voltage);
    1 g7 w: z4 {* }$ l! l% z* E" o
  15.         pm25_cnt ++ ;) m& E* s- p% R6 u" O
  16.         if(pm25_cnt >= 5000){9 ^3 G' v& e, \4 h1 t. g5 r+ \
  17.             pm25_cnt = 0 ;
    : f2 L) \6 V6 \5 s5 d$ U
  18.             sprintf(buffer, "PM2.5:\t%0.2f mg/m3 \t voltage: %0.5f V \n", pm25_density, pm25_voltage);4 X4 f  ^6 |3 q( ]/ l+ u- H
  19.             rt_kprintf(buffer);: Q6 A1 ~  Z) R  A' E6 P1 C
  20.         }
    5 i2 u+ O& S8 N; z+ g
  21.     }
    " s: D: W/ [: a1 h8 s, k5 k* n- W
  22. }' x' N6 I5 ]: S* t1 l
  23. , R$ B5 j% G2 P  U& D( i8 c
  24. void pm25_init(void)0 L7 y( y1 u% I6 K- M$ r+ E
  25. {
    ' n3 c7 S& x- D0 C" [5 g7 D
  26.     if( gp2y_hw_init() == RT_EOK){, o% R, w, \5 V+ G( t
  27.         thread_pm25 = rt_thread_create("PM2-5", pm25_entry, RT_NULL, 1024, RT_THREAD_PRIORITY_MAX/2 - 1, 1) ;
    : w  ]- u) V. `
  28.         if(thread_pm25 != RT_NULL){9 f0 |7 g% ?8 C6 D) e
  29.             rt_thread_startup( thread_pm25) ;
    + x- t+ ]7 F0 T7 a# x4 ]6 o
  30.         }5 i0 ^. _" I  z+ U
  31.     }! I& L! k9 R7 Q4 i
  32. }
复制代码
等零件到了,再看看SHT31的数据手册看能不能解决湿度100%的问题,目前(2019.10.23)实现效果如下。等搞定了再来更新。* W1 l4 A" f% E, F) {1 W& S$ L
微信图片_20191023212406.png
8 S% t" f3 n# m2 s2 {
- g/ L+ {! x; S/ q+ ^9 R9 C* e) d. g, e+ N
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-10-24 10:02:20 | 显示全部楼层
这里需要提一下线程优先级,温湿度采集线程要比PM25采集线程优先级要高一点,不然会发生温湿度线程无法启动的问题。

  L$ p. j+ p/ k* l4 @
5 L9 `' Q+ z/ p) m% \7 x$ J% k  a这个不应该哦
使用道具 举报 回复
发表于 2019-10-25 19:46:29 | 显示全部楼层
yangjie 发表于 2019-10-24 10:02
5 l) {) @1 i' O& G/ }9 H- V$ ^" V! [这个不应该哦
6 p5 X5 Y$ p9 w0 k+ z! n3 P' a. k
实际上是因为rt_hw_us_delay函数实际上是一直在干等着,并没有让出CPU,导致如果PM25线程优先级更高的话,那么温湿度线程就没办法执行了
使用道具 举报 回复
发表于 2019-10-26 09:15:34 | 显示全部楼层
韧明 发表于 2019-10-25 19:46* t) z- y/ J6 I7 g" N5 _# b
实际上是因为rt_hw_us_delay函数实际上是一直在干等着,并没有让出CPU,导致如果PM25线程优先级更高的话 ...

3 v" ]; k4 [- y# _获取完一次数据不应该让出一次吗
使用道具 举报 回复
发表于 2019-10-26 09:52:08 | 显示全部楼层
yangjie 发表于 2019-10-26 09:15
3 }5 Y8 k8 a" r+ b/ ~; n获取完一次数据不应该让出一次吗

( p/ ?) B! ]( P1 M我没有让出,所以会有这种问题,应该再加入延时让出的
使用道具 举报 回复
发表于 2019-10-26 11:35:09 | 显示全部楼层
韧明 发表于 2019-10-26 09:526 b4 m. z. V+ U6 x: G8 E( F
我没有让出,所以会有这种问题,应该再加入延时让出的
, a. C4 C8 \: W6 B# ~  a. |2 r/ N( q
对的对的
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表